GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する

| 4 min read
Author: masahiro-kondo masahiro-kondoの画像

GitHub Actions ワークフローで Configuration variables (構成変数) がサポートされました。

GitHub Actions - Support for configuration variables in workflows | GitHub Changelog

従来の環境変数とシークレット

#

従来もワークフローファイルに env キーワードで環境変数を宣言することはできましたが、ハードコーディングだしワークフローファイル内でしか利用できません[1]。API Key などの機密情報はシークレットとして外部から設定できます。シークレットはいったん設定してしまうと値を見ることはできないし変更もできない[2]ため、変数として使うには適していません。ということで、外部から設定可能な環境変数は GitHub Action 登場当初から「なぜないんだろう?」と思っていた機能です。

構成変数の種類

#

先にまとめてしまうと構成変数には以下のような種類があります。

名称 スコープ 用途
Organization variables オーガニゼーション内の全リポジトリの全ワークフローから参照可能[3] オーガニゼーション全体で利用する値
Repository variables リポジトリ内の全てのワークフローから参照可能 リポジトリ全体で利用する値
Environments variables リポジトリ内の全てのワークフローが特定環境用に実行される際に参照可能 リポジトリで定義した環境によって値を変える

一番使うのがリポジトリ単位の変数 Repository variables でしょう。Environments variables は development、production などのデプロイターゲットに応じて値を変えたい変数がある場合に利用します。

Variables - GitHub Docs

Caution

構成変数はプレーンテキストとして管理されます。機密情報は従来通りシークレットの方で管理します。

オーガニゼーションレベルの構成変数

#

まず、オーガニゼーションレベルの構成変数(Organization variables)の設定です。

オーガニゼーションの Settings > Security > Secrets and variables > Actions を開きます。

Organization settings

Secrets に並んで Variables のタブが追加されています。

New organization variables

New organization variable をクリックして構成変数追加画面を開き、NameValue を入力し、Add variable をクリックします。

Add organization variable

追加済みの構成変数は値とともに参照できます。

Added organization variable

リポジトリ単位の構成変数

#

次にリポジトリ単位の構成変数(Repository variables)です。

リポジトリの Settings > Security > Secrets and variables で Variables タブを開くと構成変数の画面が開きます。設定済みのオーガニゼーションレベルの変数も参照できます。

Repository settings

New repository variable をクリックすると、変数追加画面が開きますので、NameValue を入力して Add variable をクリックします。

New repository variable

追加済みの変数が値と共に表示されます。

Added repository variable

環境変数の定義

#

最後はリポジトリの環境(Environments)単位の変数(Environment variable)です。

Environments はデプロイターゲットを記述するために使用され、Environments ごとに保護ルールとシークレット・構成変数を設定可能です。保護ルールを使うと、Environments を参照するジョブで承認を要求する、特定のブランチに制限するなどの条件を指定できます。詳細はドキュメントを参照してください。

Using environments for deployment - GitHub Docs

Information

Environments は public リポジトリと有償プランの private リポジトリで利用できますが、無償プランの private リポジトリでは利用できないようです。

まず、環境の定義からです。リポジトリの Settings > Environments を開き、New environment をクリックします。

Manage environments

Environments の追加画面が開きますので、Name を入力して、Configure environment をクリックします。

Add environment

Environment の構成画面が開きます。ここで、環境用のブランチ、シークレット、環境変数の追加ができます。Add variable をクリックします。

Configure environment

変数追加画面が開くので、NameValue を入力して Add variable をクリックします。

Add variable for environment

追加された変数は値と共に参照できます。

Added variable for environment

development と同様に、staging や production の環境も追加しました。

Three environments

Actions variables の画面では、全ての Environment variables が値と共に参照できます。

Added variable for each environment

ワークフローからの構成変数の利用

#

では定義した構成変数をワークフローから利用してみましょう。以下のようなワークフローファイルを用意しました。

name: Show variables

on:
workflow_dispatch:
inputs:
deployment_target:
description: 'Deployment target'
required: true
default: 'development'
type: choice
options:
- development
- staging
- production

jobs:
display-variables:
runs-on: ubuntu-latest
environment: ${{ inputs.deployment_target }}
steps:
- name: Use variables
run: |
echo "Organization variable : ${{ vars.ORG_NAME }}"
echo "Repository variable : ${{ vars.PLATFORM_VERSION }}"
echo "Environment variable : ${{ vars.SERVICE_URL }}"

手動実行の入力パラメータとして、ターゲットのデプロイ先(development、staging、production)を選択するようにしました。ここで選択されたターゲットはジョブの environment に設定され、デプロイ先に応じた変数が参照されます。ジョブのステップでは、オーガニゼーションレベル、リポジトリ単位、環境単位の変数を表示しています。変数は vars コンテキストから取り出すことができます。

このワークフローを実行すると、Deployment target のセレクトボックスが表示されます。

Select target

staging を選択して実行しました。

Run for staging

実行結果です。各レベルで設定した変数が出力されています。

Workflow run result

最後に

#

以上、GitHub Actions で使えるようになった構成変数を試しました。特に難しいところはないと思います。リポジトリの Environments に関してはこれまでその存在を意識していませんでした。従来は専用の CD ツールやワークフロー内部で扱っていたようなブランチルール、シークレット、環境変数を管理できるようになっていました。


  1. ワークフローファイルに書く env 変数のスコープは、ワークフロー単位・ジョブ単位・ステップ単位の3レベルがあります。 ↩︎

  2. 再作成することはできます。 ↩︎

  3. 参照可能なリポジトリを選択することもできます。 ↩︎

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み (2022-12-08)
  2. Docker+Wasm で WASM をコンテナとして実行する (2023-01-25)
  3. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  4. 直感が理性に大反抗!「モンティ・ホール問題」 (2022-07-04)
  5. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  6. AWS認定資格を12個すべて取得したので勉強したことなどをまとめます (2022-12-12)
  7. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  8. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  9. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  10. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)