Skip to content

Commit 3dffe2b

Browse files
committed
ci: set up production promotion workflow
[skip ci]
1 parent c74e93c commit 3dffe2b

2 files changed

Lines changed: 74 additions & 3 deletions

File tree

.github/workflows/promote.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
name: Promote Staging to Production
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
promote:
8+
runs-on: ubuntu-latest
9+
env:
10+
GH_TOKEN: ${{ github.token }}
11+
steps:
12+
- name: Find latest successful staging deployment
13+
id: staging
14+
run: |
15+
DEPLOYMENT_JSON=$(gh api \
16+
-H "Accept: application/vnd.github+json" \
17+
repos/${{ github.repository }}/deployments \
18+
--jq '.[] | select(.environment == "staging")' | head -n1)
19+
20+
echo "ref=$(echo "$DEPLOYMENT_JSON" | jq -r '.ref')" >> "$GITHUB_OUTPUT"
21+
echo "sha=$(echo "$DEPLOYMENT_JSON" | jq -r '.sha')" >> "$GITHUB_OUTPUT"
22+
23+
- name: Create production deployment
24+
id: prod_deploy
25+
run: |
26+
jq -n \
27+
--arg ref "${{ steps.staging.outputs.ref }}" \
28+
--arg sha "${{ steps.staging.outputs.sha }}" \
29+
--arg environment "production" \
30+
'{ref: $ref, sha: $sha, environment: $environment, auto_merge: false, required_contexts: []}' \
31+
> payload.json
32+
33+
DEPLOY_ID=$(gh api \
34+
-X POST \
35+
-H "Accept: application/vnd.github+json" \
36+
repos/${{ github.repository }}/deployments \
37+
--input payload.json \
38+
--jq '.id')
39+
40+
echo "id=$DEPLOY_ID" >> "$GITHUB_OUTPUT"
41+
42+
- uses: ilyvion-contrib/ci-utils/setup-ssh@main
43+
with:
44+
ssh_known_hosts: ${{ secrets.deploy_known_hosts }}
45+
ssh_private_key: ${{ secrets.deploy_key }}
46+
ssh_host: ${{ secrets.deploy_target }}
47+
ssh_port: ${{ secrets.deploy_port }}
48+
49+
- name: Trigger promote script on server
50+
run: |
51+
ssh -i ~/.ssh/id -p ${{ secrets.deploy_port }} \
52+
${{ secrets.deploy_user }}@${{ secrets.deploy_target }} \
53+
'cd ~/docker/${{ inputs.image }}/; sudo promote-staging-to-prod.sh'
54+
55+
- name: Mark deployment as success
56+
if: success()
57+
run: |
58+
gh api \
59+
-X POST \
60+
-H "Accept: application/vnd.github+json" \
61+
repos/${{ github.repository }}/deployments/${{ steps.prod_deploy.outputs.id }}/statuses \
62+
-f state="success"
63+
64+
- name: Mark deployment as failure
65+
if: failure()
66+
run: |
67+
gh api \
68+
-X POST \
69+
-H "Accept: application/vnd.github+json" \
70+
repos/${{ github.repository }}/deployments/${{ steps.prod_deploy.outputs.id }}/statuses \
71+
-f state="failure"

.github/workflows/workflow.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jobs:
4141
"description": "Deploying to staging"
4242
}')
4343
deployment_id=$(echo "$deployment_response" | jq -r '.id')
44-
echo "deployment_id=$id" >> "$GITHUB_OUTPUT"
44+
echo "deployment_id=$deployment_id" >> "$GITHUB_OUTPUT"
4545
4646
curl -fsS -X POST \
4747
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
@@ -71,7 +71,7 @@ jobs:
7171
https://api.github.com/repos/${{ github.repository }}/deployments/${{ steps.create_deployment.outputs.deployment_id }}/statuses \
7272
-d '{
7373
"state": "success",
74-
"description": "Deployment succeeded",
74+
"description": "Deployment succeeded"
7575
}'
7676
7777
report-failure:
@@ -87,5 +87,5 @@ jobs:
8787
https://api.github.com/repos/${{ github.repository }}/deployments/${{ needs.deploy.outputs.deployment_id }}/statuses \
8888
-d '{
8989
"state": "failure",
90-
"description": "Deployment failed",
90+
"description": "Deployment failed"
9191
}'

0 commit comments

Comments
 (0)