Skip to content

Commit 17686ab

Browse files
authored
Set up config to deploy downstream app in k3s (#774)
* Add charts to deploy services in k3s * Delete charts * Config to deploy in k3s * Deploy inline with build * k3s no build images * k3s kubectl config * Update configs * Enable services * Deploy in default namespace * Update to deploy according to the enviroment * Enable nominatim staging * Update osm-seed version * values.k3s.staging.template.yaml * Enable taginfoDataProcessor * Take docker images from values.yaml * Update k3s deploy * Add path to build the images * Fix to deploy images * Update templates for eks * Add tiler config * Update timeouts for import in imposm * Delete tiler global seed annd coverage * Update osm-seed version * Add staticHostPath for k3s * Add osmcha config * Update osm-seed version * Update osm-seed version * Disable statement_timeout so large material views * Add osmxAdiffBuilder config * Update values configs * Add osmxAdiffBuilder image key to ohm/values.yaml * Add tiler-cache config * Update osm-seed version * Trigger actions * Update osmx config * Update values * Slip monitoring languages and pipeline * Update values * Remove ohm charts dependency * Add planet stats * Add config for planet stats * Add config for planetStats charts * Update planet stats docker container * Fix issue in planet stats * Update cronjob for planet stats * Update gitsha for planet stats repo * Disable resource for planet-stats * Run in seqeunce the queries * Regenerate mviews * Update planet stats docker image * Configure for production release * debug * Tunnel debug * Tunnel debug * debug: print websocket upgrade status in tunnel step * Fill all production secret placeholders in substitute step * Update relase name * Enable osmcha db - production * Update config for production * Update oms-seed version to support initialDelaySeconds
1 parent cd75cae commit 17686ab

41 files changed

Lines changed: 1617 additions & 1635 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Build images (chartpress)
2+
3+
# Builds OHM-owned images with chartpress and pushes them to ghcr.io.
4+
# It does NOT pass any state to the deploy workflows. Each deploy
5+
# (deploy-eks.yaml, deploy-k3s.yaml) re-runs `chartpress --skip-build`
6+
# on the same commit to recompute the exact same image tags, so the
7+
# only job of this workflow is to make sure the images exist in the
8+
# registry before a deploy references them.
9+
10+
on:
11+
push:
12+
branches:
13+
- 'main'
14+
- 'staging'
15+
- 'deploy-*'
16+
- 'build-*'
17+
- 'k3s'
18+
paths:
19+
# chartpress.yaml and Chart.yaml are shared deps: changing them rebumps
20+
# every image tag, so the build must run to push images at the new tag.
21+
- 'images/**'
22+
- 'chartpress.yaml'
23+
- 'ohm/Chart.yaml'
24+
workflow_dispatch:
25+
26+
jobs:
27+
build:
28+
runs-on: ubuntu-22.04
29+
timeout-minutes: 60
30+
steps:
31+
- uses: actions/checkout@v4
32+
with:
33+
fetch-depth: 0
34+
35+
- name: Login to GitHub Container Registry
36+
uses: docker/login-action@v3
37+
with:
38+
registry: ghcr.io
39+
username: ${{ github.repository_owner }}
40+
password: ${{ secrets.GHCR_GITHUB_TOKEN }}
41+
42+
- name: Setup Python
43+
uses: actions/setup-python@v5
44+
with:
45+
python-version: '3.11'
46+
47+
- name: Setup git
48+
run: |
49+
git config --global user.email "noreply@developmentseed.org"
50+
git config --global user.name "Github Action"
51+
52+
- name: Install chartpress
53+
run: pip install chartpress==2.3.0 ruamel.yaml
54+
55+
- name: Run chartpress
56+
env:
57+
GITHUB_TOKEN: ${{ secrets.GHCR_GITHUB_TOKEN }}
58+
run: chartpress --push
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,110 @@
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+
218
on:
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+
943
jobs:
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

Comments
 (0)