1- name : CI-CD
2-
3- on :
4- push :
5- branches :
6- - development
7- - main
8- pull_request :
9- branches :
10- - development
11- - main
1+ name : Build-Deploy
2+
3+ on : workflow_dispatch
124
135env :
14- PROJECT_NAME : wine-quality
6+ PROJECT_NAME : employee-attrition
157
168jobs :
179 build :
@@ -31,45 +23,35 @@ jobs:
3123 with :
3224 creds : ${{ secrets.AZURE_CREDENTIALS }}
3325
34- - name : Setup python environment
35- uses : conda-incubator/setup-miniconda@v2
26+ - uses : actions/setup-python@v2
3627 with :
37- activate-environment : ${{ env.PROJECT_NAME }}_env
38- environment-file : service/environment.yaml
3928 python-version : 3.8
40- auto-activate-base : false
29+ cache : pip
30+ - run : pip install -r service/requirements.txt
4131
4232 - name : Set databricks host environment variables
4333 run : |
4434 echo "MLFLOW_TRACKING_URI=databricks" >> $GITHUB_ENV
4535 echo "DATABRICKS_HOST=${{ secrets.DATABRICKS_HOST }}" >> $GITHUB_ENV
4636 echo "DATABRICKS_TOKEN=${{ secrets.DATABRICKS_TOKEN }}" >> $GITHUB_ENV
4737
48- - name : Set artifact URI environment variables
38+ - name : Set artifact model environment variables
4939 run : |
50- echo "PREDICTION_MODEL_ARTIFACT_URI=$(jq --raw-output .prediction_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
51- echo "DRIFT_MODEL_ARTIFACT_URI=$(jq --raw-output .drift_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
52- echo "OUTLIER_MODEL_ARTIFACT_URI=$(jq --raw-output .outlier_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
40+ echo "MODEL_NAME=$(jq --raw-output .model_name service/configuration.json)" >> $GITHUB_ENV
41+ echo "MODEL_VERSION=$(jq --raw-output .model_version service/configuration.json)" >> $GITHUB_ENV
5342
54- - name : Package model service
43+ - name : Download model artifact
5544 run : |
56- # Download model artifacts from databricks
57- PREDICTION_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $PREDICTION_MODEL_ARTIFACT_URI)
58- DRIFT_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $DRIFT_MODEL_ARTIFACT_URI)
59- OUTLIER_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $OUTLIER_MODEL_ARTIFACT_URI)
60-
61- # Create directory for model package
62- mkdir -p artifacts/model_package
45+ # Get model artifact uri
46+ MODEL_ARTIFACT_URI=$(curl -X GET -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/get-download-uri -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'"}' | jq ".artifact_uri" --raw-output)
6347
64- # Package model as webservice with bentoml
65- python3 service/package_model_service.py \
66- --mlflow-prediction-model-artifiact-path $PREDICTION_MODEL_ARTIFACT_URI \
67- --mlflow-drift-model-artifiact-path $DRIFT_MODEL_ARTIFACT_URI \
68- --mlflow-outlier-model-artifiact-path $OUTLIER_MODEL_ARTIFACT_URI \
69- --package-path artifacts/model_package
48+ # Download model artifacts from databricks
49+ MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $MODEL_ARTIFACT_URI)
7050
7151 # Copy model configuration to artifacts directory
52+ mkdir artifacts
7253 cp service/configuration.json artifacts/model.json
54+ cp -R $MODEL_ARTIFACT_PATH service/employee_attrition_model
7355
7456 - name : ACR login
7557 uses : azure/docker-login@v1
8062
8163 - name : Build and push image
8264 run : |
83- docker build -t ${{ env.PROJECT_NAME }} artifacts/model_package
65+ docker build -t ${{ env.PROJECT_NAME }} service
8466 docker tag ${{ env.PROJECT_NAME }} ${{ secrets.CONTAINER_REGISTRY_NAME }}.azurecr.io/${{ env.PROJECT_NAME }}:${{ github.sha }}
8567 docker push ${{ secrets.CONTAINER_REGISTRY_NAME }}.azurecr.io/${{ env.PROJECT_NAME }}:${{ github.sha }}
8668
@@ -142,14 +124,14 @@ jobs:
142124 ${{ secrets.CONTAINER_REGISTRY_IMAGE_PULL_SECRET }}
143125 namespace : default
144126
127+ - name : Set artifact model environment variables
128+ run : |
129+ echo "MODEL_NAME=$(jq --raw-output .model_name model.json)" >> $GITHUB_ENV
130+ echo "MODEL_VERSION=$(jq --raw-output .model_version model.json)" >> $GITHUB_ENV
131+
145132 - name : Transition models to staging
146133 run : |
147- for i in {$PREDICTION_MODEL_ARTIFACT_URI,$DRIFT_MODEL_ARTIFACT_URI,$OUTLIER_MODEL_ARTIFACT_URI};
148- do
149- MODEL_NAME=$(echo $i | cut -c 9- | cut -d '/' -f1) ;
150- MODEL_VERSION=$(echo $i | cut -c 9- | cut -d '/' -f2) ;
151- curl -i -X POST -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Staging", "archive_existing_versions": true}' ;
152- done
134+ curl -i -X POST -H "Authorization: Bearer ${{ secrets.DATABRICKS_TOKEN }}" ${{ secrets.DATABRICKS_HOST }}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Staging", "archive_existing_versions": true}' ;
153135
154136 production :
155137 name : Production
@@ -197,11 +179,11 @@ jobs:
197179 ${{ secrets.CONTAINER_REGISTRY_IMAGE_PULL_SECRET }}
198180 namespace : default
199181
200- - name : Transition models to production
182+ - name : Set artifact model environment variables
183+ run : |
184+ echo "MODEL_NAME=$(jq --raw-output .model_name model.json)" >> $GITHUB_ENV
185+ echo "MODEL_VERSION=$(jq --raw-output .model_version model.json)" >> $GITHUB_ENV
186+
187+ - name : Transition models to staging
201188 run : |
202- for i in {$PREDICTION_MODEL_ARTIFACT_URI,$DRIFT_MODEL_ARTIFACT_URI,$OUTLIER_MODEL_ARTIFACT_URI};
203- do
204- MODEL_NAME=$(echo $i | cut -c 9- | cut -d '/' -f1) ;
205- MODEL_VERSION=$(echo $i | cut -c 9- | cut -d '/' -f2) ;
206- curl -i -X POST -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Production", "archive_existing_versions": true}' ;
207- done
189+ curl -i -X POST -H "Authorization: Bearer ${{ secrets.DATABRICKS_TOKEN }}" ${{ secrets.DATABRICKS_HOST }}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Production", "archive_existing_versions": true}' ;
0 commit comments