GitHub Actions 環境変数の使用方法
2022年11月22日
0 分で読めます実用コードの本番稼働環境へのリリースを効率化するには、継続的インテグレーションと継続的デリバリー (CI/CD) のパイプラインを実装することをお勧めします。CI/CD パイプラインは、コード変更のリリースの準備ができているかどうかを確認するプロセスを自動化し、本番稼働環境へのリリースを自動化するツールを提供します。
これを行う一般的な方法の 1 つに、既存のバージョン管理システムを使用することがあります。GitHub は最も広く使用されているバージョン管理システムの 1 つであり、GitHub Actions を提供しています。開発者はこれを使用して、コードを自動的にビルド、テスト、デプロイし、安全な CI/CD パイプラインをビルドすることができます。
GitHub Actions 内のジョブには、環境変数へのアクセスが必要になるのが一般的です。これらの変数は事前に定義でき、その特定の環境で実行されているパイプラインしかアクセスできないようになっています。これにより開発者は、本番稼働環境へのデプロイの前に、最適化された本番バージョンのアプリケーションのビルドに切り替えるなど、CI/CD パイプラインの動作を環境変数に基づいて変更できます。
この実践的な記事では、GitHub Actions 内で使用できる環境変数と、どのような場合にそれらを使用するかについて説明します。
前提条件
このチュートリアルに沿って操作を行うには、次のものが必要です。
コードエディター (このチュートリアルでは Visual Studio Code を使用) を搭載したマシンと GitHub アカウントへのアクセス。
サンプルコード。サンプルコードには、環境変数がどのように機能するかを示すために使用するシンプルな Java アプリケーションが含まれています。
Visual Studio Code の Snyk プラグインを使用すると、開発中のプロジェクトをスキャンできます。詳しくはこちらのドキュメントをご確認ください。
GitHub Actions 環境変数でできること
サンプルコードをダウンロードしたら、GitHub に新しいリポジトリを作成して、サンプルコードをリポジトリに追加します。
サンプルコードには、サンプルの GitHub Actions ワークフローファイルがすでに含まれています。次のコードスニペットは、ファイル「.github/workflows/pipeline.yml
」の内容を示しています。
1name: Java CI with Maven
2
3on:
4 push:
5 branches: [ "main" ]
6 pull_request:
7 branches: [ "main" ]
8
9jobs:
10 build:
11
12 runs-on: ubuntu-latest
13
14 steps:
15 - uses: actions/checkout@v3
16 - name: Set up JDK 21
17 uses: actions/setup-java@v3
18 with:
19 java-version: '21'
20 distribution: 'temurin'
21 cache: maven
22 - name: Build with Maven
23 run: mvn -B package --file pom.xml
このファイルは、Maven を使用して Java アプリケーションをビルドするためのシンプルなワークフローを定義します。
ワークフローの YAML 設定ファイルでは、ワークフロー、ジョブ、ステップという 3 つのレベルで環境変数を定義できます。環境変数のスコープはこれらのレベルによって決まります。ワークフローレベルでは、ワークフロー全体に適用される環境変数を使用します。ジョブレベルでは、特定のジョブに適用される環境変数を使用します。ステップ環境変数は特定のステップに適用されます。
これらの各変数について詳しく見ていきましょう。
ワークフロー環境変数
ワークフローレベルの環境変数を設定するには、YAML ファイルの最上位で環境変数を定義する必要があります。このファイルの先頭にある NAME 変数の下に次のコードを追加してみましょう。
1env:
2 NAME: 'Snyk Demo'
このコードは、ワークフロー内の任意の場所からアクセスできる NAME
という環境変数を定義します。この変数にアクセスするには、UNIX 環境変数にアクセスするときに使用するものに似た、特定の構文を使用する必要があります。NAME
変数を使用するには、変数の先頭にドル記号を付けることで、変数を $NAME
に変更する必要があります。
この変数を出力する新しいステップをワークフローの 23 行目に追加しましょう。
1- name: Print name
2 run: echo "Hello $NAME"
この変更をコミットしてリポジトリにプッシュします。
次に、ブラウザで GitHub を開き、リポジトリ内の「アクション」タブに移動します。「ジョブ」で最新のワークフローを選択し、ビルドジョブの出力を開きます。「name の出力」をクリックします。展開すると、次の画像に示すように、環境変数が正常に出力されたことがわかります。
ワークフローレベルの環境変数は、すべてのジョブとステップに適用される変数を宣言する場合に役立ちます。たとえば、どの種類の環境 (開発、テスト、本番稼働など) でワークフローを実行するかを設定する場合に使用できます。このことは、NODE_ENV
変数を使用することのある、npm を使用してビルドされた Node アプリケーションで役立ちます。この変数を使用することにより、各ジョブが、そのジョブに固有の環境に応じて適切に動作できるようになります。npm パッケージを安全に公開する方法について詳しくは、Snyk ブログのこの記事をご覧ください。
ジョブ環境変数
ジョブとステップの環境変数の設定について見てみましょう。これらの環境変数はワークフロー環境変数と同じ方法で設定できますが、ここでは、それぞれに該当するセクション内で定義することにします。
ジョブ変数では、Java バージョンを次のように定義します。
1jobs:
2 build:
3 env:
4 JAVA_VERSION: '21'
ステップ内で、以前と同様にこの変数を使用できるようになりました。
1steps:
2- uses: actions/checkout@v3
3- name: Set up JDK ${{env.JAVA_VERSION}}
4 uses: actions/setup-java@v3
5 with:
6 java-version: ${{env.JAVA_VERSION}}
7 distribution: 'temurin'
8 cache: maven
ただし、お気づきかもしれませんが、JAVA_VERSION
環境変数を使用する場合は構文が多少異なります。これは、コンテキストを使用して環境変数にアクセスする例です。コンテキストを使用すると、GitHub Actions が任意の仮想マシン上で環境変数を使用できるようになります。これらのタスクは、環境を宣言するときと同じ仮想マシン上で常に実行されるわけではないためです。
特定のジョブですでに宣言されているワークフロー変数に異なる値が必要な場合、または変数のスコープを 1 つの特定のジョブに制限する場合は、ジョブ環境変数を使用してワークフローレベルの環境をオーバーライドできます。
上の例に示すように、ジョブ環境変数を使用して Java バージョンを設定し、各ステップで変数を使用できるようにすることができます。後で別の Java バージョンを使用する必要が生じた場合も、変更を 1 か所で行うだけで、ジョブ内のすべてのステップで新しいバージョンが自動的に使用されるようになります。
GitHub アクションの作業をすでに開始しているので、Snyk を GitHub Actions に簡単に統合して、プロジェクトをすぐにスキャンすることが可能です。事前にビルドされた Snyk GitHub Actions を使用できるため便利です。Snyk アカウントにまだ登録していない場合は今すぐ登録して、スキャンを統合しましょう。
ステップ環境変数
ステップ内で変数を定義することもできます。以下はステップ環境変数の例です。次のコードスニペットと一致するように、「pipeline.yml
」ファイルの「name の出力」ステップを修正します。
1- name: Print name
2 run: echo "Hello $NAME. $BUILD. Using Java Version $JAVA_VERSION"
3 env:
4 BUILD: 'We are currently running the Build job'
ステップ環境変数は、スコープを 1 つのステップだけに制限します。このことは、ステップに固有の入力ファイルまたは出力ファイルのファイルパスを定義する場合などに役立ちます。上記のサンプルコードでは、ステップ変数を使用して、出力するテキストを設定しています。
以下は、完全な GitHub ワークフロー YAML ファイルの例であり、新しいジョブおよびステップ環境変数の追加を示しています。
1name: Java CI with Maven
2
3env:
4 NAME: 'Snyk Demo'
5
6on:
7 push:
8 branches: [ "main" ]
9 pull_request:
10 branches: [ "main" ]
11
12jobs:
13 build:
14 env:
15 JAVA_VERSION: '21'
16
17 runs-on: ubuntu-latest
18
19 steps:
20 - uses: actions/checkout@v3
21 - name: Set up JDK ${{env.JAVA_VERSION}}
22 uses: actions/setup-java@v3
23 with:
24 java-version: ${{env.JAVA_VERSION}}
25 distribution: 'temurin'
26 cache: maven
27 - name: Build with Maven
28 run: mvn -B package --file pom.xml
29 - name: Print name
30 run: echo "Hello $NAME. $BUILD. Using Java Version $JAVA_VERSION"
31 env:
32 BUILD: 'We are currently running the Build job'
この新しいワークフローを GitHub にチェックインし、出力を確認すると、次の画像のように表示されます。
コンテキストを使用した環境変数の設定が完了し、出力ステップが期待どおりに機能していることがわかりました。
コンテキストなしで環境変数を使用しようとすると、次のエラーが表示されます。
これは、setup-java アクション
が同じ環境にアクセスできないため、変数を使用可能にするにはコンテキストを使用する必要があるためです。
デフォルト変数と GitHub シークレットの使用
GitHub には、環境変数の定義に加えて、ワークフロー内でアクセスできるデフォルト変数がいくつか用意されています。これらの変数を使用すると、GitHub リポジトリ、GitHub アクション、ワークフローのランナーなどの詳細にアクセスできます。デフォルト変数は、ユーザー定義の環境変数と同じように使用できます。GitHub Actions の使用時にデフォルト変数にアクセスするには、コンテキストの使用が必要となる場合があります。
最後のタイプの環境変数は GitHub シークレットです。GitHub シークレットは、機密データを格納する変数として使用できます。GitHub はこれらの変数を暗号化して、ワークフロー内で使用できるようにします。
暗号化された環境変数を GitHub 内で作成するには、リポジトリの「設定」エリアに移動し、左側のメニューから「シークレットと変数」、「アクション」の順に選択します。次に、「新しいリポジトリシークレット」をクリックして、シークレットの名前と値を入力します。以下に示すように、API_KEY
というシークレットを作成し、ランダムな値を与えます。
ワークフロー内でシークレットを使用するには、コンテキストを使用して GitHub Actions に環境変数を指定する場合と同じ構文を使用します。ただし、変数の前に env.
を付ける代わりに secrets.
を使用します。
1${{secrets.API_KEY}}
ワークフローの YAML ファイル内にすでにビルドした print ステートメントに ${{secrets.API_KEY}}
を追加します。次のコードスニペットと一致している必要があります。
1- name: Print name
2 run: echo "Hello $NAME. $BUILD. Using Java Version $JAVA_VERSION. My API_KEY is ${{secrets.API_KEY}}"
3 env:
4 BUILD: 'We are currently running the Build job'
変更をコミットして、リポジトリにプッシュします。次に、GitHub の「アクション」ページに移動して、最新のワークフロー実行からの出力を確認します。
ご覧のとおり、GitHub は暗号化されたシークレットの値を自動的にマスクするため、誤って公開されることはありません。
GitHub シークレットは、パスワードや API 認可キーなどの機密データを保存するのに役立ちます。シークレットを使用すると、ワークフローでこれらの値をハードコーディングする必要がなくなり、外部エンティティに公開されるリスクにさらされません。GitHub はシークレットを自動的に暗号化して、ワークフロー内の任意のアクションに安全に渡し、ログにプレーンテキストで表示されないようにします。
結論
この記事では、GitHub Actions 環境変数について説明しました。具体的には、環境変数で使用できる 3 つのスコープ (ワークフロー、ジョブ、ステップ) と、これらの各スコープで変数を定義する方法について説明しました。また、コンテキストを使用して環境変数を GitHub Actions に渡す方法に加え、シークレットを使用して機密性の高い変数を暗号化する方法を確認しました。
GitHub Actions 環境変数を使用すると、開発者は動的なワークフローをビルドできます。これらの変数を使用して、ユーザー定義の変数またはデフォルトの GitHub 変数に基づいてワークフローの動作を変更できます。ワークフロー、または特定のジョブやステップの動作方法や実行のタイミングを動的に変更したい場合は、常に変数を使用する必要があります。
この記事では、GitHub シークレットを環境変数として使用して機密情報を保護することについても説明しました。パスワードや API キーなどの機密性の高い変数には GitHub シークレットを使用することが重要です。シークレットは GitHub によって暗号化されてワークフローに挿入されるため、公開されるリスクがありません。
セキュリティは重要です。Snyk が GitHub ワークフローのセキュリティを強化する仕組みに加え、Snyk を CI/CD パイプラインに統合してコード、コンテナ、オープンソース、IaC のセキュリティを全方位的に確保する方法の詳細をご確認ください。