kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Branch Deploy Action: GitHub Actions でブランチデプロイと IssueOps を試す

The GitHub Blog の記事 Enabling branch deployments through IssueOps with GitHub Actions を読んで「branch deployments(ブランチデプロイ)」というデプロイ戦略を知った💡

プルリクエストを main ブランチにマージしてから本番環境にデプロイするのではなく,プルリクエストを直接本番環境にデプロイして,動作確認の結果問題なしと判断できてからプルリクエストを main ブランチにマージするという流れが特徴的❗️そして,デプロイに異常があってロールバックする場合は main ブランチをデプロイして復旧する💡

記事に載ってるブランチ画像(Merge Deploy Model と Branch Deploy Model)は非常にわかりやすく見てみてもらえればと〜

github.blog

IssueOps と Branch Deploy Action

記事を読むと今度は「IssueOps」という用語が出てくる.Slack や Discord を使ってデプロイを実行する ChatOps と似ていて,IssueOps ではプルリクエストのコメントを使ってデプロイを実行する.

そして,Branch Deploy Action を使うと比較的簡単に IssueOps を実現できて,ブランチデプロイとの相性も良いとのことだった👏 さっそく Branch Deploy Action を試していく❗️

github.com

Branch Deploy Action を試す

今回は GitHub の README.md に載っている Example Workflow をそのまま使う.ポイントとしては大きく3点ある👀

  1. ワークフローのトリガーをコメントにしているところ
  2. プルリクエストのみを対象にしているところ
  3. コメントに .deploy が含まれているときにデプロイを実装するところ
name: "branch deploy demo"

# The workflow to execute on is comments that are newly created
on:
  issue_comment:
    types: [created]

# Permissions needed for reacting and adding comments for IssueOps commands
permissions:
  pull-requests: write
  deployments: write
  contents: write
  checks: read

jobs:
  demo:
    if: ${{ github.event.issue.pull_request }} # only run on pull request comments
    runs-on: ubuntu-latest
    steps:
      # Execute IssueOps branch deployment logic, hooray!
      # This will be used to "gate" all future steps below and conditionally trigger steps/deployments
      - uses: github/branch-deploy@v6.0.1
        id: branch-deploy
        with:
          trigger: ".deploy"

      # Run your deployment logic for your project here - examples seen below

      # Checkout your projects repository based on the ref provided by the branch-deploy step
      - uses: actions/checkout@v3
        with:
          ref: ${{ steps.branch-deploy.outputs.ref }}

      # Do some fake "noop" deployment logic here
      # conditionally run a noop deployment
      - name: fake noop deploy
        if: ${{ steps.branch-deploy.outputs.continue == 'true' && steps.branch-deploy.outputs.noop == 'true' }}
        run: echo "I am doing a fake noop deploy"

      # Do some fake "regular" deployment logic here
      # conditionally run a regular deployment
      - name: fake regular deploy
        if: ${{ steps.branch-deploy.outputs.continue == 'true' && steps.branch-deploy.outputs.noop != 'true' }}
        run: echo "I am doing a fake regular deploy"

.deploy noop コマンド

まずは .deploy noop コマンドを試す.noopNo Operation の意味で,通常のデプロイはせずにデプロイの流れを検証したりするときに使える.dry run(ドライラン)と表現することもできそう.具体的には AWS CloudFormation の変更セットを作ったり,Terraform の plan を実行したりするときに使えそう✌

.deploy noop

実行すると GitHub Actions で fake noop deploy が実行された.これは GitHub Actions のワークフローで steps.branch-deploy.outputs.noop == 'true' のように判断している ✔

.deploy コマンド

今度は .deploy コマンドを試す..deploy to production のようにデプロイ環境を指定することもできるし,.deploy main のようにブランチを指定してロールバックすることもできる👏

.deploy

実行すると GitHub Actions で fake regular deploy が実行された.これは GitHub Actions のワークフローで steps.branch-deploy.outputs.noop != 'true' のように判断している ✔

.lock production コマンドと .unlock production コマンド

Branch Deploy Action には .deploy コマンド以外に .lock コマンドと .unlock コマンドもある.プルリクエストを本番環境にデプロイして動作確認や評価などをしているときに他のデプロイを実行させないようにロックできる..lock コマンドを実行したユーザーがロックを持つイメージで,他のユーザーが .deploy コマンドを実行するとデプロイが失敗するようになっている.

ちなみに .lock production コマンドを実行すると,自動的に production-branch-deploy-lock ブランチが作られる.ブランチの有無でロックを実装してる仕組みはおもしろかった❗️

.lock production
.unlock production

まとめ

The GitHub Blog の記事を読んで興味を持った「ブランチデプロイ」と Branch Deploy Action を使った「IssueOps」を試してみた💡 今度何かしらサービスのデプロイ戦略を設計するときにブランチデプロイを導入してみようと思う❗️

ツイート紐付け