はじめに
GithubActionsがリリースされ、CircleCIや、TravisCIから段々とGithubActionに移行している中、CircleCIで出来た「Approve」機能が使えなくて困っている人も多いはず。
git push
してActionを起動できるのはわかったけど、任意のタイミングでDeployのために、Github Actionsを実行したいと思うようになってきたのではないでしょうか?
そんな時に使えるのが「Github Deployment」!
任意のタイミングでActionを起動して、Deployを効率化することができます。
Slackの連携もGithubの公式Integrationから可能です。
Github Deployment とは
- GithubDeploymentAPI
- GithubDeplomentとは、指定したタグやブランチに対してGithubActionや、外部連携のDeploy機能を実行できるものです。
- デプロイメントは現在ベータ版であり、変更される可能性があります。
本日紹介する最終構成
- slackからGithub deploymentを作成し、Github Actionを通じて、各環境へデプロイする
以下、順を追って説明します。
Github Development の表示方法
Github Deploymentを一度でも実行すると、リポジトリのバーに emvironment
タブが表示されます。
こちらで、deployの簡単な実行履歴と結果を確認することができます。
curl -X POST \
-H "Authorization: token xxxxxxxxxxxxxxxx" \
-d '{"ref": "master"}' \
https://api.github.com/repos/${username}/${reponame}/deployments
ここで増えている environment
がdeploymentsの項目です。
envirommentの中身は以下のようになっています。
Github Deploymentでできること
GithubDeploymentAPIには以下のオプションがあります。
環境、タスク、ref、payloadなどを渡して実行できるので、比較的柔軟なdeployをすることが可能です。
例えば、 検証環境に、masterをデプロイする
みたいなこともできますし、モノレポ環境であれば、
検証環境に、masterのxxxというサービスをxxxという引数でデプロイする
といったことも可能です。
実際にDeploymentをGithub Actionsで実行してみる
何もトリガー実行を設定しない場合、上記の方法でdeploymentを作成しても pending
のままです。
ですので、GithubActionsを利用して、deploymentの作成をトリガーし、実行完了したら、
environmentのdeploymentステータスをsuccessに変更してみようと思います。
- リポジトリのSecretにGithubTokenを登録する(Github -> Repository -> Settings -> Secrets)
- GithubActionsをリポジトリに配置してpushする
name: DEPLOYMENT
on:
# https://developer.github.com/v3/repos/deployments/#update-a-deployment
deployment
jobs:
deploy:
name: DEPLOY ${{ github.event.deployment.environment }} ${{ github.event.deployment.task }}
runs-on: ubuntu-18.04
steps:
- name: deploy
run: echo "Execute the deproy script here."
- uses: 'sadayuki-matsuno/github-deployment-status@v1'
with:
status: '${{ job.status }}'
token: '${{ secrets.TOKEN }}'
if: always()
sadayuki-matsuno/github-deployment-status
-> actions内のstatusをそのままdeploymetsに反映させるために作りました。
github.event.deployment.environment
-> deploy時に指定したenvironment
github.event.deployment.task
-> deploy時に指定したtask
- deployment作成
curl -X POST \
-H "Authorization: token xxxxxxxxxxxxxxxx" \
-d '{"ref": "master"}' \
https://api.github.com/repos/${username}/${reponame}/deployments
- Actionsの実行結果を確認(Github -> Repository -> Actions)
- environment表示確認(Github -> Repository -> Environment)
curlでの実行の場合、envはdefaultで production
となります。
この結果はPRの下の方にも表示されます。
Github Development をSlackから利用する
実はこのGithubDeploymentはSlackのGithub公式Integrationにも実装されています。
コマンドとしては /github deploy ${username}/${repo}
となっています。
- slackに github integrationの追加
/github deploy ${username}/${repo}
-
Connect Github Account
をクリックして設定する -
/github deploy ${username}/${repo}
を再度実行 - ダイアログに必要項目を追加して
Create
をクリックする - deployment作成完了!
以上のフローとなります。これでcurlでapiを実行するのと同等のコマンドが実行されます。
ダイアログにある Branch or tag to deploy
の項目は、プルダウンで選択できるようになっています。
ここでエラーが発生する場合は、後述の注意点を確認してください。
Github Development 利用の注意点
Github DeploymentをSlackで実行する場合、
エラー要因はいろいろあるけど、エラーメッセージが単一とにかくエラーがわかりにくいです。
- 対象のタグ、ブランチでCI(GithubAction)が全て成功していない場合はエラー(
We had some trouble connecting.
)- すでにGithubActionsでCIを回してテストを実行している方も多いと思いますが、対象のタグと、ブランチのCIでエラーが発生している場合は、Github Deploymentは失敗します。
- Autoマージが実行されて、エラー(
We had some trouble connecting.
)- Github Deploymentには
AutoMerge
という項目があります。 - SlackのGithub Integrationではこの項目を選択することができず、常にdefaultで
AutoMerge=true
で実行されます。 - AutoMergeとは上記のオプションにも説明がありますが、
default branch
が対象のブランチよりも進んでいる場合、自動でMergeされる機能です。 - AutoMergeが完了し、テストも全て通ると、Deployできるようになります。
- Github Deploymentには
私が利用している実際のAction紹介
このGithub Deployment を利用すると、Github Actionを任意のタイミングで実行することが可能です。
Approve
がなくてCircleCIなどから移行できなかった方もこれを使えば、デプロイの実行もGithubに寄せることができるのではないかともいます。
最後に私が実際に利用している deployment.yml
を紹介して終わります。
name: DEPLOYMENT
on:
# https://developer.github.com/v3/repos/deployments/#update-a-deployment
deployment
jobs:
deploy:
name: DEPLOY ${{ github.event.deployment.environment }} ${{ github.event.deployment.task }}
runs-on: ubuntu-18.04
steps:
- name: Production Deploy Check
if: github.event.deployment.environment == 'production'
run: |
permittedUser=('sadayuki-matsuno')
[[ " ${permittedUser[@]} " =~ " ${{github.actor}} " ]] || exit 1
echo 'User is ok'
[[ ${{github.ref}} = *'refs/tags/v'* ]] || exit 1
echo 'Branch is ok'
- uses: actions/checkout@v1
- uses: actions/setup-go@v1
if: github.event.deployment.task == 'backend'
with:
go-version: 1.13
- uses: actions/setup-node@v1
if: github.event.deployment.task == 'web'
with:
node-version: 12.x
- uses: actions/setup-java@v1
if: github.event.deployment.task == 'android'
with:
java-version: 1.8
- name: deploy
if: success()
run: sh deployment/deploy.sh ${{ github.event.deployment.environment }} ${{ github.event.deployment.task }}
- uses: 'sadayuki-matsuno/github-deployment-status@v1'
with:
status: '${{ job.status }}'
token: '${{ secrets.TOKEN }}'
if: always()
- uses: 8398a7/action-slack@v2
with:
only_mention_fail: here
status: ${{ job.status }}
author_name: DEPLOY ${{ github.event.deployment.environment }} ${{ github.event.deployment.task }}
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: always()
-
/github
コマンドが実行できるchannelをslackで制御しています。#deploy
channelだけで実行できるようにして、誰がいつ実行したのかslackで追いやすくしています。 -
Production Deploy Check
では、誤操作で本番にデプロイされないように本番デプロイできるユーザとタグを設定しています - ブランチだと、最新しかデプロイできないので、切り戻しなども想定して、ブランチではなくタグでデプロイするようにしています。
- 各種setupのところでは、deployするサービスに合わせて、setupの有無を制御しています
- 実際のdeploy作業は全てshellで書いてあり、
environment
とtask
を引数にして実行しています。(slackではpayloadが打ちづらいので、使っていません) -
sadayuki-matsuno/github-deployment-status
でdeploymentの成功失敗をGithubに登録しています - 最後にSlackに通知して終了です
以上です。もっとこうすればいいよ!みたいなコメントあればお願いします!
最後に
omeroid株式会社ではエンジニアを募集しています!
是非興味のある方はお声がけください!
omeroid HomePage | |
---|---|
Wantedly | |