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