Open9

GitHub ActionsのEnvironmentsにデプロイできるブランチ/タグを制限する機能を試す

Kesin11Kesin11

https://github.blog/changelog/2023-10-06-actions-secure-deployment-rollouts-to-protected-environments-based-on-select-tag-patterns/
これを試す。environmentsの設定でデプロイ可能なブランチに加えてタグを制限することが可能になったらしい。

記事には書いていないけど、元々シークレットや環境変数をenvironmentsに紐付けることが可能なので、大体のケースで外部サービスへのデプロイ時に必要なトークンをenvironmentsに入れておけば本当の意味でデプロイ可能なブランチやタグを限定することが可能にできるような気がする

Kesin11Kesin11

デプロイ用のワークフローを用意。
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"

うん、予定通り失敗した

Kesin11Kesin11

次は成功するはずのパターンの実験。今のmainブランチで releases/v1 というタグを打ち、workflow_dispatchではそのタグを指定する。

あれ、エラーになった。おかしいな

Kesin11Kesin11

よく見たら許可するブランチ/タグの設定はブランチとタグをまとめて設定するのではなく、個別に決められるらしい。最初の設定だと releases/* のブランチを指定していたのでタグは許可できていなかった。
というわけで本当にgithubの記事と同様に両方で許可してみた

再び releases/v1 タグで手動実行。今度は意図通りに成功!

Deploymentsのページの方にもちゃんとデプロイが記録されたな(さっきまでの失敗してたのも記録されてた)

Kesin11Kesin11

というわけで、以下を設定することで特定のブランチ/タグからのみデプロイ用のジョブを実行することが可能になったようです。

  • ワークフローのyamlでデプロイ用のジョブに environment: 環境名 を追加する
  • リポジトリのenvironmentを作成する
  • Deployment branches and tags の設定にデプロイを許可するブランチ/タグを指定する
Kesin11Kesin11

ここからは自分の考え。
この設定に加えて、どこかのクラウド環境とかにデプロイする際に必要であろうトークンなどをenvironmentのsecretに登録しておくとなお良い。

    1. クラウド環境にデプロイするためにはトークンなどが必須
    1. トークンはenvironmentのsecretに登録されているため、取り出すにはワークフローのyamlに environment の指定が必要
    1. environment を実行できるブランチ/タグは限定されている
  • 1 + 2 + 3の結果としてクラウド環境にデプロイできるブランチ/タグを限定できる

仮にenvironmentのsecretではなくリポジトリのsecretなどに登録されてしまっている場合、2での environment の指定をしていないジョブでもsecretが取り出せてしまうため、本来のデプロイ用ジョブのコマンドをコピペして environment の記述だけを消したジョブを作られると任意のブランチ/タグでデプロイが可能になってしまうはず。

なので1 + 2 + 3が全て揃うと完全にデプロイ可能なブランチ/タグを限定できるようになると思ってます。

Kesin11Kesin11

自分のOSSはworkflow_dispatchで手動でデプロイフローを実行しているけど、mainブランチ以外から実行することを全く想定していなくてむしろ禁止できるならその方が安全。
prod 環境は main しかデプロイできない設定を追加していくか。

Kesin11Kesin11

ここまで元々ブランチ/タグの両方で今回から初めて制限をかけられるみたいな書き方をしていたのですが、ブランチに関しては元々可能だったようでした。
https://zenn.dev/kenpi/articles/af6fb5b4c2675e

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の元記事も改めてよく見直してみたらブランチに関しては元々可能だがタグでもできるようになりました。と書いてあった・・・