kawabatas技術ブログ

試してみたことを書いていきます

Github Actions の deployment イベントでデプロイ

Github Deployments について

Deployments are requests to deploy a specific ref (branch, SHA, tag). GitHub dispatches a deployment event that external services can listen for and act on when new deployments are created.

ブランチやタグ、ハッシュを指定して、外部連携のデプロイを発火するもの(あくまでトリガー)。

f:id:kawabatas:20200421085338p:plain

CI で develop/master ブランチの push や tag でデプロイされるということをよくしていたが、

これは push / tag 本来の機能にデプロイのトリガー機能を追加しているわけで、デプロイのトリガー専用の機能を提供しているのが deployment っぽい。

GitHub-flow (参考)では、

PR作成

修正

デプロイ

フィードバック

マージ

らしい。

このフローだったら push / tag にデプロイのトリガーを追加するのはよくなさそうに思える。

こうして deployment イベントが生まれたのか、と納得した。

一度 deployment を作成すると environment タブが現れる

f:id:kawabatas:20200421085954p:plain

environment タブの中はこんな感じ (PR や issue のように deployment の新規作成ボタンはなかった。あったらボタンぽちぽちデプロイもできると思ったが、、)

f:id:kawabatas:20200421090017p:plain

deployment のステータスを緑色の active とするには Create a deployment status API を叩かねばならない。こちらは public beta らしい。

deployment をトリガーにしたミニマムの Actions はこんな感じ

name: DEPLOYMENT
on: deployment
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        run: |
          echo "Deploy"
      - name: Update deployment status
        uses: actions/github-script@0.9.0
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const jobStatus = '${{ job.status }}'
            const deployStateSuccess = 'success'
            const deployStateFailure = 'failure'
            const deployStatePending = 'pending'

            let deployState = deployStatePending 
            if (jobStatus == 'Success') {
              deployState = deployStateSuccess
            } else if  (jobStatus == 'Failure') {
              deployState = deployStateFailure
            }

            github.repos.createDeploymentStatus({
              deployment_id: context.payload.deployment.id,
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: deployState
            })

トークンを準備すれば CLI ですぐに実行できる

curl -X POST \
  -H "Authorization: token トークン" \
  -d '{"ref": "master"}' \
  https://api.github.com/repos/kawabatas/deployment-test/deployments

Slack からも実行できる。 Slack ヘルプ - GitHub と Slack を連携させる

しかし、Slack からは Create a deployment API のパラメータで指定できるものは限られているようだ。

https://github.com/integrations/slack/issues/984 で auto_merge、required_contexts の機能追加の PR も発見。

(AutoMergeとは default branch が対象のブランチよりも進んでいる場合、自動で Merge される機能。デフォルトで true)

/github のコマンド一覧は多分こちら

おわり

GitHub-flow(マージ前にデプロイ)の開発なら deployment をトリガーにデプロイするのが良さそうだが、

そうでないなら、push / tag をトリガーにして良さそうかなと感じた。

現状は development の優位性は ChatOps で使いやすそうくらい?