Skip to content

Commit d9fe3e1

Browse files
committed
ci: refactor github workflow, add requirements.txt
1 parent a8a415a commit d9fe3e1

File tree

6 files changed

+253
-155
lines changed

6 files changed

+253
-155
lines changed

.github/actions/deploy/action.yml

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
name: Deploy to GCP
2+
description: Deploy to GCP
3+
inputs:
4+
project_id:
5+
description: "The GCP project ID"
6+
required: true
7+
identity_provider:
8+
description: "The identity provider for the workload identity"
9+
required: true
10+
service_account_email:
11+
description: "The service account email"
12+
required: true
13+
storage_bucket:
14+
description: "The GCP storage bucket"
15+
required: true
16+
17+
runs:
18+
using: composite
19+
steps:
20+
- name: Set globals
21+
id: globals
22+
shell: bash
23+
run: |
24+
echo "MAIN_SCHEDULE_NAME=skidname_main" >> "${GITHUB_OUTPUT}"
25+
echo "MAIN_SCHEDULE_CRON=0 22 * * 6" >> "${GITHUB_OUTPUT}"
26+
echo "MAIN_SCHEDULE_DESCRIPTION=Trigger the skidname-skid bot every saturday evening at 10pm" >> "${GITHUB_OUTPUT}"
27+
echo "VALIDATOR_SCHEDULE_NAME=validator" >> "${GITHUB_OUTPUT}"
28+
echo "VALIDATOR_SCHEDULE_DESCRIPTION=Trigger the skidname validation bot every 1st of April, May, and June at 8am" >> "${GITHUB_OUTPUT}"
29+
echo "VALIDATOR_SCHEDULE_CRON=0 8 1 4-6 *" >> "${GITHUB_OUTPUT}"
30+
echo "TOPIC_NAME=skidname-topic" >> "${GITHUB_OUTPUT}"
31+
32+
- name: ⬇️ Set up code
33+
uses: actions/checkout@v4
34+
with:
35+
show-progress: false
36+
37+
- name: 🗝️ Authenticate to Google Cloud
38+
id: auth
39+
uses: google-github-actions/auth@v2
40+
with:
41+
create_credentials_file: true
42+
token_format: access_token
43+
workload_identity_provider: ${{ inputs.identity_provider }}
44+
service_account: ${{ inputs.service_account_email }}
45+
46+
- name: 📥 Create Main PubSub topic
47+
shell: bash
48+
run: |
49+
if [ ! "$(gcloud pubsub topics list | grep ${{ steps.globals.outputs.TOPIC_NAME }})" ]; then
50+
gcloud pubsub topics create ${{ steps.globals.outputs.TOPIC_NAME }} --quiet
51+
fi
52+
53+
- name: 🚀 Deploy Cloud Function
54+
id: deploy
55+
uses: google-github-actions/deploy-cloud-functions@v3
56+
with:
57+
name: skidname-skid
58+
runtime: python311
59+
entry_point: subscribe
60+
source_dir: src/skidname
61+
service_account: cloud-function-sa@${{ inputs.project_id }}.iam.gserviceaccount.com
62+
event_trigger_type: google.cloud.pubsub.topic.v1.messagePublished
63+
event_trigger_pubsub_topic: projects/${{ inputs.project_id }}/topics/${{ steps.globals.outputs.TOPIC_NAME }}
64+
memory: 1024M
65+
service_timeout: 9m
66+
environment_variables: STORAGE_BUCKET=${{ inputs.storage_bucket }}
67+
secrets: |
68+
/secrets/app/secrets.json=${{ inputs.project_id }}/skid-secrets
69+
max_instance_count: 1
70+
event_trigger_retry: false
71+
72+
- name: 🕰️ Create Main Cloud Scheduler
73+
shell: bash
74+
run: |
75+
if [ ! "$(gcloud scheduler jobs list --location=us-central1 | grep ${{ steps.globals.outputs.MAIN_SCHEDULE_NAME }})" ]; then
76+
gcloud scheduler jobs create pubsub "${{ steps.globals.outputs.MAIN_SCHEDULE_NAME }}" \
77+
--description="${{ steps.globals.outputs.MAIN_SCHEDULE_DESCRIPTION }}" \
78+
--schedule="${{ steps.globals.outputs.MAIN_SCHEDULE_CRON }}" \
79+
--time-zone=America/Denver \
80+
--location=us-central1 \
81+
--topic="${{ steps.globals.outputs.TOPIC_NAME }}" \
82+
--message-body='run the skid' \
83+
--quiet
84+
else
85+
gcloud scheduler jobs update pubsub "${{ steps.globals.outputs.MAIN_SCHEDULE_NAME }}" \
86+
--description="${{ steps.globals.outputs.MAIN_SCHEDULE_DESCRIPTION }}" \
87+
--schedule="${{ steps.globals.outputs.MAIN_SCHEDULE_CRON }}" \
88+
--time-zone=America/Denver \
89+
--location=us-central1 \
90+
--topic="${{ steps.globals.outputs.TOPIC_NAME }}" \
91+
--message-body='run the skid' \
92+
--quiet
93+
fi
94+
95+
- name: 🕰️ Create Validator Cloud Scheduler
96+
shell: bash
97+
run: |
98+
if [ ! "$(gcloud scheduler jobs list --location=us-central1 | grep ${{ steps.globals.outputs.VALIDATOR_SCHEDULE_NAME }})" ]; then
99+
gcloud scheduler jobs create pubsub "${{ steps.globals.outputs.VALIDATOR_SCHEDULE_NAME }}" \
100+
--description="${{ steps.globals.outputs.VALIDATOR_SCHEDULE_DESCRIPTION }}" \
101+
--schedule="${{ steps.globals.outputs.VALIDATOR_SCHEDULE_CRON }}" \
102+
--time-zone=America/Denver \
103+
--location=us-central1 \
104+
--topic="${{ steps.globals.outputs.TOPIC_NAME }}" \
105+
--message-body='validate' \
106+
--quiet
107+
else
108+
gcloud scheduler jobs update pubsub "${{ steps.globals.outputs.VALIDATOR_SCHEDULE_NAME }}" \
109+
--description="${{ steps.globals.outputs.VALIDATOR_SCHEDULE_DESCRIPTION }}" \
110+
--schedule="${{ steps.globals.outputs.VALIDATOR_SCHEDULE_CRON }}" \
111+
--time-zone=America/Denver \
112+
--location=us-central1 \
113+
--topic="${{ steps.globals.outputs.TOPIC_NAME }}" \
114+
--message-body='validate' \
115+
--quiet
116+
fi

.github/workflows/pull_request.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Pull Request Events
2+
3+
on:
4+
pull_request:
5+
6+
concurrency:
7+
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
8+
cancel-in-progress: true
9+
10+
jobs:
11+
test-unit:
12+
name: Unit Tests
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: ⬇️ Set up code
17+
uses: actions/checkout@v4
18+
with:
19+
show-progress: false
20+
21+
- name: 🐍 Set up Python
22+
uses: actions/setup-python@v5
23+
with:
24+
cache: pip
25+
cache-dependency-path: setup.py
26+
27+
- name: 📥 Install dependencies
28+
run: |
29+
sudo apt-get update
30+
sudo apt-get install -y libkrb5-dev
31+
32+
- name: 🏗 Install module
33+
run: pip install .[tests]
34+
35+
- name: 🧶 Lint
36+
run: ruff check --output-format=github .
37+
38+
- name: 🧪 Run pytest
39+
run: pytest

.github/workflows/push.yml

Lines changed: 27 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,38 @@ name: Push Events
22

33
on:
44
push:
5-
branches:
6-
- main
7-
- dev
8-
pull_request:
9-
branches:
10-
- main
11-
- dev
12-
13-
env:
14-
CLOUD_FUNCTION_MEMORY: 512M
15-
CLOUD_FUCNTION_RUN_TIMEOUT: 240s
16-
SCHEDULE_NAME: monday-morning
17-
SCHEDULE_CRON: 0 9 * * 1
18-
SCHEDULE_DESCRIPTION: "Trigger the projectname-skid bot once a week on monday morning"
195

206
concurrency:
21-
group: "${{ github.head_ref || github.ref }}"
7+
group: ${{ github.workflow }}-${{ github.ref }}
228
cancel-in-progress: true
239

2410
jobs:
25-
test:
26-
name: Setup and Test
11+
release-please:
12+
name: Create release
13+
if: github.ref_name == 'main'
2714
runs-on: ubuntu-latest
15+
permissions:
16+
contents: write
17+
pull-requests: write
2818

2919
steps:
30-
- name: Checkout code
31-
uses: actions/checkout@v4
32-
with:
33-
show-progress: false
34-
35-
- name: Set up Python
36-
uses: actions/setup-python@v5
20+
- name: 🚀 Create Release
21+
id: release-please
22+
uses: agrc/release-composite-action@v1
3723
with:
38-
python-version: 3.11
39-
cache: pip
40-
cache-dependency-path: setup.py
41-
42-
- name: Install libkrb5 for Kerberos on Linux
43-
run: |
44-
sudo apt-get update
45-
sudo apt-get install -y libkrb5-dev
46-
47-
- name: Install module
48-
run: pip install .[tests]
49-
50-
- name: Test with pytest
51-
run: pytest
24+
release-type: python
25+
prerelease: ${{ github.ref_name == 'dev' }}
26+
repo-token: ${{ secrets.GITHUB_TOKEN }}
27+
github-app-id: ${{ secrets.UGRC_RELEASE_BOT_APP_ID }}
28+
github-app-key: ${{ secrets.UGRC_RELEASE_BOT_APP_KEY }}
29+
github-app-name: ${{ secrets.UGRC_RELEASE_BOT_NAME }}
30+
github-app-email: ${{ secrets.UGRC_RELEASE_BOT_EMAIL }}
31+
extra-files: src/skidname/version.py
5232

5333
deploy-dev:
54-
name: Deploy to GCF
55-
needs: test
34+
name: Deploy to GCF - dev
5635
runs-on: ubuntu-latest
57-
if: github.ref == 'refs/heads/dev'
36+
if: github.ref_name == 'dev'
5837
environment:
5938
name: dev
6039
permissions:
@@ -64,117 +43,14 @@ jobs:
6443
steps:
6544
- name: ⬇️ Set up code
6645
uses: actions/checkout@v4
67-
68-
- name: 🗝️ Authenticate to Google Cloud
69-
id: auth
70-
uses: google-github-actions/auth@v2
71-
with:
72-
create_credentials_file: true
73-
token_format: access_token
74-
workload_identity_provider: ${{ secrets.IDENTITY_PROVIDER }}
75-
service_account: ${{ secrets.SERVICE_ACCOUNT_EMAIL }}
76-
77-
- name: 🚀 Deploy to Cloud Function
78-
id: deploy
79-
uses: google-github-actions/deploy-cloud-functions@v3
80-
timeout-minutes: 15
81-
with:
82-
name: projectname-skid
83-
runtime: python311
84-
entry_point: subscribe
85-
source_dir: src/projectname
86-
service_account: cloud-function-sa@${{ secrets.PROJECT_ID }}.iam.gserviceaccount.com
87-
event_trigger_type: google.cloud.pubsub.topic.v1.messagePublished
88-
event_trigger_pubsub_topic: projects/${{ secrets.PROJECT_ID }}/topics/${{ env.SCHEDULE_NAME }}-topic
89-
memory: ${{ env.CLOUD_FUNCTION_MEMORY }}
90-
service_timeout: ${{ env.CLOUD_FUNCTION_RUN_TIMEOUT }}
91-
environment_variables: STORAGE_BUCKET=${{secrets.STORAGE_BUCKET}}
92-
secrets: |
93-
/secrets/app/secrets.json=${{secrets.PROJECT_ID}}/skid-secrets
94-
max_instance_count: 1
95-
event_trigger_retry: false
96-
97-
- name: 📥 Create PubSub topic
98-
run: |
99-
if [ ! "$(gcloud pubsub topics list | grep $SCHEDULE_NAME-topic)" ]; then
100-
gcloud pubsub topics create $SCHEDULE_NAME-topic --quiet
101-
fi
102-
103-
- name: 🕰️ Create Cloud Scheduler
104-
run: |
105-
for i in $(gcloud scheduler jobs list --location=us-central1 --uri); do
106-
gcloud scheduler jobs delete $i --quiet
107-
done
108-
gcloud scheduler jobs create pubsub $SCHEDULE_NAME \
109-
--description="$SCHEDULE_DESCRIPTION" \
110-
--schedule="$SCHEDULE_CRON" \
111-
--time-zone=America/Denver \
112-
--location=us-central1 \
113-
--topic=$SCHEDULE_NAME-topic \
114-
--message-body='foo' \
115-
--quiet
116-
117-
deploy-prod:
118-
name: Deploy to GCF
119-
needs: test
120-
runs-on: ubuntu-latest
121-
if: github.ref == 'refs/heads/main'
122-
environment:
123-
name: prod
124-
permissions:
125-
id-token: write
126-
contents: read
127-
128-
steps:
129-
- name: ⬇️ Set up code
130-
uses: actions/checkout@v4
131-
132-
- name: 🗝️ Authenticate to Google Cloud
133-
id: auth
134-
uses: google-github-actions/auth@v2
13546
with:
136-
create_credentials_file: true
137-
token_format: access_token
138-
workload_identity_provider: ${{ secrets.IDENTITY_PROVIDER }}
139-
service_account: ${{ secrets.SERVICE_ACCOUNT_EMAIL }}
47+
show-progress: false
14048

141-
- name: 🚀 Deploy to Cloud Function
142-
id: deploy
143-
uses: google-github-actions/deploy-cloud-functions@v3
49+
- name: Deploy
50+
uses: ./.github/actions/deploy
14451
timeout-minutes: 15
14552
with:
146-
name: projectname-skid
147-
runtime: python311
148-
entry_point: main
149-
source_dir: src/projectname
150-
service_account: cloud-function-sa@${{ secrets.PROJECT_ID }}.iam.gserviceaccount.com
151-
event_trigger_type: google.cloud.pubsub.topic.v1.messagePublished
152-
event_trigger_pubsub_topic: projects/${{ secrets.PROJECT_ID }}/topics/${{ env.SCHEDULE_NAME }}-topic
153-
memory: ${{ env.CLOUD_FUNCTION_MEMORY }}
154-
service_timeout: ${{ env.CLOUD_FUNCTION_RUN_TIMEOUT }}
155-
environment_variables: STORAGE_BUCKET=${{secrets.STORAGE_BUCKET}}
156-
secrets: |
157-
/secrets/ftp/known_hosts=${{secrets.PROJECT_ID}}/known_hosts
158-
/secrets/app/secrets.json=${{secrets.PROJECT_ID}}/skid-secrets
159-
max_instance_count: 1
160-
event_trigger_retry: false
161-
162-
- name: 📥 Create PubSub topic
163-
run: |
164-
if [ ! "$(gcloud pubsub topics list | grep $SCHEDULE_NAME-topic)" ]; then
165-
gcloud pubsub topics create $SCHEDULE_NAME-topic --quiet
166-
fi
167-
168-
- name: 🕰️ Create Cloud Scheduler
169-
run: |
170-
for i in $(gcloud scheduler jobs list --location=us-central1 --uri); do
171-
gcloud scheduler jobs delete $i --quiet
172-
done
173-
gcloud scheduler jobs create pubsub $SCHEDULE_NAME \
174-
--description="$SCHEDULE_DESCRIPTION" \
175-
--schedule="$SCHEDULE_CRON" \
176-
--time-zone=America/Denver \
177-
--location=us-central1 \
178-
--topic=$SCHEDULE_NAME-topic \
179-
--message-body='{"run": "now"}' \
180-
--quiet
53+
project_id: ${{ secrets.PROJECT_ID }}
54+
identity_provider: ${{ secrets.IDENTITY_PROVIDER }}
55+
service_account_email: ${{ secrets.SERVICE_ACCOUNT_EMAIL }}
56+
storage_bucket: ${{ secrets.STORAGE_BUCKET }}

0 commit comments

Comments
 (0)