Github Workflowsで環境に応じて異なるSecretsやVariablesを使う

Published at
723 words
4min read

利用方法#

現在のブランチがdeployかどうかで環境を切り替える例。 productiondevelopmentの環境で異なる 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コマンドを使って設定することもできる。

Terminal window
gh secret set NAME --body VALUE --env ENVIRONMENT
gh variable set NAME --body VALUE --env ENVIRONMENT

一覧を確認することも出来る。

Terminal window
$ 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 をより名前通りの用途に限定できるという利点もあるように思う。