1- name : Trigger OpenShift Container Builds
1+ name : Build Containers and Deploy to Fleet
22
33on :
44 push :
55 branches : [main]
66 paths :
77 - ' scenarios/containers/**'
88
9+ env :
10+ QUAY_NAMESPACE : redhat-et
11+ OPENSHIFT_SERVER : https://api.ocp-beta-test.nerc.mghpcc.org:6443
12+
913jobs :
1014 detect-changes :
1115 runs-on : ubuntu-latest
1216 outputs :
1317 modelcar : ${{ steps.filter.outputs.modelcar }}
1418 vllm-server : ${{ steps.filter.outputs.vllm-server }}
1519 openwebui : ${{ steps.filter.outputs.openwebui }}
20+ sha_short : ${{ steps.sha.outputs.sha_short }}
1621 steps :
1722 - uses : actions/checkout@v4
1823 - uses : dorny/paths-filter@v3
@@ -25,45 +30,131 @@ jobs:
2530 - 'scenarios/containers/vllm-server/**'
2631 openwebui:
2732 - 'scenarios/containers/openwebui/**'
33+ - name : Get short SHA
34+ id : sha
35+ run : echo "sha_short=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"
36+
37+ # --- Pipeline 1: Build container images with SHA tags ---
2838
2939 build-modelcar :
3040 needs : detect-changes
3141 if : needs.detect-changes.outputs.modelcar == 'true'
3242 runs-on : ubuntu-latest
3343 steps :
34- - name : Trigger BuildConfig
44+ - name : Install oc CLI
45+ run : |
46+ curl -sLo oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable/openshift-client-linux.tar.gz
47+ tar xzf oc.tar.gz oc
48+ sudo mv oc /usr/local/bin/
49+ - name : Build with SHA tag
3550 run : |
36- curl -sk -X POST \
37- -H "Authorization: Bearer ${{ secrets.OPENSHIFT_TOKEN }}" \
38- -H "Content-Type: application/json" \
39- -H "X-GitHub-Event: push" \
40- -d '{"ref":"refs/heads/main"}' \
41- "${{ secrets.OPENSHIFT_WEBHOOK_MODELCAR }}"
51+ oc login --token="${{ secrets.OPENSHIFT_TOKEN }}" --server="${{ env.OPENSHIFT_SERVER }}" --insecure-skip-tls-verify
52+ SHA=" ${{ needs.detect-changes.outputs.sha_short }}"
53+ IMAGE="quay.io/${{ env.QUAY_NAMESPACE }}/modelcar-llama-3.2-1b:${SHA}"
54+ oc patch bc build-modelcar -n mlops-pipelines --type=json \
55+ -p "[{\"op\":\"replace\",\"path\":\"/spec/output/to/name\",\"value\":\"${IMAGE}\"}]"
56+ oc start-build build-modelcar -n mlops-pipelines --wait --follow
4257
4358 build-vllm-server :
4459 needs : detect-changes
4560 if : needs.detect-changes.outputs.vllm-server == 'true'
4661 runs-on : ubuntu-latest
4762 steps :
48- - name : Trigger BuildConfig
63+ - name : Install oc CLI
4964 run : |
50- curl -sk -X POST \
51- -H "Authorization: Bearer ${{ secrets.OPENSHIFT_TOKEN }}" \
52- -H "Content-Type: application/json" \
53- -H "X-GitHub-Event: push" \
54- -d '{"ref":"refs/heads/main"}' \
55- "${{ secrets.OPENSHIFT_WEBHOOK_VLLM }}"
65+ curl -sLo oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable/openshift-client-linux.tar.gz
66+ tar xzf oc.tar.gz oc
67+ sudo mv oc /usr/local/bin/
68+ - name : Build with SHA tag
69+ run : |
70+ oc login --token="${{ secrets.OPENSHIFT_TOKEN }}" --server="${{ env.OPENSHIFT_SERVER }}" --insecure-skip-tls-verify
71+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
72+ IMAGE="quay.io/${{ env.QUAY_NAMESPACE }}/vllm-server:${SHA}"
73+ oc patch bc build-vllm-server -n mlops-pipelines --type=json \
74+ -p "[{\"op\":\"replace\",\"path\":\"/spec/output/to/name\",\"value\":\"${IMAGE}\"}]"
75+ oc start-build build-vllm-server -n mlops-pipelines --wait --follow
5676
5777 build-openwebui :
5878 needs : detect-changes
5979 if : needs.detect-changes.outputs.openwebui == 'true'
6080 runs-on : ubuntu-latest
6181 steps :
62- - name : Trigger BuildConfig
82+ - name : Install oc CLI
83+ run : |
84+ curl -sLo oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable/openshift-client-linux.tar.gz
85+ tar xzf oc.tar.gz oc
86+ sudo mv oc /usr/local/bin/
87+ - name : Build with SHA tag
88+ run : |
89+ oc login --token="${{ secrets.OPENSHIFT_TOKEN }}" --server="${{ env.OPENSHIFT_SERVER }}" --insecure-skip-tls-verify
90+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
91+ IMAGE="quay.io/${{ env.QUAY_NAMESPACE }}/openwebui:${SHA}"
92+ oc patch bc build-openwebui -n mlops-pipelines --type=json \
93+ -p "[{\"op\":\"replace\",\"path\":\"/spec/output/to/name\",\"value\":\"${IMAGE}\"}]"
94+ oc start-build build-openwebui -n mlops-pipelines --wait --follow
95+
96+ # --- Pipeline 2: Update quadlets, build OCI, update fleet ---
97+
98+ deploy-to-fleet :
99+ needs : [detect-changes, build-modelcar, build-vllm-server, build-openwebui]
100+ if : |
101+ always() &&
102+ needs.detect-changes.result == 'success' &&
103+ (needs.build-modelcar.result == 'success' || needs.build-modelcar.result == 'skipped') &&
104+ (needs.build-vllm-server.result == 'success' || needs.build-vllm-server.result == 'skipped') &&
105+ (needs.build-openwebui.result == 'success' || needs.build-openwebui.result == 'skipped') &&
106+ (needs.build-modelcar.result == 'success' || needs.build-vllm-server.result == 'success' || needs.build-openwebui.result == 'success')
107+ runs-on : ubuntu-latest
108+ steps :
109+ - uses : actions/checkout@v4
110+ with :
111+ token : ${{ secrets.GITHUB_TOKEN }}
112+
113+ - name : Update quadlet image tags
114+ run : |
115+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
116+
117+ if [ "${{ needs.build-modelcar.result }}" = "success" ]; then
118+ sed -i "s|Image=quay.io/${{ env.QUAY_NAMESPACE }}/modelcar-llama-3.2-1b:.*|Image=quay.io/${{ env.QUAY_NAMESPACE }}/modelcar-llama-3.2-1b:${SHA}|" scenarios/quadlet/model-car.container
119+ echo "Updated modelcar to :${SHA}"
120+ fi
121+
122+ if [ "${{ needs.build-vllm-server.result }}" = "success" ]; then
123+ sed -i "s|Image=quay.io/${{ env.QUAY_NAMESPACE }}/vllm-server:.*|Image=quay.io/${{ env.QUAY_NAMESPACE }}/vllm-server:${SHA}|" scenarios/quadlet/vllm-server.container
124+ sed -i "s|Image=quay.io/${{ env.QUAY_NAMESPACE }}/vllm-server:.*|Image=quay.io/${{ env.QUAY_NAMESPACE }}/vllm-server:${SHA}|" scenarios/quadlet/vllm-bench.container
125+ echo "Updated vllm-server to :${SHA}"
126+ fi
127+
128+ if [ "${{ needs.build-openwebui.result }}" = "success" ]; then
129+ sed -i "s|Image=quay.io/${{ env.QUAY_NAMESPACE }}/openwebui:.*|Image=quay.io/${{ env.QUAY_NAMESPACE }}/openwebui:${SHA}|" scenarios/quadlet/openwebui.container
130+ echo "Updated openwebui to :${SHA}"
131+ fi
132+
133+ - name : Build quadlet OCI image
134+ run : |
135+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
136+ podman build \
137+ -f scenarios/quadlet/containerfiles/Containerfile.quadlet \
138+ -t quay.io/${{ env.QUAY_NAMESPACE }}/mlops-quadlet:${SHA} \
139+ .
140+
141+ - name : Push quadlet OCI image to Quay
142+ run : |
143+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
144+ echo "${{ secrets.QUAY_PASSWORD }}" | podman login quay.io -u "${{ secrets.QUAY_USERNAME }}" --password-stdin
145+ podman push quay.io/${{ env.QUAY_NAMESPACE }}/mlops-quadlet:${SHA}
146+
147+ - name : Update fleet.yaml
148+ run : |
149+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
150+ sed -i "s|image: quay.io/${{ env.QUAY_NAMESPACE }}/mlops-quadlet:.*|image: quay.io/${{ env.QUAY_NAMESPACE }}/mlops-quadlet:${SHA}|" scenarios/scenario-02-device-edge/aws/fleet.yaml
151+ echo "Updated fleet.yaml to mlops-quadlet:${SHA}"
152+
153+ - name : Commit and push updates
63154 run : |
64- curl -sk -X POST \
65- -H "Authorization: Bearer ${{ secrets.OPENSHIFT_TOKEN }}" \
66- -H "Content-Type: application/json" \
67- -H "X-GitHub-Event: push" \
68- -d '{"ref":"refs/heads/main"}' \
69- "${{ secrets.OPENSHIFT_WEBHOOK_OPENWEBUI }}"
155+ SHA="${{ needs.detect-changes.outputs.sha_short }}"
156+ git config user.name "github-actions[bot]"
157+ git config user.email "github-actions[bot]@users.noreply.github.com"
158+ git add scenarios/quadlet/ scenarios/scenario-02-device-edge/aws/fleet.yaml
159+ git commit -m "Update quadlet and fleet image tags to ${SHA}" || echo "No changes to commit"
160+ git push
0 commit comments