レビューのためPRをデプロイ

2021/06/01に公開されました。
2021/06/01に更新されました。

PRの内容をデプロイしてレビューを簡単に行なう


author: komem3

はじめに

フロントのコードのPRが立つた度に、そのコードをローカルに落として確認を行なうと、レビューの負荷が高くなってしまいます。
そのため、本サイトではGitHub actionsを使用して、PRごとにデプロイを行なうようにしています。今回はそのことについて書いていきます。

Github Actions の workflow

まず最初に、どのようなワークフローになっているかです。これを上から解説していきます。(説明のため一部割愛しています)

name: deploy

on:
  pull_request:
    branches:
      - main
jobs:
  cd:
    runs-on: ubuntu-latest
    env:
      CI_CACHE: 1

    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Setup node env
        uses: actions/setup-node@v2.1.5
        with:
          node-version: 15

      - name: Cache node_modules
        uses: actions/cache@v2.1.6
        with:
          path: ~/.npm
          key: ${{ env.CI_CACHE }}-main-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ env.CI_CACHE }}-main-

      - name: Install dependencies
        run: npm ci

      - name: Setup gcloud environment
        uses: google-github-actions/setup-gcloud@v0.2.1
        with:
          service_account_key: ${{ secrets.SERVICE_ACCTOUN_CREDENTIALS }}

      - name: build
        run: npm run generate

      - name: set env
        run: echo "version=$(echo ${GITHUB_REF} | sed -e 's/refs\/pull\///g' | tr '/' '-')" >> $GITHUB_ENV

      - name: GAE deploy for dev
        env:
          PROJECT_ID: ${{ secrets.DEV_PROJECT_ID }}
        run: |
          gcloud app deploy app.yaml \
          --project "${PROJECT_ID}" --quiet --no-promote \
          --version "${version}"

      - name: nortificate to PR
        uses: actions/github-script@v4.0.2
        env:
          PROJECT_ID: ${{ secrets.DEV_PROJECT_ID }}
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            github.issues.createComment({
              issue_number: context.payload.pull_request.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: "デプロイが完了しました。 問題なければレビュアーにメンションを付けてレビュー依頼をして下さい " +
              `https://${process.env.version}-dot-default-dot-${process.env.PROJECT_ID}.an.r.appspot.com`,
            })

workflow のタイミング

on:
  pull_request:
    branches:
      - main

まずworkflowのタイミングです。上記のように記述することでこのworkflowのタイミングを限定できます。

今回のタイミングは main ブランチへの PR が立ったとき(reopen も含む)・PR を立てているブランチのコードの更新が行なわれたとき。となっています。

デプロイ準備

deployするまでにやっていることは、普通のnode + GCPのプロジェクトと変わりはありません。 チェックアウトして、ビルドして、gcloudの初期化を行なっています。

PR ごとのバージョン作成

今回の肝です。まずPRごとに一意のURLにする必要があります。そのため、以下のようなスクリプトでPR情報から環境変数を作成します。

- name: set env
  run: echo "version=$(echo ${GITHUB_REF} | sed -e 's/refs\/pull\///g' | tr '/' '-')" >> $GITHUB_ENV

GITHUB_REF 環境変数には、PRの番号が1なら refs/pull/1/merge といった内容の文字列が入っています。 これを sed -e 's/refs\/pull\///g' | tr '/' '-' に通すと、1-merge という文字列になります。

github actionsでは、環境変数を設定するさいは下記のような構文になるため、上記のスクリプトで環境変数 version${pr-number}-merge という文字列が入ります。

echo "環境変数名=変数の内容" >> $GITHUB_ENV

デプロイ

PRごとの一意のバージョンも決定できたのでデプロイするだけです。先程作成した環境変数をversionに指定してあげてデプロイします。

run: |
  gcloud app deploy app.yaml \
  --project "${PROJECT_ID}" --quiet --no-promote \
  --version "${version}"

PR への通知

CIが終わるたびに、GCPコンソールに行き生成されたURLを探すのは面倒です。そのため、PRにURLを通知をすることにしています。 versionを指定してデプロイしているため、生成されたURLは自明です。なので、そのURLをコメントしてあげています。

- name: nortificate to PR
  uses: actions/github-script@v4.0.2
  env:
    PROJECT_ID: ${{ env.DEV_PROJECT_ID }}
  with:
    github-token: ${{secrets.GITHUB_TOKEN}}
    script: |
      github.issues.createComment({
        issue_number: context.payload.pull_request.number,
        owner: context.repo.owner,
        repo: context.repo.repo,
        body: "デプロイが完了しました。 問題なければレビュアーにメンションを付けてレビュー依頼をして下さい " +
        `https://${process.env.version}-dot-default-dot-${process.env.PROJECT_ID}.an.r.appspot.com`,
      })

これで完璧です。

github nortice

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。