1+ name : Release Single AMI Nix
2+
3+ on :
4+ workflow_dispatch :
5+ inputs :
6+ postgres_version :
7+ description : ' PostgreSQL major version to build (e.g. 15)'
8+ required : true
9+ type : string
10+ branch :
11+ description : ' Branch to run the workflow from'
12+ required : true
13+ type : string
14+ default : ' main'
15+
16+ permissions :
17+ contents : write
18+ id-token : write
19+
20+ jobs :
21+ build :
22+ runs-on : arm-runner
23+ timeout-minutes : 150
24+
25+ steps :
26+ - name : Checkout Repo
27+ uses : actions/checkout@v3
28+ with :
29+ ref : ${{ github.event.inputs.branch }}
30+
31+ - uses : DeterminateSystems/nix-installer-action@main
32+
33+ - name : Set PostgreSQL version environment variable
34+ run : echo "POSTGRES_MAJOR_VERSION=${{ github.event.inputs.postgres_version }}" >> $GITHUB_ENV
35+
36+ - name : Generate common-nix.vars.pkr.hcl
37+ run : |
38+ PG_VERSION=$(sudo nix run nixpkgs#yq -- '.postgres_release["postgres'${{ env.POSTGRES_MAJOR_VERSION }}'"]' ansible/vars.yml)
39+ PG_VERSION=$(echo "$PG_VERSION" | tr -d '"') # Remove any surrounding quotes
40+ echo 'postgres-version = "'$PG_VERSION'"' > common-nix.vars.pkr.hcl
41+ # Ensure there's a newline at the end of the file
42+ echo "" >> common-nix.vars.pkr.hcl
43+
44+ - name : Build AMI stage 1
45+ env :
46+ POSTGRES_MAJOR_VERSION : ${{ env.POSTGRES_MAJOR_VERSION }}
47+ run : |
48+ packer init amazon-arm64-nix.pkr.hcl
49+ GIT_SHA=${{github.sha}}
50+ packer build -var "git-head-version=${GIT_SHA}" -var "packer-execution-id=${GITHUB_RUN_ID}" -var-file="development-arm.vars.pkr.hcl" -var-file="common-nix.vars.pkr.hcl" -var "ansible_arguments=-e postgresql_major=${POSTGRES_MAJOR_VERSION}" amazon-arm64-nix.pkr.hcl
51+
52+ - name : Build AMI stage 2
53+ env :
54+ POSTGRES_MAJOR_VERSION : ${{ env.POSTGRES_MAJOR_VERSION }}
55+ run : |
56+ packer init stage2-nix-psql.pkr.hcl
57+ GIT_SHA=${{github.sha}}
58+ POSTGRES_MAJOR_VERSION=${{ env.POSTGRES_MAJOR_VERSION }}
59+ packer build -var "git_sha=${GIT_SHA}" -var "git-head-version=${GIT_SHA}" -var "packer-execution-id=${GITHUB_RUN_ID}" -var "postgres_major_version=${POSTGRES_MAJOR_VERSION}" -var-file="development-arm.vars.pkr.hcl" -var-file="common-nix.vars.pkr.hcl" stage2-nix-psql.pkr.hcl
60+
61+ - name : Grab release version
62+ id : process_release_version
63+ run : |
64+ VERSION=$(cat common-nix.vars.pkr.hcl | sed -e 's/postgres-version = "\(.*\)"/\1/g')
65+ echo "version=$VERSION" >> $GITHUB_OUTPUT
66+
67+ - name : Create nix flake revision tarball
68+ run : |
69+ GIT_SHA=${{github.sha}}
70+ MAJOR_VERSION=${{ env.POSTGRES_MAJOR_VERSION }}
71+
72+ mkdir -p "/tmp/pg_upgrade_bin/${MAJOR_VERSION}"
73+ echo "$GIT_SHA" >> "/tmp/pg_upgrade_bin/${MAJOR_VERSION}/nix_flake_version"
74+ tar -czf "/tmp/pg_binaries.tar.gz" -C "/tmp/pg_upgrade_bin" .
75+
76+ - name : configure aws credentials - staging
77+ uses : aws-actions/configure-aws-credentials@v4
78+ with :
79+ role-to-assume : ${{ secrets.DEV_AWS_ROLE }}
80+ aws-region : " us-east-1"
81+
82+ - name : Upload software manifest to s3 staging
83+ run : |
84+ cd ansible
85+ ansible-playbook -i localhost \
86+ -e "ami_release_version=${{ steps.process_release_version.outputs.version }}" \
87+ -e "internal_artifacts_bucket=${{ secrets.ARTIFACTS_BUCKET }}" \
88+ -e "postgres_major_version=${{ env.POSTGRES_MAJOR_VERSION }}" \
89+ manifest-playbook.yml
90+
91+ - name : Upload nix flake revision to s3 staging
92+ run : |
93+ aws s3 cp /tmp/pg_binaries.tar.gz s3://${{ secrets.ARTIFACTS_BUCKET }}/upgrades/postgres/supabase-postgres-${{ steps.process_release_version.outputs.version }}/20.04.tar.gz
94+
95+ - name : configure aws credentials - prod
96+ uses : aws-actions/configure-aws-credentials@v4
97+ with :
98+ role-to-assume : ${{ secrets.PROD_AWS_ROLE }}
99+ aws-region : " us-east-1"
100+
101+ - name : Upload software manifest to s3 prod
102+ run : |
103+ cd ansible
104+ ansible-playbook -i localhost \
105+ -e "ami_release_version=${{ steps.process_release_version.outputs.version }}" \
106+ -e "internal_artifacts_bucket=${{ secrets.PROD_ARTIFACTS_BUCKET }}" \
107+ -e "postgres_major_version=${{ env.POSTGRES_MAJOR_VERSION }}" \
108+ manifest-playbook.yml
109+
110+ - name : Upload nix flake revision to s3 prod
111+ run : |
112+ aws s3 cp /tmp/pg_binaries.tar.gz s3://${{ secrets.PROD_ARTIFACTS_BUCKET }}/upgrades/postgres/supabase-postgres-${{ steps.process_release_version.outputs.version }}/20.04.tar.gz
113+
114+ - name : Create release
115+ uses : softprops/action-gh-release@v2
116+ with :
117+ name : ${{ steps.process_release_version.outputs.version }}
118+ tag_name : ${{ steps.process_release_version.outputs.version }}
119+ target_commitish : ${{github.sha}}
120+
121+ - name : Slack Notification on Failure
122+ if : ${{ failure() }}
123+ uses : rtCamp/action-slack-notify@v2
124+ env :
125+ SLACK_WEBHOOK : ${{ secrets.SLACK_NOTIFICATIONS_WEBHOOK }}
126+ SLACK_USERNAME : ' gha-failures-notifier'
127+ SLACK_COLOR : ' danger'
128+ SLACK_MESSAGE : ' Building Postgres AMI failed'
129+ SLACK_FOOTER : ' '
130+
131+ - name : Cleanup resources after build
132+ if : ${{ always() }}
133+ run : |
134+ aws ec2 describe-instances --filters "Name=tag:packerExecutionId,Values=${GITHUB_RUN_ID}" --query "Reservations[].Instances[].InstanceId" --output text | xargs -r aws ec2 terminate-instances --instance-ids
135+
136+ - name : Cleanup resources on build cancellation
137+ if : ${{ cancelled() }}
138+ run : |
139+ aws ec2 describe-instances --filters "Name=tag:packerExecutionId,Values=${GITHUB_RUN_ID}" --query "Reservations[].Instances[].InstanceId" --output text | xargs -r aws ec2 terminate-instances --instance-ids
0 commit comments