【GitHub Actions】JSON / XML / YAMLファイルを動的に書き換える方法

はじめに

エキサイト株式会社 バックエンドエンジニアの山縣です。

GitHub Actionsを使用して、 ワークフローを実行するときに、YAMLファイルを動的に書き変える必要がありました。 本記事では、デプロイ周りを整備するときに得た知見の1つとして、GitHub ActionsでJSON / XML / YAMLファイルを動的に書き換える方法について紹介します。

やること

サンプルとして、次のJSONファイル(sample.json)を用意しました。

{
    "value": "",
    "items": [
        {
            "name": "",
            "price": 100
        },
        {
            "name": "",
            "price": 200
        }
    ]
}

GitHub Actionsを実行時に、value, items[0].name, items[1].nameを、次のとおりに書き換えます。

{
    "value": 123,
    "items": [
        {
            "name": "apple",
            "price": 100
        },
        {
            "name": "orange",
            "price": 200
        }
    ]
}

ワークフロー

GitHub ActionsでJSONファイルを動的に書き換えるために、microsoft/variable-substitution@v1を使用します。 これを使用すると、JSON / XML / YAMLファイルにある値を、動的に書き換えることができるようになります。

github.com

使用方法

サンプルとして、「GitHubにプッシュ時に、JSONファイルの値を書き換えて、それを表示する」ワークフロー(sample.yml)を用意しました。 これを、.github/workflowsディレクトリ配下に置いてプッシュすることで、ワークフローを実行することができます。

on: [push]
name: run

jobs:
  run:
    runs-on: ubuntu-latest

    env:
      ITEM_NAME_1: orange

    steps:
    - uses: actions/checkout@v2

    - uses: microsoft/variable-substitution@v1 
      with:
        files: sample.json
      env:
        value: 123
        items.0.name: apple
        items.1.name: ${{ env.ITEM_NAME_1 }}
    
    - run: cat sample.json

配列の要素にアクセスする

ドキュメントには、配列の要素にアクセスする方法について書かれていません。 しかし、Issueを見てみると、インデックスを指定すると配列の要素にアクセスできることがわかります。

配列の要素にアクセスするときは、items.0.nameのように記述する必要があります。

github.com

実行結果

実際に、上記のワークフローを実行します。 確かに、value, items[0].name, items[1].nameが書き換わっていることが確認できます。

おわりに

microsoft/variable-substitution@v1を使用することで、YAMLファイルを動的に書き換えることができました。 これにより、次のようなことができるようになります。

  • シークレット情報を環境変数に置き、JSONで作成した設定ファイルに渡すことができる
  • コミットハッシュ値を使用した文字列を、YAMLで作成した設定ファイルに渡すことができる

この記事がお役に立てれば幸いです。

採用アナウンス

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しています。 また、長期インターンも歓迎しています。

カジュアル面談からもOKです。少しでもご興味がございましたら、お気軽にご連絡頂ければ幸いです。

▼ 募集職種一覧 ▼ www.wantedly.com