[Course][Udemy][Gourav Shah] Ultimate DevOps to MLOps Bootcamp - Build ML CI-CD Pipelines [ENG, 2025] : 07. Setting up MLOps CI Workflow with GitHub Actions
Делаю:
2025.12.29
04. Writing an executung out first GitHub Actions Workflow
hub.docker.com -> Login -> Account Settings -> Personal access tokens -> Generate new token
https://app.docker.com/accounts/webmakaka/settings/personal-access-tokens
Description: github-webmakaka
Expiration date: none
Optional: Read & Write
Generate, Скопировать токен.
Github -> Repo -> house-price-predictor -> Settings -> Secrets and variables -> Actions -> Variables -> Repostitory variables -> New repository variable
https://github.com/webmakaka/house-price-predictor/settings/variables/actions
DOCKERHUB_USERNAME
Secrets -> New repository secret
DOCKERHUB_TOKEN
// Создаю Dockerfile streamlit_app/Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY app.py requirements.txt .
RUN pip install -r requirements.txt
EXPOSE 8501
CMD [ "streamlit", "run", "app.py", "--server.address=0.0.0.0" ]
$ vi .github/workflows/streamlit-ci.yaml
name: Streamlit CI
on:
push:
paths:
- 'streamlit_app/**'
workflow_dispatch:
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to DockerHub Container Registry
uses: docker/login-action@v3
with:
registry: docker.io
username: $
password: $
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: ./streamlit_app
push: true
tags: docker.io/$/streamlit:latest
https://github.com/webmakaka/house-price-predictor/actions
// OK! RUN PIPELINE
configs/model_config.yaml
model:
best_model: GradientBoosting
feature_sets:
rfe:
- '0'
- '1'
- '2'
- '3'
- '4'
- '5'
- '9'
- '10'
- '13'
- '14'
mae: 12310.638379356631
name: house_price_model
parameters:
alpha: 0.9
ccp_alpha: 0.0
criterion: friedman_mse
init: null
learning_rate: 0.1
loss: squared_error
max_depth: 3
max_features: null
max_leaf_nodes: null
min_impurity_decrease: 0.0
min_samples_leaf: 1
min_samples_split: 2
min_weight_fraction_leaf: 0.0
n_estimators: 100
n_iter_no_change: null
random_state: null
subsample: 1.0
tol: 0.0001
validation_fraction: 0.1
verbose: 0
warm_start: false
r2_score: 0.9937776455685025
target_variable: price
// Создаю Dockerfile Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY src/api/ .
RUN pip install -r requirements.txt
COPY models/trained/*.pkl models/trained/
EXPOSE 8000
CMD [ "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000" ]
$ vi .github/workflows/mlops-pipeline.yml
name: MLOps Pipeline
on:
push:
branches: [main]
tags: ['v*.*.*']
pull_request:
branches: [main]
jobs:
data-processing:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Process data
run: |
python src/data/run_processing.py --input data/raw/house_data.csv --output data/processed/cleaned_house_data.csv
- name: Engineer features
run: |
python src/features/engineer.py --input data/processed/cleaned_house_data.csv --output data/processed/featured_house_data.csv --preprocessor models/trained/preprocessor.pkl
- name: Upload processed data
uses: actions/upload-artifact@v4
with:
name: processed-data
path: data/processed/featured_house_data.csv
- name: Upload preprocessor
uses: actions/upload-artifact@v4
with:
name: preprocessor
path: models/trained/preprocessor.pkl
model-training:
needs: data-processing
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Download processed data
uses: actions/download-artifact@v4
with:
name: processed-data
path: data/processed/
- name: Set up MLflow
run: |
docker pull ghcr.io/mlflow/mlflow:latest
docker run -d -p 5000:5000 --name mlflow-server ghcr.io/mlflow/mlflow:latest mlflow server --host 0.0.0.0 --backend-store-uri sqlite:///mlflow.db
- name: Wait for MLflow to start
run: |
for i in {1..10}; do
curl -f http://localhost:5000/health || sleep 5;
done
- name: Train model
run: |
mkdir -p models
python src/models/train_model.py --config configs/model_config.yaml --data data/processed/featured_house_data.csv --models-dir models --mlflow-tracking-uri http://localhost:5000
- name: Upload trained model
uses: actions/upload-artifact@v4
with:
name: trained-model
path: models/
- name: Clean up MLflow
run: |
docker stop mlflow-server || true
docker rm mlflow-server || true
build-and-publish:
needs: model-training
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Download trained model
uses: actions/download-artifact@v4
with:
name: trained-model
path: models/
- name: Download preprocessor
uses: actions/download-artifact@v4
with:
name: preprocessor
path: models/trained/
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to DockerHub Container Registry
uses: docker/login-action@v3
with:
registry: docker.io
username: $
password: $
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: docker.io/$/house-price-model:latest