Skip to content

Commit 5cda575

Browse files
authored
Merge pull request #578 from DataIntegrationGroup/staging
Maintenance Push
2 parents 9b2644b + 31facf7 commit 5cda575

283 files changed

Lines changed: 37467 additions & 7489 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ POSTGRES_USER=admin
44
POSTGRES_PASSWORD=password
55
POSTGRES_DB=ocotillo
66
POSTGRES_HOST=localhost
7-
POSTGRES_PORT=54321
7+
POSTGRES_PORT=5432
88

99
# Connection pool configuration for parallel transfers
1010
# pool_size: number of persistent connections to maintain
@@ -20,6 +20,7 @@ TRANSFER_PARALLEL=1
2020
TRANSFER_WELL_SCREENS=True
2121
TRANSFER_SENSORS=True
2222
TRANSFER_CONTACTS=True
23+
TRANSFER_PERMISSIONS=True
2324
TRANSFER_WATERLEVELS=True
2425
TRANSFER_WATERLEVELS_PRESSURE=True
2526
TRANSFER_WATERLEVELS_ACOUSTIC=True
@@ -46,6 +47,9 @@ MODE=development
4647
# disable authentication (for development only)
4748
AUTHENTIK_DISABLE_AUTHENTICATION=1
4849

50+
# erase and rebuild the database for step tests
51+
REBUILD_DB=1
52+
4953
# authentik
5054
AUTHENTIK_URL=
5155
AUTHENTIK_CLIENT_ID=

.github/app.template.yaml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
service: ${SERVICE_NAME}
2+
runtime: python313
3+
entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
4+
instance_class: F4
5+
service_account: "${CLOUD_SQL_USER}.gserviceaccount.com"
6+
handlers:
7+
- url: /.*
8+
secure: always
9+
script: auto
10+
env_variables:
11+
MODE: "production"
12+
ENVIRONMENT: "${ENVIRONMENT}"
13+
DB_DRIVER: "cloudsql"
14+
CLOUD_SQL_INSTANCE_NAME: "${CLOUD_SQL_INSTANCE_NAME}"
15+
CLOUD_SQL_DATABASE: "${CLOUD_SQL_DATABASE}"
16+
CLOUD_SQL_USER: "${CLOUD_SQL_USER}"
17+
PYGEOAPI_POSTGRES_DB: "${PYGEOAPI_POSTGRES_DB}"
18+
PYGEOAPI_POSTGRES_USER: "${PYGEOAPI_POSTGRES_USER}"
19+
PYGEOAPI_POSTGRES_HOST: "${PYGEOAPI_POSTGRES_HOST}"
20+
PYGEOAPI_POSTGRES_PORT: "${PYGEOAPI_POSTGRES_PORT}"
21+
PYGEOAPI_POSTGRES_PASSWORD: |-
22+
${PYGEOAPI_POSTGRES_PASSWORD}
23+
PYGEOAPI_SERVER_URL: "${PYGEOAPI_SERVER_URL}"
24+
CLOUD_SQL_IAM_AUTH: "${CLOUD_SQL_IAM_AUTH}"
25+
GCS_SERVICE_ACCOUNT_KEY: |-
26+
${GCS_SERVICE_ACCOUNT_KEY}
27+
GCS_BUCKET_NAME: "${GCS_BUCKET_NAME}"
28+
AUTHENTIK_URL: "${AUTHENTIK_URL}"
29+
AUTHENTIK_CLIENT_ID: "${AUTHENTIK_CLIENT_ID}"
30+
AUTHENTIK_AUTHORIZE_URL: "${AUTHENTIK_AUTHORIZE_URL}"
31+
AUTHENTIK_TOKEN_URL: "${AUTHENTIK_TOKEN_URL}"
32+
SESSION_SECRET_KEY: |-
33+
${SESSION_SECRET_KEY}
34+
APITALLY_CLIENT_ID: "${APITALLY_CLIENT_ID}"

.github/dependabot.yml

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,44 @@
55

66
version: 2
77
updates:
8-
- package-ecosystem: "uv" # See documentation for possible values
9-
directory: "/" # Location of package manifests
8+
- package-ecosystem: "uv"
9+
directory: "/"
1010
schedule:
1111
interval: "weekly"
12+
day: "monday"
13+
time: "09:00"
14+
timezone: "America/Denver"
1215
target-branch: "staging"
16+
open-pull-requests-limit: 5
17+
rebase-strategy: "auto"
18+
labels:
19+
- "dependencies"
20+
- "python"
21+
groups:
22+
uv-non-major:
23+
patterns:
24+
- "*"
25+
update-types:
26+
- "minor"
27+
- "patch"
28+
29+
- package-ecosystem: "github-actions"
30+
directory: "/"
31+
schedule:
32+
interval: "weekly"
33+
day: "monday"
34+
time: "09:00"
35+
timezone: "America/Denver"
36+
target-branch: "staging"
37+
open-pull-requests-limit: 5
38+
rebase-strategy: "auto"
39+
labels:
40+
- "dependencies"
41+
- "github-actions"
42+
groups:
43+
gha-minor-and-patch:
44+
patterns:
45+
- "*"
46+
update-types:
47+
- "minor"
48+
- "patch"

.github/workflows/CD_production.yml

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ jobs:
1515

1616
steps:
1717
- name: Check out source repository
18-
uses: actions/checkout@v4
18+
uses: actions/checkout@v6.0.2
1919
with:
2020
fetch-depth: 0
2121

2222
- name: Install uv in container
23-
uses: astral-sh/setup-uv@v6
23+
uses: astral-sh/setup-uv@v7.3.1
2424
with:
2525
version: "latest"
2626

@@ -33,7 +33,7 @@ jobs:
3333
--output-file requirements.txt
3434
3535
- name: Authenticate to Google Cloud
36-
uses: 'google-github-actions/auth@v2'
36+
uses: 'google-github-actions/auth@v3'
3737
with:
3838
credentials_json: ${{ secrets.CLOUD_DEPLOY_SERVICE_ACCOUNT_KEY }}
3939

@@ -47,33 +47,37 @@ jobs:
4747
run: |
4848
uv run alembic upgrade head
4949
50-
- name: Create app.yaml
50+
- name: Ensure envsubst is available
5151
run: |
52-
cat <<EOF > app.yaml
53-
service: ocotillo-api
54-
runtime: python313
55-
entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
56-
instance_class: F4
57-
service_account: "${{ secrets.CLOUD_SQL_USER }}.gserviceaccount.com"
58-
handlers:
59-
- url: /.*
60-
secure: always
61-
script: auto
62-
env_variables:
63-
MODE: "production"
64-
DB_DRIVER: "cloudsql"
65-
CLOUD_SQL_INSTANCE_NAME: "${{ secrets.CLOUD_SQL_INSTANCE_NAME }}"
66-
CLOUD_SQL_DATABASE: "${{ vars.CLOUD_SQL_DATABASE }}"
67-
CLOUD_SQL_USER: "${{ secrets.CLOUD_SQL_USER }}"
68-
CLOUD_SQL_IAM_AUTH: true
69-
GCS_SERVICE_ACCOUNT_KEY: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
70-
GCS_BUCKET_NAME: "${{ vars.GCS_BUCKET_NAME }}"
71-
AUTHENTIK_URL: "${{ vars.AUTHENTIK_URL }}"
72-
AUTHENTIK_CLIENT_ID: "${{ vars.AUTHENTIK_CLIENT_ID }}"
73-
AUTHENTIK_AUTHORIZE_URL: "${{ vars.AUTHENTIK_AUTHORIZE_URL }}"
74-
AUTHENTIK_TOKEN_URL: "${{ vars.AUTHENTIK_TOKEN_URL }}"
75-
SESSION_SECRET_KEY: "${{ secrets.SESSION_SECRET_KEY }}"
76-
EOF
52+
if ! command -v envsubst >/dev/null 2>&1; then
53+
sudo apt-get update
54+
sudo apt-get install -y gettext-base
55+
fi
56+
57+
- name: Render app.yaml
58+
env:
59+
SERVICE_NAME: "ocotillo-api"
60+
ENVIRONMENT: "production"
61+
CLOUD_SQL_INSTANCE_NAME: "${{ secrets.CLOUD_SQL_INSTANCE_NAME }}"
62+
CLOUD_SQL_DATABASE: "${{ vars.CLOUD_SQL_DATABASE }}"
63+
CLOUD_SQL_USER: "${{ secrets.CLOUD_SQL_USER }}"
64+
PYGEOAPI_POSTGRES_DB: "${{ vars.CLOUD_SQL_DATABASE }}"
65+
PYGEOAPI_POSTGRES_USER: "${{ secrets.PYGEOAPI_POSTGRES_USER }}"
66+
PYGEOAPI_POSTGRES_HOST: "${{ vars.PYGEOAPI_POSTGRES_HOST || '127.0.0.1' }}"
67+
PYGEOAPI_POSTGRES_PORT: "${{ vars.PYGEOAPI_POSTGRES_PORT || '5432' }}"
68+
PYGEOAPI_POSTGRES_PASSWORD: "${{ secrets.PYGEOAPI_POSTGRES_PASSWORD }}"
69+
PYGEOAPI_SERVER_URL: "${{ vars.PYGEOAPI_SERVER_URL }}"
70+
CLOUD_SQL_IAM_AUTH: "true"
71+
GCS_SERVICE_ACCOUNT_KEY: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
72+
GCS_BUCKET_NAME: "${{ vars.GCS_BUCKET_NAME }}"
73+
AUTHENTIK_URL: "${{ vars.AUTHENTIK_URL }}"
74+
AUTHENTIK_CLIENT_ID: "${{ vars.AUTHENTIK_CLIENT_ID }}"
75+
AUTHENTIK_AUTHORIZE_URL: "${{ vars.AUTHENTIK_AUTHORIZE_URL }}"
76+
AUTHENTIK_TOKEN_URL: "${{ vars.AUTHENTIK_TOKEN_URL }}"
77+
SESSION_SECRET_KEY: "${{ secrets.SESSION_SECRET_KEY }}"
78+
APITALLY_CLIENT_ID: "${{ vars.APITALLY_CLIENT_ID }}"
79+
run: |
80+
envsubst < .github/app.template.yaml > app.yaml
7781
7882
- name: Deploy to Google Cloud
7983
run: |

.github/workflows/CD_staging.yml

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ jobs:
1515

1616
steps:
1717
- name: Check out source repository
18-
uses: actions/checkout@v4
18+
uses: actions/checkout@v6.0.2
1919
with:
2020
fetch-depth: 0
2121

2222
- name: Install uv in container
23-
uses: astral-sh/setup-uv@v6
23+
uses: astral-sh/setup-uv@v7.3.1
2424
with:
2525
version: "latest"
2626

@@ -33,7 +33,7 @@ jobs:
3333
--output-file requirements.txt
3434
3535
- name: Authenticate to Google Cloud
36-
uses: 'google-github-actions/auth@v2'
36+
uses: 'google-github-actions/auth@v3'
3737
with:
3838
credentials_json: ${{ secrets.CLOUD_DEPLOY_SERVICE_ACCOUNT_KEY }}
3939

@@ -47,34 +47,37 @@ jobs:
4747
run: |
4848
uv run alembic upgrade head
4949
50-
# Uses Google Cloud Secret Manager to store secret credentials
51-
- name: Create app.yaml
50+
- name: Ensure envsubst is available
5251
run: |
53-
cat <<EOF > app.yaml
54-
service: ocotillo-api-staging
55-
runtime: python313
56-
entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
57-
service_account: "${{ secrets.CLOUD_SQL_USER }}.gserviceaccount.com"
58-
instance_class: F4
59-
handlers:
60-
- url: /.*
61-
secure: always
62-
script: auto
63-
env_variables:
64-
MODE: "production"
65-
DB_DRIVER: "cloudsql"
66-
CLOUD_SQL_INSTANCE_NAME: "${{ secrets.CLOUD_SQL_INSTANCE_NAME }}"
67-
CLOUD_SQL_DATABASE: "${{ vars.CLOUD_SQL_DATABASE }}"
68-
CLOUD_SQL_USER: "${{ secrets.CLOUD_SQL_USER }}"
69-
CLOUD_SQL_IAM_AUTH: true
70-
GCS_SERVICE_ACCOUNT_KEY: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
71-
GCS_BUCKET_NAME: "${{ vars.GCS_BUCKET_NAME }}"
72-
AUTHENTIK_URL: "${{ vars.AUTHENTIK_URL }}"
73-
AUTHENTIK_CLIENT_ID: "${{ vars.AUTHENTIK_CLIENT_ID }}"
74-
AUTHENTIK_AUTHORIZE_URL: "${{ vars.AUTHENTIK_AUTHORIZE_URL }}"
75-
AUTHENTIK_TOKEN_URL: "${{ vars.AUTHENTIK_TOKEN_URL }}"
76-
SESSION_SECRET_KEY: "${{ secrets.SESSION_SECRET_KEY }}"
77-
EOF
52+
if ! command -v envsubst >/dev/null 2>&1; then
53+
sudo apt-get update
54+
sudo apt-get install -y gettext-base
55+
fi
56+
57+
- name: Render app.yaml
58+
env:
59+
SERVICE_NAME: "ocotillo-api-staging"
60+
ENVIRONMENT: "staging"
61+
CLOUD_SQL_INSTANCE_NAME: "${{ secrets.CLOUD_SQL_INSTANCE_NAME }}"
62+
CLOUD_SQL_DATABASE: "${{ vars.CLOUD_SQL_DATABASE }}"
63+
CLOUD_SQL_USER: "${{ secrets.CLOUD_SQL_USER }}"
64+
PYGEOAPI_POSTGRES_DB: "${{ vars.CLOUD_SQL_DATABASE }}"
65+
PYGEOAPI_POSTGRES_USER: "${{ secrets.PYGEOAPI_POSTGRES_USER }}"
66+
PYGEOAPI_POSTGRES_HOST: "${{ vars.PYGEOAPI_POSTGRES_HOST || '127.0.0.1' }}"
67+
PYGEOAPI_POSTGRES_PORT: "${{ vars.PYGEOAPI_POSTGRES_PORT || '5432' }}"
68+
PYGEOAPI_POSTGRES_PASSWORD: "${{ secrets.PYGEOAPI_POSTGRES_PASSWORD }}"
69+
PYGEOAPI_SERVER_URL: "${{ vars.PYGEOAPI_SERVER_URL }}"
70+
CLOUD_SQL_IAM_AUTH: "true"
71+
GCS_SERVICE_ACCOUNT_KEY: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
72+
GCS_BUCKET_NAME: "${{ vars.GCS_BUCKET_NAME }}"
73+
AUTHENTIK_URL: "${{ vars.AUTHENTIK_URL }}"
74+
AUTHENTIK_CLIENT_ID: "${{ vars.AUTHENTIK_CLIENT_ID }}"
75+
AUTHENTIK_AUTHORIZE_URL: "${{ vars.AUTHENTIK_AUTHORIZE_URL }}"
76+
AUTHENTIK_TOKEN_URL: "${{ vars.AUTHENTIK_TOKEN_URL }}"
77+
SESSION_SECRET_KEY: "${{ secrets.SESSION_SECRET_KEY }}"
78+
APITALLY_CLIENT_ID: "${{ vars.APITALLY_CLIENT_ID }}"
79+
run: |
80+
envsubst < .github/app.template.yaml > app.yaml
7881
7982
- name: Deploy to Google Cloud
8083
run: |
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Dependabot auto-merge
2+
3+
on:
4+
pull_request:
5+
types: [opened, reopened, synchronize, ready_for_review]
6+
7+
permissions:
8+
contents: write
9+
pull-requests: write
10+
11+
jobs:
12+
automerge:
13+
if: github.actor == 'dependabot[bot]' && github.event.pull_request.user.login == 'dependabot[bot]'
14+
runs-on: ubuntu-latest
15+
16+
steps:
17+
- name: Fetch Dependabot metadata
18+
id: metadata
19+
uses: dependabot/fetch-metadata@v2
20+
with:
21+
github-token: ${{ secrets.GITHUB_TOKEN }}
22+
23+
# Auto-approve (only matters if your branch protection requires reviews)
24+
- name: Approve PR
25+
if: steps.metadata.outputs.update-type != 'version-update:semver-major'
26+
uses: actions/github-script@v8
27+
with:
28+
github-token: ${{ secrets.GITHUB_TOKEN }}
29+
script: |
30+
const { data: reviews } = await github.rest.pulls.listReviews({
31+
owner: context.repo.owner,
32+
repo: context.repo.repo,
33+
pull_number: context.payload.pull_request.number,
34+
});
35+
36+
const alreadyApprovedByBot = reviews.some(
37+
(review) =>
38+
review.state === "APPROVED" &&
39+
review.user?.login === "github-actions[bot]"
40+
);
41+
42+
if (!alreadyApprovedByBot) {
43+
await github.rest.pulls.createReview({
44+
owner: context.repo.owner,
45+
repo: context.repo.repo,
46+
pull_number: context.payload.pull_request.number,
47+
event: "APPROVE",
48+
});
49+
}
50+
51+
# Enable GitHub auto-merge; it will merge once required checks (your Test Suite) are green
52+
- name: Enable auto-merge (squash)
53+
if: steps.metadata.outputs.update-type != 'version-update:semver-major'
54+
uses: peter-evans/enable-pull-request-automerge@v3
55+
with:
56+
token: ${{ secrets.GITHUB_TOKEN }}
57+
pull-request-number: ${{ github.event.pull_request.number }}
58+
merge-method: squash

.github/workflows/format_code.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ jobs:
1717
runs-on: ubuntu-latest
1818
steps:
1919
- name: Check out source repository
20-
uses: actions/checkout@v4
20+
uses: actions/checkout@v6.0.2
2121
- name: Set up Python environment - 3.12
22-
uses: actions/setup-python@v5
22+
uses: actions/setup-python@v6.2.0
2323
with:
2424
python-version: "3.12"
2525
cache: "pip"
2626
- name: Run flake8
27-
uses: py-actions/flake8@v1
27+
uses: py-actions/flake8@v2
2828
with:
2929
ignore: "F401,E501"
3030
args: "--exit-zero --select=E"
@@ -34,15 +34,15 @@ jobs:
3434
contents: write
3535
pull-requests: write
3636
steps:
37-
- uses: actions/checkout@v4
37+
- uses: actions/checkout@v6.0.2
3838
with:
3939
ref: ${{ github.head_ref }}
4040
- uses: psf/black@stable
4141
with:
4242
options: "--verbose"
4343

4444
- name: Commit changes
45-
uses: stefanzweifel/git-auto-commit-action@v4.1.2
45+
uses: stefanzweifel/git-auto-commit-action@v7.1.0
4646
with:
4747
commit_message: Formatting changes
4848
branch: ${{ github.head_ref }}

0 commit comments

Comments
 (0)