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.
ブランチやタグ、ハッシュを指定して、外部連携のデプロイを発火するもの(あくまでトリガー)。
CI で develop/master ブランチの push や tag でデプロイされるということをよくしていたが、
これは push / tag 本来の機能にデプロイのトリガー機能を追加しているわけで、デプロイのトリガー専用の機能を提供しているのが deployment っぽい。
PR作成
⇩
修正
⇩
デプロイ
⇩
フィードバック
⇩
マージ
らしい。
このフローだったら push / tag にデプロイのトリガーを追加するのはよくなさそうに思える。
こうして deployment イベントが生まれたのか、と納得した。
一度 deployment を作成すると environment タブが現れる
environment タブの中はこんな感じ (PR や issue のように deployment の新規作成ボタンはなかった。あったらボタンぽちぽちデプロイもできると思ったが、、)
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 })
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-flow(マージ前にデプロイ)の開発なら deployment をトリガーにデプロイするのが良さそうだが、
そうでないなら、push / tag をトリガーにして良さそうかなと感じた。
現状は development の優位性は ChatOps で使いやすそうくらい?