題名の通りです。
あまり綺麗だなとは思えないので、良い方法を知っている方がいたら教えて頂ければ幸いです。。
前提
検証環境と本番環境が存在していて、それぞれstagingブランチとmainブランチに対応しています。
- stagingブランチは、マージされたときにCI/CDが実行されます。
- mainブランチは、手動の承認フローをいれたいのと、Release管理を忘れないようにするために、Releaseが発行されたら実行するようにしたいです <-今回はここの話
やりたいこと
GithubのReleaseで、特定のブランチ(main)に対してリリースが発行された場合のみ
に、Github Actionを実行させたい
ただし、ヒューマンエラーで、発行先のブランチを(stagingなどに)間違えてしまった場合は、CIが実行されないようにしたい
設定方法
name: リリースタグがついたときにデプロイする
on:
release:
types:
- released
jobs:
build_and_deploy:
runs-on: ubuntu-latest
# mainにリリースタグがついたときだけ、、はこれではできなかった
#if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v2
- run: git fetch --all
# mainブランチ以外でタグが発行されたら失敗させる
- run: diff <(git rev-parse HEAD) <(git rev-parse origin/main) && exit 0 || (echo "mainブランチではないためデプロイしません"; exit 1)
- run: (デプロイ)
はじめ、コメントアウトしてある if
を使おうとしましたが、リリースタグが付いた時のGithubのイベントでは、refがタグ名になってしまい、うまく動作しません
そこで、
- stepsの中で
git fetch --all
し、ブランチ情報を引っ張ってくる - タグがついたコミットハッシュと、mainブランチのコミットハッシュが一致しないと、終了コード1で終了させ、次に進ませない
という形にすることで、やりたかったことは実現できました。
しかし、もっと簡単な方法があってもいいような...(見逃しているだけかもしれません)