GitHub Actions ワークフローを再利用する（共通化）

# はじめに

このシリーズは GitHub Actions を触ってみたいけど、ざっくり理解したい方向けの記事です。

1. [GitHub Actions ざっくりワークフローを理解](https://qiita.com/mkin/items/16fcbb1a44d49c3daaee)
1. [GitHub Actions のシークレット情報と変数の設定方法](https://qiita.com/mkin/items/75a4928a1fafe5eacd17)
1. [GitHub Actions ワークフローを再利用する（共通化）](https://qiita.com/mkin/items/d3e79cfc032958953dfe) （←当記事）

前回はデプロイ周りのワークフローを通して、シークレット情報と変数の設定方法をご紹介しました。

https://qiita.com/mkin/items/75a4928a1fafe5eacd17

実際には、ステージング環境、本番環境など別々の設定値やワークフローがあるので、今回はそれらの設定方法をご紹介いたします。

# ワークフローを再利用する（共通化）

環境ごとにシークレット情報や変数は違えども、デプロイするワークフローは共通化したいものです。
こういう場合、ワークフローを再利用できます。

イメージとしてはこんな感じになります。

```mermaid
flowchart TB
  subgraph ワークフローの再利用
    deploy-prd.yml--本番環境の設定値を渡す-->_deploy.yml
    deploy-stg.yml--ステージング環境の設定値を渡す-->_deploy.yml
  end
```

※再利用ワークフローのファイル名は任意です。ここではプレフィックス`_`を設定して説明します。


それでは、さっそく設定方法を見ていきましょう。

# 再利用ワークフローの作り方（`_deploy.yml`）

再利用ワークフローの作り方のポイントは下記の3点です。

1. `on` に `workflow_call` を設定する（「呼び出したときに実行するよ」と理解してます）
1. 入力値は `inputs` で設定する（同様の書き方で `outputs` も設定できます）
1. シークレット値は `secrets` で設定する

具体的には、このような YAML ファイルになります。
（ちょっと長くなってしまったので、コメント部分だけ拾っていただければ大丈夫です:bow:）

```yaml:_deploy.yml（再利用ワークフローの例）
name: Deploy(再利用ワークフロー)

on:
  # ポイント1: `on` に `workflow_call` を設定
  workflow_call:
    # ポイント2: 入力値は `inputs` で設定
    inputs:
      MY_AWS_REGION:
        description: 'AWS Region'
        type: string
        required: true
        default: 'us-east-2'
      MY_ECR_REPOSITORY:
        description: 'ECR Repository'
        type: string
        required: true
        default: 'my-ecr-repo'
      （中略）
    # ポイント3: シークレット値は `secrets` で設定
    secrets:
      AWS_ACCESS_KEY_ID:
        description: 'AWS Access Key ID'
        required: true
      AWS_SECRET_ACCESS_KEY:
        description: 'AWS Secret Access Key'
        required: true

env:
  # 入力値は ${{ inputs.入力ID }} で参照
  AWS_REGION: ${{ inputs.MY_AWS_REGION  }}
  ECR_REPOSITORY: ${{ inputs.MY_ECR_REPOSITORY  }}
  （中略）

jobs:
  deploy:
    name: Deploy(再利用ワークフロー)
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        # シークレット値は ${{ secrets.シークレットID }} で参照
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}
    (以下略）
```

# 再利用ワークフローの呼び出し方

先程の `_deploy.yml`の呼び出し方のポイントは下記の3点です。

1. `uses` で再利用ワークフローのファイルパスを設定する
1. 再利用ワークフローの入力値 `inputs` には `with` で設定する
1. 再利用ワークフローのシークレット値 `secrets` には `secrets` で設定する

具体的には、このような YAML ファイルになります。

```yaml:deploy-stg.yml（再利用ワークフローを呼び出す例）
name: Deploy Staging

on:
  push:
    branches:
      - main

jobs:
  deploy-stg:
    # ポイント1: `uses` で再利用ワーク
    uses: ./.github/workflows/_deploy.ymlフローのファイルパスを設定
    # ポイント2: 再利用ワークフローの入力値 `inputs` には `with` で設定
    with:
      MY_AWS_REGION: ${{ vars.MY_AWS_REGION  }}
      MY_ECR_REPOSITORY: ${{ vars.MY_ECR_REPOSITORY  }}
      （中略）
    # ポイント3: 再利用ワークフローのシークレット値 `secrets` には `secrets` で設定
    secrets:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
```

# ワークフローを実行してみる

この設定でステージングと本番のデプロイを実行してみます。
すると、GitHub Actions のページから、`deploy-stg` と `deploy-prd` の両方が再利用ワークフローを使用していることが分かりますね。

## deploy-stgのワークフローを実行
![deploy-stgが再利用ワークフローを使用していることが分かる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/8393364b-d517-1480-de73-5b0395bb76f2.png)

## deploy-prdのワークフローを実行
![deploy-prdが再利用ワークフローを使用していることが分かる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/c8e41452-39b8-86f5-b0ef-d435b5ed777c.png)

# おわりに

再利用ワークフローを使うことで、処理を共通化できることが分かりました。
今回はデプロイだけでしたが、実際のプロダクトでは`lint`や`test`といったワークフローも再利用するケースも出てくるのではないでしょうか？

もし、すでにGitHub Actionsを導入されているようでしたら、これを機に確認してみて、理解を深めていっていただけると幸いです。

# 参考

https://docs.github.com/ja/actions/using-workflows/reusing-workflows