Skip to content

Commit 0dd5654

Browse files
Merge pull request #7 from ahmed-n-abdeltwab/feature/make-modular
fix: artifact generation and CI pipeline
2 parents e19dd9c + c86f2b1 commit 0dd5654

File tree

6 files changed

+1303
-162
lines changed

6 files changed

+1303
-162
lines changed

.github/workflows/train_and_release.yml

+16-12
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,38 @@ jobs:
3535
run: sudo apt-get install -y jq
3636

3737
- name: Build Docker image
38-
run: docker build -t $DOCKER_IMAGE .
38+
run: |
39+
docker build -t $DOCKER_IMAGE .
40+
docker images
3941
4042
- name: Run training pipeline
4143
run: |
42-
mkdir -p ./$RELEASE_DIR
44+
mkdir -p ./$RELEASE_DIR/latest
4345
docker run --rm \
4446
-v $(pwd)/data:/app/data \
4547
-v $(pwd)/models:/app/models \
46-
-v $(pwd)/$RELEASE_DIR:/app/$RELEASE_DIR \
48+
-v $(pwd)/$RELEASE_DIR:/app/release \
4749
$DOCKER_IMAGE
4850
4951
- name: Verify artifacts
5052
run: |
5153
echo "Generated artifacts:"
5254
ls -lR ./$RELEASE_DIR
53-
[ -f ./$RELEASE_DIR/latest/model.pkl ] || exit 1
54-
[ -f ./$RELEASE_DIR/latest/metadata.json ] || exit 1
55+
if [ ! -f ./$RELEASE_DIR/latest/model.pkl ]; then
56+
echo "Error: model.pkl not found!"
57+
docker logs $(docker ps -lq) || true
58+
exit 1
59+
fi
60+
if [ ! -f ./$RELEASE_DIR/latest/metadata.json ]; then
61+
echo "Error: metadata.json not found!"
62+
exit 1
63+
fi
5564
5665
- name: Create release package
5766
run: |
5867
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
5968
RELEASE_NAME="model_$TIMESTAMP"
60-
mkdir -p ./$RELEASE_DIR/$RELEASE_NAME
61-
cp -r ./$RELEASE_DIR/latest/* ./$RELEASE_DIR/$RELEASE_NAME/
62-
tar -czvf ./$RELEASE_DIR/$RELEASE_NAME.tar.gz -C ./$RELEASE_DIR/$RELEASE_NAME .
69+
tar -czvf ./$RELEASE_DIR/$RELEASE_NAME.tar.gz -C ./$RELEASE_DIR/latest .
6370
6471
- name: Upload artifact
6572
uses: actions/upload-artifact@v4
@@ -76,9 +83,6 @@ jobs:
7683
Automated model training results:
7784
- Model: $(jq -r '.model_type' ./$RELEASE_DIR/latest/metadata.json)
7885
- Timestamp: $(jq -r '.timestamp' ./$RELEASE_DIR/latest/metadata.json)
79-
- Metrics:
80-
Accuracy: $(jq -r '.metrics.accuracy' ./$RELEASE_DIR/latest/metrics.json)
81-
F1 Score: $(jq -r '.metrics.f1' ./$RELEASE_DIR/latest/metrics.json)
8286
files: ./$RELEASE_DIR/*.tar.gz
8387
env:
84-
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
88+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Dockerfile

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# ========== BUILD STAGE ==========
2-
FROM python:3.9 AS builder
2+
FROM python:3.9-slim AS builder
33

44
WORKDIR /app
55

@@ -16,31 +16,31 @@ ENV PATH="/opt/venv/bin:$PATH"
1616
COPY requirements.txt .
1717
RUN pip install --no-cache-dir -r requirements.txt
1818

19-
2019
# ========== RUNTIME STAGE ==========
2120
FROM python:3.9-slim
2221

23-
ENV PYTHONPATH=/app
22+
# Create directory structure with proper permissions
23+
RUN mkdir -p /app && \
24+
mkdir -p /app/data && \
25+
mkdir -p /app/models && \
26+
mkdir -p /app/release && \
27+
chmod -R 777 /app
2428

2529
# Create non-root user
2630
RUN useradd -m appuser && \
27-
mkdir -p /app && \
28-
chown appuser:appuser /app
31+
chown -R appuser:appuser /app
2932

3033
WORKDIR /app
3134
USER appuser
3235

3336
# Copy virtual environment
34-
COPY --from=builder /opt/venv /opt/venv
37+
COPY --from=builder --chown=appuser:appuser /opt/venv /opt/venv
3538
ENV PATH="/opt/venv/bin:$PATH"
3639

3740
# Copy application files
3841
COPY --chown=appuser:appuser src/ ./src/
3942
COPY --chown=appuser:appuser config/ ./config/
4043

41-
# Create data directories
42-
RUN mkdir -p data/raw data/processed models/saved release
43-
4444
# Health check
4545
HEALTHCHECK --interval=30s --timeout=10s \
4646
CMD python -c "import sys; sys.exit(0)"

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ pandas==1.5.3
22
numpy==1.23.5
33
scikit-learn==1.2.2
44
PyYAML==6.0
5+
python-dotenv==0.19.0 # For environment variables

0 commit comments

Comments
 (0)