Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

GitHub Actionsで環境(Environment)をパラメーターで指定する

こんにちは、MLBお兄さんこと松村です。
MLB はオールスターゲームを終え、後半戦に突入しました。8月1日のトレードデッドラインに向かって、各球団が慌ただしくなる時期になります。


GitHub Actions でデプロイを行う際に環境 (Environment) という機能を用いて、保護ルールやシークレットの管理をすることができます。

docs.github.com

環境 (Environment) とは

環境 (Environment) で設定可能な主なルールは以下の通りです。

ルール 内容
必須レビューアー 6名のユーザー、もしくはチームを指定する
待機タイマー ワークフローの開始を遅らせる時間を指定する

また、環境ごとにシークレットや変数を指定することもできます。

ワークフローの各ジョブにおいてどの環境を適用するのかは、environment という項目で指定します。
下記の YAML ファイルでは production という環境が適用されます。

name: Deployment

on:
  push:
    branches:
      - main

jobs:
  deployment:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: deploy
        # ...deployment-specific steps

パラメーターで環境を指定する

さて、この環境の値はハードコーディングすることが多いと思いますが、実は手動実行(workflow_dispatch)ではパラメーターとして指定することができます。

下記の YAML ファイルを例に説明します。

name: GitHub Actions environment inputs

on:
  workflow_dispatch:
    inputs:
      environment:
        description: '環境名'
        required: true
        type: environment
  
jobs:
  show-vars-on-environment:
    environment: ${{ inputs.environment }}
    runs-on: ubuntu-latest
    steps:
      - name: show variables
        run: echo ${{ vars.WHO_AM_I }}
行番号 内容
6行目 環境をパラメーターで受け取る設定です
手動実行の際に環境をリストから選択することができるようになります
13行目 指定した環境をジョブに適用します
17行目 環境に定義された変数の値を出力します

環境に env1 を指定した場合の実行結果

環境に env2 を指定した場合の実行結果

何が嬉しい?

ジョブ1つにつき環境は1つしか指定できない(はず)ため、「やることは同様だけど環境が異なる」場合には同じジョブを2つ記載する必要がありました。
長くなればなるほどメンテナンスが大変ですよね。

jobs:
  deploy-staging:
    environment: staging
    runs-on: ubuntu-latest
    steps:
      - name: show variables
        run: echo ${{ vars.WHO_AM_I }}

  deploy-production:
    environment: production
    runs-on: ubuntu-latest
    steps:
      - name: show variables
        run: echo ${{ vars.WHO_AM_I }}

environment を指定できると、上記のような記述をまとめることができます。

jobs:
  deploy:
    environment: ${{ inputs.environment }}
    runs-on: ubuntu-latest
    steps:
      - name: show variables
        run: echo ${{ vars.WHO_AM_I }}

ハードコーディングなワークフローと動的なワークフローを使い分けができるようになりたいですね。