1- name : Chartpress Publish and Deploy
1+ name : Deploy EKS
2+
3+ # Deploys the ohm/ chart to AWS EKS.
4+ #
5+ # Triggers:
6+ # - workflow_run: after "Build images (chartpress)" finishes, so the
7+ # images are already in ghcr.io before we reference them.
8+ # - push (paths-ignore images/**): config-only changes, no build needed.
9+ # - workflow_dispatch: manual deploy of a branch. NOTE: for a commit
10+ # that changed images/**, build-images must have run first so the
11+ # image exists in the registry.
12+ #
13+ # The deploy runs `chartpress --skip-build` itself to rewrite the
14+ # image tags in ohm/values.yaml. The tags are derived from git history,
15+ # so on the same commit they match exactly what build-images pushed.
16+ # No artifact is passed between workflows.
17+
218on :
19+ workflow_run :
20+ workflows : ['Build images (chartpress)']
21+ types : [completed]
22+ branches :
23+ - main
24+ - staging
325 push :
426 branches :
5- - ' main'
6- - ' staging'
7- - ' deploy-*'
8- - ' build-*'
27+ - main
28+ - staging
29+ - deploy-*
30+ # images/**, chartpress.yaml and Chart.yaml rebump image tags, so they
31+ # must go through "Build images" first and reach deploy via workflow_run.
32+ paths-ignore :
33+ - ' images/**'
34+ - ' chartpress.yaml'
35+ - ' ohm/Chart.yaml'
36+ workflow_dispatch :
37+ inputs :
38+ ref :
39+ description : Branch to deploy
40+ required : true
41+ default : staging
42+
943jobs :
10- build :
44+ deploy :
1145 runs-on : ubuntu-22.04
12- timeout-minutes : 120
46+ timeout-minutes : 60
47+ if : ${{ github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success' }}
1348 env :
1449 RAILS_MASTER_KEY : ${{ secrets.RAILS_MASTER_KEY }}
1550 steps :
16- - uses : actions/checkout@v1
17- - name : Login to GitHub Container Registry
18- uses : docker/login-action@v1
51+ - name : Resolve ref + env
52+ id : src
53+ run : |
54+ case "${{ github.event_name }}" in
55+ workflow_dispatch)
56+ BRANCH="${{ github.event.inputs.ref }}"
57+ SHA="${{ github.event.inputs.ref }}" ;;
58+ workflow_run)
59+ BRANCH="${{ github.event.workflow_run.head_branch }}"
60+ SHA="${{ github.event.workflow_run.head_sha }}" ;;
61+ *)
62+ BRANCH="${{ github.ref_name }}"
63+ SHA="${{ github.sha }}" ;;
64+ esac
65+ case "$BRANCH" in
66+ main) ENV="production" ;;
67+ staging) ENV="staging" ;;
68+ deploy-*) ENV="staging" ;;
69+ *) ENV="staging" ;;
70+ esac
71+ echo "branch=$BRANCH" >> $GITHUB_OUTPUT
72+ echo "sha=$SHA" >> $GITHUB_OUTPUT
73+ echo "env=$ENV" >> $GITHUB_OUTPUT
74+ echo "Deploying ref=$BRANCH ($SHA) to $ENV"
75+
76+ - uses : actions/checkout@v4
1977 with :
20- registry : ghcr.io
21- username : ${{ github.repository_owner }}
22- password : ${{ secrets.GHCR_GITHUB_TOKEN }}
23- - name : Setup python
24- uses : actions/setup-python@v2
78+ ref : ${{ steps.src.outputs.sha }}
79+ fetch-depth : 0
80+
81+ # ============================================================
82+ # Recompute image tags (no build/push). Same commit + full git
83+ # history => same tags build-images pushed.
84+ # ============================================================
85+ - name : Setup Python
86+ uses : actions/setup-python@v5
2587 with :
26- python-version : ' 3.7'
27- - name : Setup git
28- run : git config --global user.email "noreply@developmentseed.org" && git config --global user.name "Github Action"
29- - name : Install Chartpress
30- run : |
31- pip install chartpress==2.3.0 six ruamel.yaml
32- - name : Run Chartpress
33- run : chartpress --push
34- env :
35- GITHUB_TOKEN : ${{ secrets.GHCR_GITHUB_TOKEN }}
36- RAILS_MASTER_KEY : ${{ secrets.RAILS_MASTER_KEY }}
37- _input-file : ' values.development.template.yaml'
38- _format-key : ' {{key}}'
39- _output-file : ' values.development.yaml'
40- AWS_SSL_ARN : ${{ secrets.AWS_SSL_ARN }}
41- # # web
42- MAILER_ADDRESS : ${{ secrets.MAILER_ADDRESS }}
43- MAILER_DOMAIN : ${{ secrets.MAILER_DOMAIN }}
44- MAILER_PASSWORD : ${{ secrets.STAGING_MAILER_PASSWORD }}
45- MAILER_USERNAME : ${{ secrets.STAGING_MAILER_USERNAME }}
46- DEVELOPMENT_DB : ${{ secrets.STAGING_DB }}
47- DEVELOPMENT_DB_EBS : ${{ secrets.STAGING_DB_EBS }}
48- DEVELOPMENT_DB_PASSWORD : ${{ secrets.STAGING_DB_PASSWORD }}
49- DEVELOPMENT_DB_USER : ${{ secrets.STAGING_DB_USER }}
50- DEVELOPMENT_DOMAIN_NAME : ohmstaging.org
51- DEVELOPMENT_ID_KEY : ${{ secrets.STAGING_ID_KEY }}
52- DEVELOPMENT_ID_APPLICATION : ${{ secrets.STAGING_ID_APPLICATION }}
53- DEVELOPMENT_OAUTH_CLIENT_ID : ${{ secrets.STAGING_OAUTH_CLIENT_ID }}
54- DEVELOPMENT_OAUTH_KEY : ${{ secrets.STAGING_OAUTH_KEY }}
55- DEVELOPMENT_S3_BUCKET : osmseed-dev
56- # # tiler
57- DEVELOPMENT_TILER_DB_HOST : ${{ secrets.STAGING_TILER_DB_HOST }}
58- DEVELOPMENT_TILER_SERVER_HOST : ${{ secrets.STAGING_TILER_DB_HOST }}
59- DEVELOPMENT_TILER_DB_PASSWORD : ${{ secrets.STAGING_TILER_DB_PASSWORD }}
60- DEVELOPMENT_TILER_CACHE_AWS_ACCESS_KEY_ID : ${{ secrets.STAGING_TILER_CACHE_AWS_ACCESS_KEY_ID }}
61- DEVELOPMENT_TILER_CACHE_AWS_SECRET_ACCESS_KEY : ${{ secrets.STAGING_TILER_CACHE_AWS_SECRET_ACCESS_KEY }}
62- DEVELOPMENT_SQS_QUEUE_URL : ${{ secrets.STAGING_SQS_QUEUE_URL }}
63- # # tm
64- DEVELOPMENT_TM_DB_PASSWORD : ${{ secrets.STAGING_TM_DB_PASSWORD }}
65- DEVELOPMENT_TM_API_SECRET : ${{ secrets.STAGING_TM_API_SECRET }}
66- # # nominatim
67- DEVELOPMENT_NOMINATIM_PG_PASSWORD : ${{ secrets.STAGING_NOMINATIM_PG_PASSWORD }}
68- # # osmcha
69- DEVELOPMENT_OSMCHA_PG_PASSWORD : ${{ secrets.STAGING_OSMCHA_PG_PASSWORD }}
70- DEVELOPMENT_OSMCHA_DJANGO_SECRET_KEY : ${{ secrets.STAGING_OSMCHA_DJANGO_SECRET_KEY }}
71- DEVELOPMENT_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN : ${{ secrets.STAGING_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN }}
72- OHM_SLACK_WEBHOOK_URL : ${{ secrets.OHM_SLACK_WEBHOOK_URL }}
73- # ############### Staging secrets ################
88+ python-version : ' 3.11'
89+
90+ - name : Install chartpress
91+ run : pip install chartpress==2.3.0 ruamel.yaml
92+
93+ - name : Run chartpress (rewrite image tags, no build)
94+ run : chartpress --skip-build
95+
96+ # ============================================================
97+ # Substitute secrets per environment (staging / production)
98+ # ============================================================
7499 - name : Staging - substitute secrets
75- if : github.ref == 'refs/heads/ staging' || startsWith(github.ref, 'refs/heads/deploy-')
100+ if : steps.src.outputs.env == 'staging'
76101 uses : bluwy/substitute-string-action@v1
77102 with :
78103 _input-file : ' values.staging.template.yaml'
79104 _format-key : ' {{key}}'
80105 _output-file : ' values.staging.yaml'
81106 STAGING_AWS_SSL_ARN : ${{ secrets.STAGING_AWS_SSL_ARN }}
82107 STAGING_AWS_WAF_WEBACL_ARN : ${{ secrets.STAGING_AWS_WAF_WEBACL_ARN }}
83- # # web
84108 MAILER_ADDRESS : ${{ secrets.MAILER_ADDRESS }}
85109 MAILER_DOMAIN : ${{ secrets.MAILER_DOMAIN }}
86110 MAILER_PASSWORD : ${{ secrets.STAGING_MAILER_PASSWORD }}
@@ -99,47 +123,33 @@ jobs:
99123 STAGING_RAILS_MASTER_KEY : ${{ secrets.STAGING_RAILS_MASTER_KEY }}
100124 STAGING_WIKIPEDIA_AUTH_ID : ${{ secrets.STAGING_WIKIPEDIA_AUTH_ID }}
101125 STAGING_WIKIPEDIA_AUTH_SECRET : ${{ secrets.STAGING_WIKIPEDIA_AUTH_SECRET }}
102-
103- # # tiler
104126 STAGING_TILER_DB_HOST : ${{ secrets.STAGING_TILER_DB_HOST }}
105127 STAGING_TILER_SERVER_HOST : ${{ secrets.STAGING_TILER_DB_HOST }}
106128 STAGING_TILER_DB_PASSWORD : ${{ secrets.STAGING_TILER_DB_PASSWORD }}
107129 STAGING_TILER_CACHE_AWS_ACCESS_KEY_ID : ${{ secrets.STAGING_TILER_CACHE_AWS_ACCESS_KEY_ID }}
108130 STAGING_TILER_CACHE_AWS_SECRET_ACCESS_KEY : ${{ secrets.STAGING_TILER_CACHE_AWS_SECRET_ACCESS_KEY }}
109131 STAGING_SQS_QUEUE_URL : ${{ secrets.STAGING_SQS_QUEUE_URL }}
110-
111- # # tm
112132 STAGING_TM_DB_PASSWORD : ${{ secrets.STAGING_TM_DB_PASSWORD }}
113133 STAGING_TM_API_SECRET : ${{ secrets.STAGING_TM_API_SECRET }}
114-
115- # # nominatim
116134 STAGING_NOMINATIM_PG_PASSWORD : ${{ secrets.STAGING_NOMINATIM_PG_PASSWORD }}
117135 STAGING_NOMINATIM_HOST : ${{ secrets.STAGING_NOMINATIM_HOST }}
118-
119- # # Overpass api external service
120136 STAGING_OVERPASS_HOST : ${{ secrets.STAGING_OVERPASS_HOST }}
121-
122- # # osmcha
123137 STAGING_OSMCHA_PG_PASSWORD : ${{ secrets.STAGING_OSMCHA_PG_PASSWORD }}
124138 STAGING_OSMCHA_DJANGO_SECRET_KEY : ${{ secrets.STAGING_OSMCHA_DJANGO_SECRET_KEY }}
125139 STAGING_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN : ${{ secrets.STAGING_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN }}
126140 OHM_SLACK_WEBHOOK_URL : ${{ secrets.OHM_SLACK_WEBHOOK_URL }}
127-
128- # ohm website
129141 STAGING_OPENSTREETMAP_AUTH_ID : ${{ secrets.STAGING_OPENSTREETMAP_AUTH_ID }}
130142 STAGING_OPENSTREETMAP_AUTH_SECRET : ${{ secrets.STAGING_OPENSTREETMAP_AUTH_SECRET }}
131143
132- # ############### Production secrets ################
133144 - name : Production - substitute secrets
134- if : github.ref == 'refs/heads/main '
145+ if : steps.src.outputs.env == 'production '
135146 uses : bluwy/substitute-string-action@v1
136147 with :
137148 _input-file : ' values.production.template.yaml'
138149 _format-key : ' {{key}}'
139150 _output-file : ' values.production.yaml'
140151 PRODUCTION_AWS_SSL_ARN : ${{ secrets.PRODUCTION_AWS_SSL_ARN }}
141152 PRODUCTION_AWS_WAF_WEBACL_ARN : ${{ secrets.PRODUCTION_AWS_WAF_WEBACL_ARN }}
142- # # web
143153 MAILER_ADDRESS : ${{ secrets.MAILER_ADDRESS }}
144154 MAILER_DOMAIN : ${{ secrets.MAILER_DOMAIN }}
145155 MAILER_PASSWORD : ${{ secrets.MAILER_PASSWORD }}
@@ -159,47 +169,36 @@ jobs:
159169 PRODUCTION_RAILS_MASTER_KEY : ${{ secrets.PRODUCTION_RAILS_MASTER_KEY }}
160170 PRODUCTION_WIKIPEDIA_AUTH_ID : ${{ secrets.PRODUCTION_WIKIPEDIA_AUTH_ID }}
161171 PRODUCTION_WIKIPEDIA_AUTH_SECRET : ${{ secrets.PRODUCTION_WIKIPEDIA_AUTH_SECRET }}
162-
163- # # tiler
164172 PRODUCTION_TILER_DB_HOST : ${{ secrets.PRODUCTION_TILER_DB_HOST }}
165173 PRODUCTION_TILER_SERVER_HOST : ${{ secrets.PRODUCTION_TILER_DB_HOST }}
166174 PRODUCTION_TILER_DB_PASSWORD : ${{ secrets.PRODUCTION_TILER_DB_PASSWORD }}
167175 PRODUCTION_TILER_CACHE_AWS_ACCESS_KEY_ID : ${{ secrets.PRODUCTION_TILER_CACHE_AWS_ACCESS_KEY_ID }}
168176 PRODUCTION_SQS_QUEUE_URL : ${{ secrets.PRODUCTION_SQS_QUEUE_URL }}
169177 PRODUCTION_TILER_CACHE_AWS_SECRET_ACCESS_KEY : ${{ secrets.PRODUCTION_TILER_CACHE_AWS_SECRET_ACCESS_KEY }}
170-
171- # # tm
172178 PRODUCTION_TM_DB_PASSWORD : ${{ secrets.PRODUCTION_TM_DB_PASSWORD }}
173179 PRODUCTION_TM_API_SECRET : ${{ secrets.PRODUCTION_TM_API_SECRET }}
174-
175- # # nominatim and nominatim external service ip
176180 PRODUCTION_NOMINATIM_PG_PASSWORD : ${{ secrets.PRODUCTION_NOMINATIM_PG_PASSWORD }}
177181 PRODUCTION_NOMINATIM_HOST : ${{ secrets.PRODUCTION_NOMINATIM_HOST }}
178-
179- # # Overpass api external service
180182 PRODUCTION_OVERPASS_HOST : ${{ secrets.PRODUCTION_OVERPASS_HOST }}
181-
182- # # osmcha
183183 PRODUCTION_OSMCHA_PG_PASSWORD : ${{ secrets.PRODUCTION_OSMCHA_PG_PASSWORD }}
184184 PRODUCTION_OSMCHA_DJANGO_SECRET_KEY : ${{ secrets.PRODUCTION_OSMCHA_DJANGO_SECRET_KEY }}
185185 PRODUCTION_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN : ${{ secrets.PRODUCTION_OSMCHA_REACT_APP_MAPBOX_ACCESS_TOKEN }}
186186 OHM_SLACK_WEBHOOK_URL : ${{ secrets.OHM_SLACK_WEBHOOK_URL }}
187-
188- # ohm website
189187 PRODUCTION_OPENSTREETMAP_AUTH_ID : ${{ secrets.PRODUCTION_OPENSTREETMAP_AUTH_ID }}
190188 PRODUCTION_OPENSTREETMAP_AUTH_SECRET : ${{ secrets.PRODUCTION_OPENSTREETMAP_AUTH_SECRET }}
191-
192- - name : AWS Credentials
193- if : github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/deploy-')
194- uses : aws-actions/configure-aws-credentials@v1
189+
190+ # ============================================================
191+ # AWS / kubectl / helm + EKS deploy
192+ # ============================================================
193+ - name : AWS credentials
194+ uses : aws-actions/configure-aws-credentials@v4
195195 with :
196196 aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
197197 aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
198198 aws-region : us-east-1
199- - name : Setup Kubectl and Helm Dependencies
200- if : github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/deploy-')
199+
200+ - name : Install kubectl, aws-iam-authenticator, helm
201201 run : |
202- sudo pip install awscli --ignore-installed six
203202 sudo curl -L -o /usr/bin/kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/linux/amd64/kubectl
204203 sudo chmod +x /usr/bin/kubectl
205204 sudo curl -o /usr/bin/aws-iam-authenticator https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/linux/amd64/aws-iam-authenticator
@@ -210,26 +209,24 @@ jobs:
210209 sudo chmod +x /usr/local/bin/helm
211210 helm version
212211
213- - name : Update kube-config staging
214- if : github.ref == 'refs/heads/ staging' || startsWith(github.ref, 'refs/heads/deploy-')
212+ - name : Update kubeconfig ( staging)
213+ if : steps.src.outputs.env == 'staging'
215214 run : aws eks --region us-east-1 update-kubeconfig --name osmseed-staging
216- - name : Update kube-config prod
217- if : github.ref == 'refs/heads/main'
215+
216+ - name : Update kubeconfig (production)
217+ if : steps.src.outputs.env == 'production'
218218 run : aws eks --region us-east-1 update-kubeconfig --name osmseed-production-v2
219- - name : Add Helm repository
220- if : github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/deploy-')
219+
220+ - name : Helm repo + deps
221221 run : |
222222 helm repo add osm-seed https://osm-seed.github.io/osm-seed-chart/
223223 helm repo update
224- - name : Install helm dependencies for
225- if : github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/deploy-')
226- run : cd ohm && helm dep up
227- # Staging
224+ cd ohm && helm dep up
225+
228226 - name : Staging - helm deploy
229- if : github.ref == 'refs/heads/ staging' || startsWith(github.ref, 'refs/heads/deploy-')
227+ if : steps.src.outputs.env == 'staging'
230228 run : helm upgrade --install staging --wait ohm/ -f values.staging.yaml -f ohm/values.yaml
231- # Production
229+
232230 - name : Production - helm deploy
233- if : github.ref == 'refs/heads/main '
231+ if : steps.src.outputs.env == 'production '
234232 run : helm upgrade --install production --wait ohm/ -f values.production.yaml -f ohm/values.yaml
235-
0 commit comments