The GitHub Blog の記事 Enabling branch deployments through IssueOps with GitHub Actions を読んで「branch deployments(ブランチデプロイ)」というデプロイ戦略を知った💡
プルリクエストを main
ブランチにマージしてから本番環境にデプロイするのではなく,プルリクエストを直接本番環境にデプロイして,動作確認の結果問題なしと判断できてからプルリクエストを main
ブランチにマージするという流れが特徴的❗️そして,デプロイに異常があってロールバックする場合は main
ブランチをデプロイして復旧する💡
記事に載ってるブランチ画像(Merge Deploy Model と Branch Deploy Model)は非常にわかりやすく見てみてもらえればと〜
IssueOps と Branch Deploy Action
記事を読むと今度は「IssueOps」という用語が出てくる.Slack や Discord を使ってデプロイを実行する ChatOps と似ていて,IssueOps ではプルリクエストのコメントを使ってデプロイを実行する.
そして,Branch Deploy Action を使うと比較的簡単に IssueOps を実現できて,ブランチデプロイとの相性も良いとのことだった👏 さっそく Branch Deploy Action を試していく❗️
Branch Deploy Action を試す
今回は GitHub の README.md
に載っている Example Workflow をそのまま使う.ポイントとしては大きく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
コマンドを試す.noop
は No 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」を試してみた💡 今度何かしらサービスのデプロイ戦略を設計するときにブランチデプロイを導入してみようと思う❗️
ツイート紐付け
The GitHub Blog に公開されてる branch deployments(ブランチデプロイ)の記事を読んだ📝プルリクエストをマージしてからデプロイするのではなく,プルリクエストを直接本番環境にデプロイして,正常だと確認できたらプルリクエストをマージすると💡なるほど〜https://t.co/R2ig4VhHJB
— カック (@kakakakakku) 2023年6月30日