Traffine I/O

日本語

2023-03-06

GitHub Actionsの環境変数

はじめに

環境変数とシークレットは、GitHub Actionsにおいて構成管理や機密データの安全な管理を可能にする重要な要素です。この記事では、GitHub Actionsにおける環境変数の効果的な管理とシークレットの取り扱いについて解説します。

環境変数の管理

環境変数は、GitHub Actionsワークフローを構成する強力な手段です。動的な値を保存し、ワークフロー内で再利用することができ、コードをよりスマートで効率的にします。この章では、GitHub Actionsで環境変数を定義、使用、管理する方法について詳しく説明します。

環境変数の定義

GitHub Actionsワークフロー内のさまざまなレベルで環境変数を定義できます。

ワークフローレベル

YAMLファイルのルートレベルでenvキーワードを設定することで、ワークフロー全体に対して環境変数を定義できます。これらの変数は、ワークフロー内の全てのジョブやステップで利用可能です。

yaml
env:
  API_BASE_URL: https://api.example.com
  NODE_ENV: production

jobs:
  build: ...

ジョブレベル

ジョブの定義内でenvキーワードを設定することで、特定のジョブに固有の環境変数を定義できます。これらの変数は、ジョブ内の全てのステップで利用可能ですが、他のジョブでは利用できません。

yaml
jobs:
  build:
    env:
      API_BASE_URL: https://api.example.com
      NODE_ENV: production
    ...

ステップレベル

ステップの定義内でenvキーワードを設定することで、単一のステップに対して環境変数を定義できます。これらの変数は、そのステップのコンテキスト内でのみ利用可能です。

yaml
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 }}の構文を使用します。

yaml
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の強力な機能です。環境変数を使用して、行列ジョブをパラメータ化することができます。これにより、同じワークフローを様々な構成で再利用できます。

yaml
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コンテキストで参照します。

yaml
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ワークフローでシークレットを作成、管理、使用する方法について説明します。

シークレットの作成と管理

シークレットは、リポジトリレベルと組織レベルの両方で作成および管理することができます。リポジトリ用の新しいシークレットを作成するには、次の手順に従います。

  1. GitHubリポジトリのメインページに移動
  2. 「Setting」タブをクリック
  3. 左サイドバーから「Secrets and variables」>「Actions」をクリック
  4. 「New repository secret」ボタンをクリック
  5. シークレットの名前と対応する値を入力し、「Add secret」をクリック

組織レベルでシークレットを作成する場合は、同様の手順に従いますが、組織設定ページから開始します。

ワークフロー内でシークレットにアクセス

GitHub Actionsワークフロー内でシークレットにアクセスするには、secretsコンテキストを使用します。構文は${{ secrets.SECRET_NAME }}です。以下は、API認証にシークレットを使用する例です。

yaml
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

シークレットはログには表示されず、フォークされたリポジトリではアクセスできないようになっています。これは、機密情報を保護するためのセキュリティ対策です。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!