universo-platform-2d
213 строк · 8.3 Кб
1name: Deploy
2
3on:
4workflow_dispatch:
5inputs:
6flavor:
7description: 'Select what enverionment to deploy to'
8type: choice
9default: canary
10options:
11- canary
12- beta
13- stable
14- internal
15env:
16NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
17
18permissions:
19contents: 'write'
20id-token: 'write'
21packages: 'write'
22
23jobs:
24output-prev-version:
25name: Output previous version
26runs-on: ubuntu-latest
27environment: ${{ github.event.inputs.flavor }}
28outputs:
29prev: ${{ steps.print.outputs.version }}
30namespace: ${{ steps.print.outputs.namespace }}
31steps:
32- uses: actions/checkout@v4
33- name: Auth to Cluster
34uses: './.github/actions/cluster-auth'
35with:
36gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
37gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
38service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
39cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
40cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
41- name: Output previous version
42id: print
43run: |
44namespace=""
45if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
46namespace="dev"
47elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
48namespace="beta"
49elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
50namespace="production"
51else
52echo "Invalid flavor: ${{ github.event.inputs.flavor }}"
53exit 1
54fi
55
56echo "Namespace set to: $namespace"
57
58# Get the previous version from the deployment
59prev_version=$(kubectl get deployment -n $namespace affine-graphql -o=jsonpath='{.spec.template.spec.containers[0].image}' | awk -F '-' '{print $3}')
60
61echo "Previous version: $prev_version"
62echo "version=$prev_version" >> $GITHUB_OUTPUT
63echo "namesapce=$namespace" >> $GITHUB_OUTPUT
64
65build-images:
66name: Build Images
67uses: ./.github/workflows/build-images.yml
68secrets: inherit
69with:
70flavor: ${{ github.event.inputs.flavor }}
71
72deploy:
73name: Deploy to cluster
74if: ${{ github.event_name == 'workflow_dispatch' }}
75environment: ${{ github.event.inputs.flavor }}
76needs:
77- build-images
78runs-on: ubuntu-latest
79steps:
80- uses: actions/checkout@v4
81- name: Setup Version
82id: version
83uses: ./.github/actions/setup-version
84- name: Deploy to ${{ github.event.inputs.flavor }}
85uses: ./.github/actions/deploy
86with:
87build-type: ${{ github.event.inputs.flavor }}
88gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
89gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
90service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
91cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
92cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
93env:
94APP_VERSION: ${{ steps.version.outputs.APP_VERSION }}
95DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
96CANARY_DEPLOY_HOST: ${{ secrets.CANARY_DEPLOY_HOST }}
97R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
98R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
99R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
100CAPTCHA_TURNSTILE_SECRET: ${{ secrets.CAPTCHA_TURNSTILE_SECRET }}
101COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
102COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
103COPILOT_UNSPLASH_API_KEY: ${{ secrets.COPILOT_UNSPLASH_API_KEY }}
104METRICS_CUSTOMER_IO_TOKEN: ${{ secrets.METRICS_CUSTOMER_IO_TOKEN }}
105MAILER_SENDER: ${{ secrets.OAUTH_EMAIL_SENDER }}
106MAILER_USER: ${{ secrets.OAUTH_EMAIL_LOGIN }}
107MAILER_PASSWORD: ${{ secrets.OAUTH_EMAIL_PASSWORD }}
108GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
109AFFINE_GOOGLE_CLIENT_ID: ${{ secrets.AFFINE_GOOGLE_CLIENT_ID }}
110AFFINE_GOOGLE_CLIENT_SECRET: ${{ secrets.AFFINE_GOOGLE_CLIENT_SECRET }}
111DATABASE_URL: ${{ secrets.DATABASE_URL }}
112DATABASE_USERNAME: ${{ secrets.DATABASE_USERNAME }}
113DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
114DATABASE_NAME: ${{ secrets.DATABASE_NAME }}
115GCLOUD_CONNECTION_NAME: ${{ secrets.GCLOUD_CONNECTION_NAME }}
116GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT: ${{ secrets.GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT }}
117REDIS_HOST: ${{ secrets.REDIS_HOST }}
118REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }}
119CLOUD_SQL_IAM_ACCOUNT: ${{ secrets.CLOUD_SQL_IAM_ACCOUNT }}
120STRIPE_API_KEY: ${{ secrets.STRIPE_API_KEY }}
121STRIPE_WEBHOOK_KEY: ${{ secrets.STRIPE_WEBHOOK_KEY }}
122STATIC_IP_NAME: ${{ secrets.STATIC_IP_NAME }}
123
124deploy-done:
125needs:
126- output-prev-version
127- build-images
128- deploy
129if: always()
130runs-on: ubuntu-latest
131name: Post deploy message
132steps:
133- uses: actions/checkout@v4
134with:
135fetch-depth: 0
136- uses: actions/checkout@v4
137with:
138repository: toeverything/blocksuite
139path: blocksuite
140fetch-depth: 0
141fetch-tags: true
142- name: Setup Node.js
143uses: ./.github/actions/setup-node
144with:
145extra-flags: 'workspaces focus @affine/changelog'
146electron-install: false
147- name: Output deployed info
148if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
149id: set_info
150run: |
151if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
152echo "deployed_url=https://affine.fail" >> $GITHUB_OUTPUT
153elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
154echo "deployed_url=https://insider.affine.pro" >> $GITHUB_OUTPUT
155elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
156echo "deployed_url=https://app.affine.pro" >> $GITHUB_OUTPUT
157else
158exit 1
159fi
160env:
161GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
162- name: Post Success event to a Slack channel
163if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
164run: node ./tools/changelog/index.js
165env:
166CHANNEL_ID: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
167SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
168DEPLOYED_URL: ${{ steps.set_info.outputs.deployed_url }}
169PREV_VERSION: ${{ needs.output-prev-version.outputs.prev }}
170NAMESPACE: ${{ needs.output-prev-version.outputs.namespace }}
171DEPLOYMENT: 'SERVER'
172FLAVOR: ${{ github.event.inputs.flavor }}
173BLOCKSUITE_REPO_PATH: ${{ github.workspace }}/blocksuite
174- name: Post Failed event to a Slack channel
175id: failed-slack
176uses: slackapi/slack-github-action@v1.27.0
177if: ${{ always() && contains(needs.*.result, 'failure') }}
178with:
179channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
180payload: |
181{
182"blocks": [
183{
184"type": "section",
185"text": {
186"text": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy failed `${{ github.event.inputs.flavor }}`>",
187"type": "mrkdwn"
188}
189}
190]
191}
192env:
193SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
194- name: Post Cancel event to a Slack channel
195id: cancel-slack
196uses: slackapi/slack-github-action@v1.27.0
197if: ${{ always() && contains(needs.*.result, 'cancelled') && !contains(needs.*.result, 'failure') }}
198with:
199channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
200payload: |
201{
202"blocks": [
203{
204"type": "section",
205"text": {
206"text": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy cancelled `${{ github.event.inputs.flavor }}`>",
207"type": "mrkdwn"
208}
209}
210]
211}
212env:
213SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
214