Skip to content

Commit 843f782

Browse files
committed
First draft
1 parent 0b4e1ef commit 843f782

File tree

5 files changed

+121
-7
lines changed

5 files changed

+121
-7
lines changed

.github/workflows/db-update-dev.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ jobs:
1919
DB_NAME: ${{ vars.DEV_POSTGRE_SQL_DB_NAME }}
2020
ENVIRONMENT: ${{ vars.DEV_MOBILITY_FEEDS_ENVIRONMENT }}
2121
DB_ENVIRONMENT: ${{ vars.QA_MOBILITY_FEEDS_ENVIRONMENT }}
22+
API_BASE_URL: api-dev.mobilitydatabase.org
2223
secrets:
2324
DB_USER_PASSWORD: ${{ secrets.DEV_POSTGRE_USER_PASSWORD }}
2425
DB_USER_NAME: ${{ secrets.DEV_POSTGRE_USER_NAME }}
@@ -28,6 +29,7 @@ jobs:
2829
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
2930
OP_FEEDS_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_FEEDS_SERVICE_ACCOUNT_TOKEN }}
3031
POSTGRE_SQL_INSTANCE_NAME: ${{ secrets.DB_INSTANCE_NAME }}
32+
API_TEST_REFRESH_TOKEN: ${{ secrets.DEV_API_TEST_REFRESH_TOKEN }}
3133
notify-slack-on-failure:
3234
needs: [ update ]
3335
if: always() && (needs.update.result == 'failure') && (github.event_name == 'repository_dispatch')

.github/workflows/db-update-prod.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ jobs:
1414
DB_NAME: ${{ vars.PROD_POSTGRE_SQL_DB_NAME }}
1515
ENVIRONMENT: ${{ vars.PROD_MOBILITY_FEEDS_ENVIRONMENT }}
1616
DB_ENVIRONMENT: ${{ vars.PROD_MOBILITY_FEEDS_ENVIRONMENT }}
17+
API_BASE_URL: api.mobilitydatabase.org
1718
secrets:
1819
DB_USER_PASSWORD: ${{ secrets.PROD_POSTGRE_USER_PASSWORD }}
1920
DB_USER_NAME: ${{ secrets.PROD_POSTGRE_USER_NAME }}
@@ -23,6 +24,7 @@ jobs:
2324
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
2425
OP_FEEDS_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_FEEDS_SERVICE_ACCOUNT_TOKEN }}
2526
POSTGRE_SQL_INSTANCE_NAME: ${{ secrets.DB_INSTANCE_NAME }}
27+
API_TEST_REFRESH_TOKEN: ${{ secrets.PROD_API_TEST_REFRESH_TOKEN }}
2628

2729
notify-slack-on-failure:
2830
needs: [ update ]

.github/workflows/db-update-qa.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
DB_NAME: ${{ vars.QA_POSTGRE_SQL_DB_NAME }}
1616
ENVIRONMENT: ${{ vars.QA_MOBILITY_FEEDS_ENVIRONMENT }}
1717
DB_ENVIRONMENT: ${{ vars.QA_MOBILITY_FEEDS_ENVIRONMENT }}
18+
API_BASE_URL: api-qa.mobilitydatabase.org
1819
secrets:
1920
DB_USER_PASSWORD: ${{ secrets.QA_POSTGRE_USER_PASSWORD }}
2021
DB_USER_NAME: ${{ secrets.QA_POSTGRE_USER_NAME }}
@@ -24,6 +25,7 @@ jobs:
2425
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
2526
OP_FEEDS_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_FEEDS_SERVICE_ACCOUNT_TOKEN }}
2627
POSTGRE_SQL_INSTANCE_NAME: ${{ secrets.DB_INSTANCE_NAME }}
28+
API_TEST_REFRESH_TOKEN: ${{ secrets.QA_API_TEST_REFRESH_TOKEN }}
2729
notify-slack-on-failure:
2830
needs: [ update ]
2931
if: always() && (needs.update.result == 'failure') && (github.event_name == 'repository_dispatch')

.github/workflows/db-update.yml

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ on:
4646
POSTGRE_SQL_INSTANCE_NAME:
4747
description: PostgreSQL Instance Name
4848
required: true
49+
API_TEST_REFRESH_TOKEN:
50+
description: API refresh token used to resolve deployed API commit (used on repository_dispatch)
51+
required: false
4952
inputs:
5053
PROJECT_ID:
5154
description: GCP Project ID
@@ -67,18 +70,57 @@ on:
6770
description: GCP region
6871
required: true
6972
type: string
73+
API_BASE_URL:
74+
description: Base URL host for the API used to resolve version/commit (e.g. api-dev.mobilitydatabase.org)
75+
required: false
76+
default: api.mobilitydatabase.org
77+
type: string
7078

7179
env:
7280
python_version: '3.11'
7381
liquibase_version: '4.33.0'
7482

7583
jobs:
84+
resolve-api-meta:
85+
name: 'Resolve API commit/version'
86+
runs-on: ubuntu-latest
87+
if: ${{ github.event_name == 'repository_dispatch' && inputs.API_BASE_URL != '' && secrets.API_TEST_REFRESH_TOKEN != '' }}
88+
outputs:
89+
COMMIT_SHA: ${{ steps.resolve.outputs.COMMIT_SHA }}
90+
API_VERSION: ${{ steps.resolve.outputs.API_VERSION }}
91+
steps:
92+
- name: Checkout repo (for scripts)
93+
uses: actions/checkout@v4
94+
with:
95+
fetch-depth: 1
96+
sparse-checkout: |
97+
scripts
98+
sparse-checkout-cone: true
99+
- name: Resolve API commit/version
100+
id: resolve
101+
env:
102+
API_BASE_URL: ${{ inputs.API_BASE_URL }}
103+
API_REFRESH_TOKEN: ${{ secrets.API_TEST_REFRESH_TOKEN }}
104+
EVENT: ${{ github.event_name }}
105+
run: |
106+
bash scripts/resolve_api_meta.sh
107+
76108
db-schema-update:
77109
name: 'Database Schema Update'
78110
permissions: write-all
79111
runs-on: ubuntu-latest
112+
needs: [resolve-api-meta]
113+
if: ${{ always() }}
80114
steps:
81-
- name: Checkout code
115+
- name: Checkout code at API commit
116+
if: ${{ needs.resolve-api-meta.result == 'success' && needs.resolve-api-meta.outputs.COMMIT_SHA != '' }}
117+
uses: actions/checkout@v4
118+
with:
119+
ref: ${{ needs.resolve-api-meta.outputs.COMMIT_SHA }}
120+
fetch-depth: 0
121+
122+
- name: Checkout code (default)
123+
if: ${{ needs.resolve-api-meta.result != 'success' || needs.resolve-api-meta.outputs.COMMIT_SHA == '' }}
82124
uses: actions/checkout@v4
83125

84126
- name: Authenticate to Google Cloud QA/PROD
@@ -139,10 +181,18 @@ jobs:
139181
name: 'Database Content Update'
140182
permissions: write-all
141183
runs-on: ubuntu-latest
142-
needs: db-schema-update
143-
if: ${{ github.event_name == 'repository_dispatch' || github.event_name == 'workflow_dispatch' }}
184+
needs: [resolve-api-meta, db-schema-update]
185+
if: ${{ always() && (github.event_name == 'repository_dispatch' || github.event_name == 'workflow_dispatch') }}
144186
steps:
145-
- name: Checkout code
187+
- name: Checkout code at API commit
188+
if: ${{ needs.resolve-api-meta.result == 'success' && needs.resolve-api-meta.outputs.COMMIT_SHA != '' }}
189+
uses: actions/checkout@v4
190+
with:
191+
ref: ${{ needs.resolve-api-meta.outputs.COMMIT_SHA }}
192+
fetch-depth: 0
193+
194+
- name: Checkout code (default)
195+
if: ${{ needs.resolve-api-meta.result != 'success' || needs.resolve-api-meta.outputs.COMMIT_SHA == '' }}
146196
uses: actions/checkout@v4
147197

148198
- name: Setup python
@@ -159,6 +209,8 @@ jobs:
159209
uses: google-github-actions/setup-gcloud@v2
160210

161211
- name: Update .env file
212+
env:
213+
API_VERSION: ${{ needs.resolve-api-meta.outputs.API_VERSION }}
162214
run: |
163215
echo "PGUSER=${{ secrets.DB_USER_NAME }}" > config/.env.local
164216
echo "POSTGRES_USER=${{ secrets.DB_USER_NAME }}" >> config/.env.local
@@ -168,6 +220,7 @@ jobs:
168220
echo "POSTGRES_PORT=5432" >> config/.env.local
169221
echo "POSTGRES_HOST=localhost" >> config/.env.local
170222
echo "ENV=${{ inputs.ENVIRONMENT }}" >> config/.env.local
223+
if [[ -n "${API_VERSION}" ]]; then echo "API_VERSION=${API_VERSION}" >> config/.env.local; fi
171224
cat config/.env.local
172225
173226
- name: Load secrets from 1Password
@@ -283,6 +336,3 @@ jobs:
283336
echo "Secret $SECRET_NAME does not exist in project $PROJECT_ID, creating..."
284337
echo -n "$SECRET_VALUE" | gcloud secrets create $SECRET_NAME --data-file=- --replication-policy="automatic" --project=$PROJECT_ID
285338
fi
286-
287-
288-

scripts/resolve_api_meta.sh

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env bash
2+
# Resolve API metadata and set GitHub Action step outputs COMMIT_SHA and API_VERSION
3+
# Inputs (via env):
4+
# EVENT - GitHub event name (e.g., repository_dispatch)
5+
# API_BASE_URL - API host (e.g., api-dev.mobilitydatabase.org)
6+
# API_REFRESH_TOKEN- Refresh token to obtain access token (only used on repository_dispatch)
7+
# Outputs:
8+
# Prints COMMIT_SHA and API_VERSION to stdout as NAME=VALUE lines
9+
# Also exports to $GITHUB_ENV if defined so the script is runnable by hand
10+
11+
set -euo pipefail
12+
# QA
13+
#export API_REFRESH_TOKEN="AMf-vBzv1rT8AQ0uZrzNDD5wuMxSvxLVbXRmViTaOVuP8eh-uDdWLDpsDHYMrGNqq2sqn1ya_-i8YXZdWh9GnLoPSLbbWY99hmb-JUrJ_NXz4pJ5v2ysm3kCpjy02zN2uI5csAi1YmGSrlJoUQazNO4ntkVHkgdpsyMSBwgIGDczwX4qANzEjsRjtRCQlCbm_MnWsLaBKrukn5qxFbyVszzOloG5piIivTL700I9cPslxlzirmYYrj3jsYIX00RKBF3pPvTpiiOGskRjeZi_UvI5spux0tkFuZJZGt-vNKWeLT9MSJp6S3Y5os4PQMjCJ-StCP4Qkqwja5EiDRdVhqJVCT7XYn_MAQBYGFUYvFOQu9S9siKlhXO9Mcc2NiH89eaJ1EUlkXRnzY9nahP82cmt8VOKHyu6GAT3-l4V9_9zJ7wjyQJ0wSf_5wZlLxFSScLaIADZdRya"
14+
# https://beta.mobilitydatabase.org/account
15+
#export API_REFRESH_TOKEN="AMf-vByLiUKvxTqH_4vkQTJ8aStgCvrNGDyMINJNpYVdRCQliF6q0FmZxy7Y29rgNce4HGnrr2La3lja5CsOPn8-Vx6RA0enAv5RVxnBC08G-c6ZAiwCMfvUT-vT49ZLeULmUIM6BlCQKGdXSxAOljg6QJNH0wXdvhHaLUGVGdhoeKW3pg692ZCCWTVCWOFSDhHhS-d-8ywSd7nsFwka0ZMBRAtOeY-lgvwsz7Wo21hCTaHyUYSoodKzWFjUUJ9W7nA33OB6lKBA9tZGap3pYlO-Vo47jl-M2GcZn77R-sgsgEbPXfHxc0NMS1ZbNXKeWmrcqPYcgcEoBFdFrnQcd1bD-b1O8_zTnDyjjRekLq8bGKLnDfRg-qZvUaNxtKPUqFnh-pmvO7gXMxwj7Tnoc5cMmQxHGZ2euuxaVRHNMoAxnEzqIzZ7nxIM4NX36eUZCuLLSTXvOnmsdMuhQ_7oI2wX-YKxRGHnrw"
16+
# https://mobility-feeds-dev.web.app/account
17+
export API_REFRESH_TOKEN="AMf-vBxJqJLukaDstkJl_Pi-GonY1suIN_3O5Fp7pHfYcD_XVZwSJczM_815UpEJFQN9ShzaE5KRqsyO4sRnFUBAA6KLQgcP-7Mx9yNzRBGtBi-e37X50CNwqUvsuUfOjFZNeKPfaO1ipuCA9LQLWf-5e29DmyxEgO1Fy9UguKm5KlDRrcIkUjTzSBHuSRu06j1_th4TR4l0X5OteNGsG6F6N2lrihj2Z5Idx6PoJ02_5fgLOhop8mlGd-ktNpQ3J46lAz7BX7_UgPkbugwIoD9YdYvnIlrSp5hl3ri7mmauN0rOV1HEMn-aynd7Zqkc0lmNWWL3BqQe-Ik0sOt23HZISK7Y2EITrXEtXxPN0-824BKUAoLN-_eutLk3NFRJW19jQc-RrZRP1LzXdWQETKhXPRBWCf33U1N0Yv2qzBKTzhvFjh3yULRVnZjUxh7CnZeYDKbxAWYj"
18+
19+
COMMIT_SHA=""
20+
API_VERSION=""
21+
22+
if [[ -n "${API_REFRESH_TOKEN:-}" ]]; then
23+
echo "Resolving API commit from https://${API_BASE_URL}/v1/metadata ..."
24+
REPLY_JSON=$(curl --fail --silent --show-error --location "https://${mobility-feeds-dev}/v1/tokens" \
25+
--header 'Content-Type: application/json' \
26+
--data "{ \"refresh_token\": \"${API_REFRESH_TOKEN}\" }")
27+
ACCESS_TOKEN=$(echo "${REPLY_JSON}" | jq -r .access_token)
28+
if [[ -z "${ACCESS_TOKEN}" || "${ACCESS_TOKEN}" == "null" ]]; then
29+
echo "Error: Could not obtain access token from reply" >&2
30+
exit 1
31+
fi
32+
META_JSON=$(curl --fail --silent --show-error \
33+
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
34+
-H 'accept: application/json' \
35+
"https://${API_BASE_URL}/v1/metadata")
36+
COMMIT_SHA=$(echo "${META_JSON}" | jq -r .commit_hash)
37+
API_VERSION=$(echo "${META_JSON}" | jq -r .version)
38+
if [[ -z "${COMMIT_SHA}" || "${COMMIT_SHA}" == "null" ]]; then
39+
echo "Error: Could not extract commit_hash from metadata" >&2
40+
echo "Metadata reply: ${META_JSON}" >&2
41+
exit 1
42+
fi
43+
echo "Resolved API version: ${API_VERSION} (commit ${COMMIT_SHA})"
44+
else
45+
echo "No token provided; skipping API metadata resolution."
46+
fi
47+
48+
# Output values to stdout in a parse-friendly format
49+
echo "COMMIT_SHA=${COMMIT_SHA}"
50+
echo "API_VERSION=${API_VERSION}"
51+
52+
# Optionally export to $GITHUB_ENV for subsequent steps when available
53+
if [[ -n "${GITHUB_ENV:-}" ]]; then
54+
{
55+
echo "COMMIT_SHA=${COMMIT_SHA}"
56+
echo "API_VERSION=${API_VERSION}"
57+
} >> "$GITHUB_ENV"
58+
fi

0 commit comments

Comments
 (0)