O hirunewani blog

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

Created at

Github WorkflowsでEnvironment SecretsやEnvironment Variablesを使って環境に応じて異なるSecretsやVariablesを使う方法を紹介する。

利用方法

現在のブランチが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コマンドを使って設定することもできる。

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