はじめに
環境変数とシークレットは、GitHub Actionsにおいて構成管理や機密データの安全な管理を可能にする重要な要素です。この記事では、GitHub Actionsにおける環境変数の効果的な管理とシークレットの取り扱いについて解説します。
環境変数の管理
環境変数は、GitHub Actionsワークフローを構成する強力な手段です。動的な値を保存し、ワークフロー内で再利用することができ、コードをよりスマートで効率的にします。この章では、GitHub Actionsで環境変数を定義、使用、管理する方法について詳しく説明します。
環境変数の定義
GitHub Actionsワークフロー内のさまざまなレベルで環境変数を定義できます。
ワークフローレベル
YAMLファイルのルートレベルでenv
キーワードを設定することで、ワークフロー全体に対して環境変数を定義できます。これらの変数は、ワークフロー内の全てのジョブやステップで利用可能です。
env:
API_BASE_URL: https://api.example.com
NODE_ENV: production
jobs:
build: ...
ジョブレベル
ジョブの定義内でenv
キーワードを設定することで、特定のジョブに固有の環境変数を定義できます。これらの変数は、ジョブ内の全てのステップで利用可能ですが、他のジョブでは利用できません。
jobs:
build:
env:
API_BASE_URL: https://api.example.com
NODE_ENV: production
...
ステップレベル
ステップの定義内でenv
キーワードを設定することで、単一のステップに対して環境変数を定義できます。これらの変数は、そのステップのコンテキスト内でのみ利用可能です。
jobs:
build:
steps:
- name: Run API tests
env:
API_BASE_URL: https://api.example.com
NODE_ENV: test
run: npm run test-api
ワークフローのステップで環境変数を使用
環境変数を定義した後は、env
コンテキストを使用して、ワークフローのステップ内で参照できます。これには、${{ env.VARIABLE_NAME }}
の構文を使用します。
jobs:
build:
steps:
- name: Install dependencies
run: npm ci
- name: Run tests
env:
API_BASE_URL: https://api.example.com
run: API_URL=${{ env.API_BASE_URL }} npm test
マトリックス戦略での環境変数
マトリックス戦略は、単一のワークフロー定義を使用して異なる構成を持つ複数のジョブを作成できる、GitHub Actionsの強力な機能です。環境変数を使用して、行列ジョブをパラメータ化することができます。これにより、同じワークフローを様々な構成で再利用できます。
jobs:
build:
strategy:
matrix:
node_version: [12, 14, 16]
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: $ {{ matrix.os }}
env:
NODE_VERSION: $ {{ matrix.node_version }}
steps:
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: $ {{ env.NODE_VERSION }}
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
GitHub Actionsでのデフォルトの環境変数
GitHub Actionsは、独自に定義する必要がない、一連のデフォルトの環境変数を提供しています。これらの変数には、リポジトリやランナーのコンテキストに関する情報など、便利なデータが含まれます。一般的に使用されるデフォルトの環境変数には、以下があります。
GITHUB_REPOSITORY
: リポジトリの所有者と名前。例えば、octocat/Hello-World
。GITHUB_SHA
: ワークフロー実行をトリガーしたコミットSHA。GITHUB_REF
: ワークフロー実行をトリガーしたブランチまたはタグの参照。GITHUB_WORKSPACE
: GitHubワークスペースのディレクトリパス。
これらのデフォルトの環境変数を使用するには、カスタム環境変数と同様にenv
コンテキストで参照します。
jobs:
build:
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Print repository information
run: |
echo "Repository: ${{ env.GITHUB_REPOSITORY }}"
echo "Commit SHA: ${{ env.GITHUB_SHA }}"
echo "Ref: ${{ env.GITHUB_REF }}"
echo "Workspace directory: ${{ env.GITHUB_WORKSPACE }}"
シークレットを使用した機密データの取り扱い
多くの場合、ワークフローにはAPIキー、資格情報、トークンなどの機密データへのアクセスが必要です。GitHub Actionsは、シークレットを使用してこのようなデータを安全に管理する方法を提供しています。シークレットは、機密情報を安全に保存するために設計された暗号化された環境変数です。この章では、GitHub Actionsワークフローでシークレットを作成、管理、使用する方法について説明します。
シークレットの作成と管理
シークレットは、リポジトリレベルと組織レベルの両方で作成および管理することができます。リポジトリ用の新しいシークレットを作成するには、次の手順に従います。
- GitHubリポジトリのメインページに移動
- 「Setting」タブをクリック
- 左サイドバーから「Secrets and variables」>「Actions」をクリック
- 「New repository secret」ボタンをクリック
- シークレットの名前と対応する値を入力し、「Add secret」をクリック
組織レベルでシークレットを作成する場合は、同様の手順に従いますが、組織設定ページから開始します。
ワークフロー内でシークレットにアクセス
GitHub Actionsワークフロー内でシークレットにアクセスするには、secrets
コンテキストを使用します。構文は${{ secrets.SECRET_NAME }}
です。以下は、API認証にシークレットを使用する例です。
jobs:
deploy:
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Deploy to production
env:
API_KEY: ${{ secrets.PRODUCTION_API_KEY }}
run: |
curl -X POST -H "Authorization: Bearer ${{ env.API_KEY }}" https://api.example.com/deploy
シークレットはログには表示されず、フォークされたリポジトリではアクセスできないようになっています。これは、機密情報を保護するためのセキュリティ対策です。