Github Workflowsで環境に応じて異なるSecretsやVariablesを使う
Github WorkflowsでEnvironment SecretsやEnvironment Variablesを使って環境に応じて異なる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 ENVIRONMENT
gh 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をより名前通りの用途に限定できるという利点もあるように思う。