Github Workflowsで環境に応じて異なるSecretsやVariablesを使う
利用方法
現在のブランチがdeploy
かどうかで環境を切り替える例。
production
とdevelopment
の環境で異なる Secrets や Variables が出力される。
on: pull_request: branches: - main - deploy push: branches: - main - deploy
jobs: example: runs-on: ubuntu-latest environment: ${{ github.ref_name == 'deploy' && 'production' || 'development' }} steps: - name: Echo secrets on production run: echo ${{ secrets.SOME_SECRET }} - name: Echo variables on production run: echo ${{ vars.SOME_VARIABLE }}
設定方法
画面から設定する
リポジトリの Settings にある Actions secrets and variables の Environment secrets や Environment variables に設定する。
https://github.com/USER_NAME/REPOSITORY_NAME/settings/secrets/actions
または、Settings にある Environment から環境を新規作成または編集する。
https://github.com/hrdtbs/vscode-apacheconf-snippets/settings/environments
Secrets や Variables を設定する手段が複数あると理解すると紛らわしいので、Environment 自体は環境を設定するだけのものであり、 設定された環境を Branch protection や Actions secrets and variables で利用できると捉えるといいように思う。
Environment secrets や Environment variables は、Actions secrets and variables で環境に紐づいた Secrets や Variables を設定したものに過ぎず、リポジトリに紐づいた Repository secrets や Repository variables とほとんど変わらないものだ。
なお同名の Secrets や Variables を、Environment と Repository の両方に設定した場合、設定された環境では Environment のものが優先される。
CLI から設定する
gh
コマンドを使って設定することもできる。
gh secret set NAME --body VALUE --env ENVIRONMENTgh variable set NAME --body VALUE --env ENVIRONMENT
一覧を確認することも出来る。
$ gh variable list --env production$ gh secret list --env production
Workflow ファイルで設定することは出来ない
Repository secrets や Repository variables がそうであるように、Environment secrets や Environment variables も Workflow ファイルで設定することは出来ない。
利用の是非
Environment Secrets については、積極的に利用することをお勧めする。 Repository Secrets に PROD_SECRET と DEV_SECRET を設定した上で、ref を見て分岐するような記述をするよりは environment を設定するだけで良いため遥かに簡潔な記述が出来る。
Environment Variables についても、Repository Variables に対しては同様の利点がある。特に複数の Workflow ファイルで共通の変数を利用したい場合や、値を変更する権限を持つ人を限定したい場合には効果的だろう。
個人的には、関連があるものはまとまっていて欲しいとも思うので、単一のファイルでしか利用しないのであればenv
で十分であると思うが、一貫性を取るなら基本的に Environment Variables を利用するのが良いだろう。また Environment Variables を積極的に利用することで、env をより名前通りの用途に限定できるという利点もあるように思う。