GitHub ActionsのEnvironmentsにデプロイできるブランチ/タグを制限する機能を試す
これを試す。environmentsの設定でデプロイ可能なブランチに加えてタグを制限することが可能になったらしい。
記事には書いていないけど、元々シークレットや環境変数をenvironmentsに紐付けることが可能なので、大体のケースで外部サービスへのデプロイ時に必要なトークンをenvironmentsに入れておけば本当の意味でデプロイ可能なブランチやタグを限定することが可能にできるような気がする
実験用に適当なリポジトリを作成
prod
というenvironmentを作成し、記事と全く同じ releases/*
のタグかブランチからしかリリースできないようにした
デプロイ用のワークフローを用意。
environment: prod
があることによってこのジョブは prod
のenvironmentに紐づいている。
そして prod
のenvironmentはさっき releases/*
だけに限定したので、この状態で手動トリガーでmainブランチから起動すると失敗するはず
name: Deploy
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
environment: prod
steps:
- uses: actions/checkout@v3
- run: echo "Deploy to prod"
うん、予定通り失敗した
次は成功するはずのパターンの実験。今のmainブランチで releases/v1
というタグを打ち、workflow_dispatchではそのタグを指定する。
あれ、エラーになった。おかしいな
よく見たら許可するブランチ/タグの設定はブランチとタグをまとめて設定するのではなく、個別に決められるらしい。最初の設定だと releases/*
のブランチを指定していたのでタグは許可できていなかった。
というわけで本当にgithubの記事と同様に両方で許可してみた
再び releases/v1
タグで手動実行。今度は意図通りに成功!
Deploymentsのページの方にもちゃんとデプロイが記録されたな(さっきまでの失敗してたのも記録されてた)
というわけで、以下を設定することで特定のブランチ/タグからのみデプロイ用のジョブを実行することが可能になったようです。
- ワークフローのyamlでデプロイ用のジョブに
environment: 環境名
を追加する - リポジトリのenvironmentを作成する
-
Deployment branches and tags
の設定にデプロイを許可するブランチ/タグを指定する
ここからは自分の考え。
この設定に加えて、どこかのクラウド環境とかにデプロイする際に必要であろうトークンなどをenvironmentのsecretに登録しておくとなお良い。
-
- クラウド環境にデプロイするためにはトークンなどが必須
-
- トークンはenvironmentのsecretに登録されているため、取り出すにはワークフローのyamlに
environment
の指定が必要
- トークンはenvironmentのsecretに登録されているため、取り出すにはワークフローのyamlに
-
-
environment
を実行できるブランチ/タグは限定されている
-
- 1 + 2 + 3の結果としてクラウド環境にデプロイできるブランチ/タグを限定できる
仮にenvironmentのsecretではなくリポジトリのsecretなどに登録されてしまっている場合、2での environment
の指定をしていないジョブでもsecretが取り出せてしまうため、本来のデプロイ用ジョブのコマンドをコピペして environment
の記述だけを消したジョブを作られると任意のブランチ/タグでデプロイが可能になってしまうはず。
なので1 + 2 + 3が全て揃うと完全にデプロイ可能なブランチ/タグを限定できるようになると思ってます。
自分のOSSはworkflow_dispatchで手動でデプロイフローを実行しているけど、mainブランチ以外から実行することを全く想定していなくてむしろ禁止できるならその方が安全。
prod
環境は main
しかデプロイできない設定を追加していくか。
ここまで元々ブランチ/タグの両方で今回から初めて制限をかけられるみたいな書き方をしていたのですが、ブランチに関しては元々可能だったようでした。
Previously environments supported 'Protection Rules' for restricting deployments only for selected deployment branches. We are now enhancing this feature for securing deployments based on selected "Deployment branches and tags".
GitHubの元記事も改めてよく見直してみたらブランチに関しては元々可能だがタグでもできるようになりました。と書いてあった・・・