🚀

GitHubのEnvironmentsことはじめ

2022/07/31に公開1

GitHubのEnvironmentsという機能がとても便利だったので紹介します。
本記事では、Environmentsの設定方法や、GitHub Actionsと組み合わせた簡単な事例で説明していきます。

公式のDocs
https://docs.github.com/ja/actions/deployment/targeting-different-environments/using-environments-for-deployment

Environmentsとはなにか?

公式のDocsには下記のように書いてありました。

A workflow job that references an environment must follow any protection rules for the environment before running or accessing the environment's secrets.

GitHubのリポジトリに対して、保護ルールやSecret情報を持つ環境を設定することができる機能になります。

ここで言う環境とは、develop(開発)・staging(検証)・production(本番)といった、ソフトウェア開発におけるリリース運用フロー時によく構築する環境のことを指しています。
ブランチ運用のGit-Flowでも、developやfeature、mainなどが登場しますが、基本的にはmainブランチが本番相当の環境であることが多いと思います。

Git-Flowの参考
https://www.atlassian.com/ja/git/tutorials/comparing-workflows/gitflow-workflow

また、このEnvironmentsはGitHub Actionsと組み合わせることによってCICDのデプロイワークフローを組むことが可能になります。

Environmentsの設定

実際に、Environmentsを設定していきます。

環境名の設定

  • リポジトリのSetting > Environments

  • Environments > New Environmentを押下

  • New Environmentで登録したい環境名を入力

productionという環境を作成してみました。詳細設定について解説していきます。

環境の詳細設定

Environment Protection rules

環境に対して保護設定を行うことができます。

  • Required Reviewers
  • Wait timer

Required Reviewersのチェックを入れると、デプロイに対する承認が必須となり、承認がないとデプロイのジョブが実行されないように保護をかけることができます。(Pull Requestの流れと同じです。)

また、wait timeでジョブ実行までの待機時間を設定することができます。

Deployment Branches

デプロイ対象ブランチの制限を行うことができます。

  • All Branches すべてのブランチからデプロイが可能です。
  • Protected Branches ブランチ設定の保護機能で保護されているブランチのみ、デプロイが可能です。
  • Selected Branches ブランチ保護設定とは別に、デプロイ対象ブランチを独自に指定して制限します。

Add secret

環境ごとに環境変数の登録が可能です。

(例)NameをHOGE_KEYで登録すると、GitHub Actionsからは、下記のように指定してValueを参照することができます。

 {{ secrets.HOGE_KEY }}

productionとstagingというEnvironmentを設定して、GitHub Actionsで簡単なワークフローを組んでみました。(特にデプロイ作業は行いません。echoで出力するだけのシンプルなフローです)

deploy.yml
name: Deploy-Staging-Production

on:
  workflow_dispatch:

jobs:
  deploy_staging:
    runs-on: ubuntu-latest
    environment:
      name: staging
      url: https://yahoo.co.jp
    steps:
      - run: echo deploy staging
      - run: echo secret ${{ secrets.SAMPLE_SECRET }}
  
  deploy_production:
    runs-on: ubuntu-latest
    environment:
      name: production
      url: https://google.com
    steps:
      - run: echo deploy production
      - run: echo secret ${{ secrets.SAMPLE_SECRET }}
    environment:
      name: production
      url: https://google.com

で、job.environment.namejob.environment.urlを指定することができます。
この指定を行うと、ジョブがenvironment機能の対象になります。

項目

  • name・・・environmentの環境名を設定します
  • url(任意)・・・成果物のurlパスを指定します。デプロイ結果画面にリンクが表示されるようになります。

実行&承認作業

production環境にレビュー設定を入れているため、GitHub Actionsを動かすと画像のように、deploy_productionのフローが待機状態になります。

Review deploymentsを押すと、承認画面に遷移します。

チェックと、コメントを入れてRejectするかApprove & deploymentを押下します。

  • Rejectすると、deploymentは失敗します。
  • Approve & deploymentすると、productionのジョブが始まります。

すべてのフローが終了すると、下記のような状態になり、承認者とコメントも見ることができます。

デプロイ履歴の確認

リポジトリにEnvironmentの項目が表示されるようになります。画像右下

環境名を押下し、詳細画面に遷移すると、過去のdeploy履歴が閲覧でき、デプロイ状態とバージョンの紐付けの閲覧が可能になります。

まとめ

  • Environmentsを利用することで、GitHub Actionsでのデプロイ承認フローを構築することができ、安全なデプロイ作業が実現できる。
  • 複数の環境を設定して柔軟なGitHub Actionsのワークフローを組むことができる。
  • デプロイ履歴の確認や状態の閲覧を簡単に行うことができる。

Discussion

bigwheel kbigwheel k

2022年7月現在、privateリポジトリではenvironmentを使うことはできません。GitHub Enterpriseの契約が必要なようです。

2023/03/17現在、
https://docs.github.com/ja/actions/deployment/targeting-different-environments/using-environments-for-deployment

環境、環境のシークレット、環境保護ルールは、すべての製品のパブリック リポジトリで利用できます。 プライベートまたは内部リポジトリ内の環境、環境のシークレット、デプロイ ブランチにアクセスするには、GitHub Pro、GitHub Team または GitHub Enterprise を使う必要があります。 プライベートまたは内部リポジトリ内の他の環境保護ルールにアクセスする場合は、GitHub Enterprise を使う必要があります。 詳しくは、「GitHub の製品」をご覧ください。

と書かれており、ProやTeamでも環境の機能を使用できるようです。

いつ頃変更が入ったのか一次ソースは見つからなかったのですが、
https://github.com/orgs/community/discussions/26262#discussioncomment-3865823
のコメントを見るとおそらく2022年の9~10月頃みたいです。