universo-platform-2d

Форк
0
213 строк · 8.3 Кб
1
name: Deploy
2

3
on:
4
  workflow_dispatch:
5
    inputs:
6
      flavor:
7
        description: 'Select what enverionment to deploy to'
8
        type: choice
9
        default: canary
10
        options:
11
          - canary
12
          - beta
13
          - stable
14
          - internal
15
env:
16
  NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
17

18
permissions:
19
  contents: 'write'
20
  id-token: 'write'
21
  packages: 'write'
22

23
jobs:
24
  output-prev-version:
25
    name: Output previous version
26
    runs-on: ubuntu-latest
27
    environment: ${{ github.event.inputs.flavor }}
28
    outputs:
29
      prev: ${{ steps.print.outputs.version }}
30
      namespace: ${{ steps.print.outputs.namespace }}
31
    steps:
32
      - uses: actions/checkout@v4
33
      - name: Auth to Cluster
34
        uses: './.github/actions/cluster-auth'
35
        with:
36
          gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
37
          gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
38
          service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
39
          cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
40
          cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
41
      - name: Output previous version
42
        id: print
43
        run: |
44
          namespace=""
45
          if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
46
            namespace="dev"
47
          elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
48
            namespace="beta"
49
          elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
50
            namespace="production"
51
          else
52
            echo "Invalid flavor: ${{ github.event.inputs.flavor }}"
53
            exit 1
54
          fi
55

56
          echo "Namespace set to: $namespace"
57

58
          # Get the previous version from the deployment
59
          prev_version=$(kubectl get deployment -n $namespace affine-graphql -o=jsonpath='{.spec.template.spec.containers[0].image}' | awk -F '-' '{print $3}')
60

61
          echo "Previous version: $prev_version"
62
          echo "version=$prev_version" >> $GITHUB_OUTPUT
63
          echo "namesapce=$namespace" >> $GITHUB_OUTPUT
64

65
  build-images:
66
    name: Build Images
67
    uses: ./.github/workflows/build-images.yml
68
    secrets: inherit
69
    with:
70
      flavor: ${{ github.event.inputs.flavor }}
71

72
  deploy:
73
    name: Deploy to cluster
74
    if: ${{ github.event_name == 'workflow_dispatch' }}
75
    environment: ${{ github.event.inputs.flavor }}
76
    needs:
77
      - build-images
78
    runs-on: ubuntu-latest
79
    steps:
80
      - uses: actions/checkout@v4
81
      - name: Setup Version
82
        id: version
83
        uses: ./.github/actions/setup-version
84
      - name: Deploy to ${{ github.event.inputs.flavor }}
85
        uses: ./.github/actions/deploy
86
        with:
87
          build-type: ${{ github.event.inputs.flavor }}
88
          gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
89
          gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
90
          service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
91
          cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
92
          cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
93
        env:
94
          APP_VERSION: ${{ steps.version.outputs.APP_VERSION }}
95
          DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
96
          CANARY_DEPLOY_HOST: ${{ secrets.CANARY_DEPLOY_HOST }}
97
          R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
98
          R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
99
          R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
100
          CAPTCHA_TURNSTILE_SECRET: ${{ secrets.CAPTCHA_TURNSTILE_SECRET }}
101
          COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
102
          COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
103
          COPILOT_UNSPLASH_API_KEY: ${{ secrets.COPILOT_UNSPLASH_API_KEY }}
104
          METRICS_CUSTOMER_IO_TOKEN: ${{ secrets.METRICS_CUSTOMER_IO_TOKEN }}
105
          MAILER_SENDER: ${{ secrets.OAUTH_EMAIL_SENDER }}
106
          MAILER_USER: ${{ secrets.OAUTH_EMAIL_LOGIN }}
107
          MAILER_PASSWORD: ${{ secrets.OAUTH_EMAIL_PASSWORD }}
108
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
109
          AFFINE_GOOGLE_CLIENT_ID: ${{ secrets.AFFINE_GOOGLE_CLIENT_ID }}
110
          AFFINE_GOOGLE_CLIENT_SECRET: ${{ secrets.AFFINE_GOOGLE_CLIENT_SECRET }}
111
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
112
          DATABASE_USERNAME: ${{ secrets.DATABASE_USERNAME }}
113
          DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
114
          DATABASE_NAME: ${{ secrets.DATABASE_NAME }}
115
          GCLOUD_CONNECTION_NAME: ${{ secrets.GCLOUD_CONNECTION_NAME }}
116
          GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT: ${{ secrets.GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT }}
117
          REDIS_HOST: ${{ secrets.REDIS_HOST }}
118
          REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }}
119
          CLOUD_SQL_IAM_ACCOUNT: ${{ secrets.CLOUD_SQL_IAM_ACCOUNT }}
120
          STRIPE_API_KEY: ${{ secrets.STRIPE_API_KEY }}
121
          STRIPE_WEBHOOK_KEY: ${{ secrets.STRIPE_WEBHOOK_KEY }}
122
          STATIC_IP_NAME: ${{ secrets.STATIC_IP_NAME }}
123

124
  deploy-done:
125
    needs:
126
      - output-prev-version
127
      - build-images
128
      - deploy
129
    if: always()
130
    runs-on: ubuntu-latest
131
    name: Post deploy message
132
    steps:
133
      - uses: actions/checkout@v4
134
        with:
135
          fetch-depth: 0
136
      - uses: actions/checkout@v4
137
        with:
138
          repository: toeverything/blocksuite
139
          path: blocksuite
140
          fetch-depth: 0
141
          fetch-tags: true
142
      - name: Setup Node.js
143
        uses: ./.github/actions/setup-node
144
        with:
145
          extra-flags: 'workspaces focus @affine/changelog'
146
          electron-install: false
147
      - name: Output deployed info
148
        if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
149
        id: set_info
150
        run: |
151
          if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
152
            echo "deployed_url=https://affine.fail" >> $GITHUB_OUTPUT
153
          elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
154
            echo "deployed_url=https://insider.affine.pro" >> $GITHUB_OUTPUT
155
          elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
156
            echo "deployed_url=https://app.affine.pro" >> $GITHUB_OUTPUT
157
          else
158
            exit 1
159
          fi
160
        env:
161
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
162
      - name: Post Success event to a Slack channel
163
        if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
164
        run: node ./tools/changelog/index.js
165
        env:
166
          CHANNEL_ID: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
167
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
168
          DEPLOYED_URL: ${{ steps.set_info.outputs.deployed_url }}
169
          PREV_VERSION: ${{ needs.output-prev-version.outputs.prev }}
170
          NAMESPACE: ${{ needs.output-prev-version.outputs.namespace }}
171
          DEPLOYMENT: 'SERVER'
172
          FLAVOR: ${{ github.event.inputs.flavor }}
173
          BLOCKSUITE_REPO_PATH: ${{ github.workspace }}/blocksuite
174
      - name: Post Failed event to a Slack channel
175
        id: failed-slack
176
        uses: slackapi/slack-github-action@v1.27.0
177
        if: ${{ always() && contains(needs.*.result, 'failure') }}
178
        with:
179
          channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
180
          payload: |
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
            }
192
        env:
193
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
194
      - name: Post Cancel event to a Slack channel
195
        id: cancel-slack
196
        uses: slackapi/slack-github-action@v1.27.0
197
        if: ${{ always() && contains(needs.*.result, 'cancelled') && !contains(needs.*.result, 'failure') }}
198
        with:
199
          channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
200
          payload: |
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
            }
212
        env:
213
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
214

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.