Skip to content

Commit c699558

Browse files
committed
Full pipeline: build containers with SHA tags and deploy to fleet
- Pipeline 1: build changed container images on OpenShift with commit SHA tags - Pipeline 2: update quadlet files, build quadlet OCI image, update fleet.yaml - Uses build-trigger SA with minimal permissions (patch, instantiate, watch) - Commits updated image tags back to repo automatically
1 parent 93abe3d commit c699558

1 file changed

Lines changed: 113 additions & 22 deletions

File tree

Lines changed: 113 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
name: Trigger OpenShift Container Builds
1+
name: Build Containers and Deploy to Fleet
22

33
on:
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+
913
jobs:
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

Comments
 (0)