1+ name : Deploy with Flux
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ paths :
8+ - ' domains/**'
9+ - ' infrastructure/**'
10+ - ' platform/**'
11+ - ' pipelines/**'
12+ - ' clusters/**'
13+ workflow_dispatch :
14+ inputs :
15+ environment :
16+ description : ' Environment to deploy to'
17+ required : true
18+ default : ' dev'
19+ type : choice
20+ options :
21+ - dev
22+ - test
23+ - prod
24+
25+ env :
26+ REGISTRY : ghcr.io
27+ REGISTRY_USERNAME : ${{ github.actor }}
28+ REGISTRY_PASSWORD : ${{ secrets.GITHUB_TOKEN }}
29+ KUBECONFIG : ${{ github.workspace }}/.kube/config
30+
31+ jobs :
32+ validate :
33+ name : Validate Manifests
34+ runs-on : ubuntu-latest
35+ steps :
36+ - name : Checkout
37+ uses : actions/checkout@v3
38+
39+ - name : Setup Kustomize
40+ uses : fluxcd/pkg//actions/kustomize@main
41+
42+ - name : Validate Kustomize overlays
43+ run : |
44+ kustomize build clusters/dev | kubeval --ignore-missing-schemas
45+ kustomize build infrastructure/overlays/dev | kubeval --ignore-missing-schemas
46+ kustomize build platform/overlays/dev | kubeval --ignore-missing-schemas
47+ kustomize build domains/finance/overlays/dev | kubeval --ignore-missing-schemas
48+
49+ build-docker-images :
50+ name : Build and Push Images
51+ runs-on : ubuntu-latest
52+ needs : validate
53+ if : github.event_name == 'push' || github.event_name == 'workflow_dispatch'
54+ strategy :
55+ matrix :
56+ image :
57+ - path : pipelines/ingest/example-pipeline
58+ name : data-platform/ingest-example
59+ - path : pipelines/transform
60+ name : data-platform/transform
61+
62+ steps :
63+ - name : Checkout
64+ uses : actions/checkout@v3
65+
66+ - name : Set up Docker Buildx
67+ uses : docker/setup-buildx-action@v2
68+
69+ - name : Login to Container Registry
70+ uses : docker/login-action@v2
71+ with :
72+ registry : ${{ env.REGISTRY }}
73+ username : ${{ env.REGISTRY_USERNAME }}
74+ password : ${{ env.REGISTRY_PASSWORD }}
75+
76+ - name : Extract metadata
77+ id : meta
78+ uses : docker/metadata-action@v4
79+ with :
80+ images : ${{ env.REGISTRY }}/${{ matrix.image.name }}
81+ tags : |
82+ type=sha,format=short
83+ type=ref,event=branch
84+
85+ - name : Build and push
86+ uses : docker/build-push-action@v4
87+ with :
88+ context : ${{ matrix.image.path }}
89+ push : true
90+ tags : ${{ steps.meta.outputs.tags }}
91+ labels : ${{ steps.meta.outputs.labels }}
92+ cache-from : type=gha
93+ cache-to : type=gha,mode=max
94+
95+ update-image-tags :
96+ name : Update Image Tags
97+ runs-on : ubuntu-latest
98+ needs : build-docker-images
99+ if : github.event_name == 'push' || github.event_name == 'workflow_dispatch'
100+ steps :
101+ - name : Checkout
102+ uses : actions/checkout@v3
103+ with :
104+ fetch-depth : 0
105+
106+ - name : Setup Flux CLI
107+ uses : fluxcd/flux2/action@main
108+
109+ - name : Configure Git
110+ run : |
111+ git config --global user.name "GitHub Actions"
112+ git config --global user.email "actions@github.com"
113+
114+ - name : Update image tags in manifests
115+ run : |
116+ # Example: Use the latest SHA tag to update image references
117+ # This would typically be done by Flux's image automation controllers
118+ # but we're doing it manually here as an example
119+ REPO="${GITHUB_REPOSITORY}"
120+ SHA="${GITHUB_SHA::7}"
121+
122+ # Update transform image
123+ sed -i "s|image: ${REGISTRY}/data-platform/transform:.*|image: ${REGISTRY}/data-platform/transform:sha-${SHA}|g" \
124+ domains/finance/overlays/dev/dbt-jobs.yaml
125+
126+ # Update ingest image
127+ sed -i "s|image: ${REGISTRY}/data-platform/ingest-example:.*|image: ${REGISTRY}/data-platform/ingest-example:sha-${SHA}|g" \
128+ domains/finance/overlays/dev/airflow-dags.yaml
129+
130+ git add domains/finance/overlays/dev/dbt-jobs.yaml domains/finance/overlays/dev/airflow-dags.yaml
131+ git commit -m "chore: update image tags to sha-${SHA}"
132+ git push origin main
133+
134+ deploy :
135+ name : Deploy with Flux
136+ runs-on : ubuntu-latest
137+ needs : [validate, update-image-tags]
138+ if : github.event_name == 'workflow_dispatch'
139+ environment :
140+ name : ${{ github.event.inputs.environment || 'dev' }}
141+ steps :
142+ - name : Checkout
143+ uses : actions/checkout@v3
144+
145+ - name : Setup Flux CLI
146+ uses : fluxcd/flux2/action@main
147+
148+ - name : Setup kubectl
149+ uses : azure/setup-kubectl@v3
150+ with :
151+ version : ' v1.25.0'
152+
153+ - name : Azure login
154+ uses : azure/login@v1
155+ with :
156+ creds : ${{ secrets.AZURE_CREDENTIALS }}
157+
158+ - name : Get AKS credentials
159+ env :
160+ ENVIRONMENT : ${{ github.event.inputs.environment || 'dev' }}
161+ run : |
162+ az aks get-credentials \
163+ --resource-group data-platform-$ENVIRONMENT-rg \
164+ --name data-platform-$ENVIRONMENT \
165+ --admin
166+
167+ - name : Verify cluster connection
168+ run : kubectl cluster-info
169+
170+ - name : Check Flux installation
171+ run : flux check --pre
172+
173+ - name : Bootstrap or update Flux (if needed)
174+ env :
175+ ENVIRONMENT : ${{ github.event.inputs.environment || 'dev' }}
176+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
177+ REPO_URL : ${{ github.server_url }}/${{ github.repository }}
178+ run : |
179+ if ! flux check; then
180+ flux bootstrap github \
181+ --owner=${{ github.repository_owner }} \
182+ --repository=$(echo ${{ github.repository }} | cut -d '/' -f 2) \
183+ --branch=main \
184+ --path=clusters/$ENVIRONMENT \
185+ --personal \
186+ --token-auth
187+ else
188+ flux reconcile source git flux-system
189+ flux reconcile kustomization flux-system
190+ fi
191+
192+ - name : Force reconciliation of all resources
193+ run : |
194+ echo "Reconciling all Flux resources..."
195+ flux reconcile source git flux-system --reconcile
196+ flux reconcile kustomization flux-system --reconcile
197+ flux reconcile kustomization infrastructure --reconcile
198+ flux reconcile kustomization platform --reconcile
199+ flux reconcile kustomization domains --reconcile
200+
201+ - name : Wait for deployment to complete
202+ run : |
203+ echo "Waiting for all kustomizations to be ready..."
204+ flux get kustomizations --watch
205+
206+ - name : Verify deployment
207+ run : |
208+ echo "Verifying platform services..."
209+ kubectl get pods -n platform
210+
211+ echo "Verifying domain services..."
212+ kubectl get pods -n finance
0 commit comments