github actions で外部ファイルの変数を展開する


概要

業務の中で、github actions のワークフローから外部ファイルを読み込み、外部ファイル中の変数を展開して、利用したいという要望が生まれた。

github actions のワークフロー(テンプレートファイル内)ではワークフロー構文を用いて、ワークフロー中で定義した変数や各ステップの変数などを展開して利用することが可能である。

一方で、読み込んだファイルに対しての操作が定義されいてないので、sed コマンドを用いて実装した。

sed コマンド

man コマンドで sed を調べると、以下のように定義されている。

The sed utility reads the specified files, or the standard input if no files are specified, modifying the input as specified by a list of commands.

要するに、指定したファイルや、標準出力に対して修正を行えるコマンドである。

sed コマンドの具体的な使用方法は下記の記事が参考になります。

json ファイル内に独自に定義した変数を sed コマンドで展開する

上記で説明した sed コマンドを使って、json ファイル内に定義した独自の変数を展開する。

まずは、json ファイルを用意する。

hello.json
{
  "hello": "${hello}"
}

-e オプションを用いて、正規表現を使った置換を行う。

sed -e 's/${hello}/HelloWorld/g' hello.json
{
  "hello": "HelloWorld"
}

${hello}HelloWorld に変換されている。

今回は、正規表現を用いて返還したため、変数と判定しやすいように${ 変数名 }という形を取ったが< 変数名 >など、変数と判定できればなんでも良い。また、-e オプションの代わりに -i オプションをつけることでファイルを直接変更することもできる。

github actions で json ファイルを読み込み変数を sed コマンドで展開する

いよいよここから本題です。と言っても、上記で説明した内容を github actions のワークフローに適用するだけである。

先ほどと同様に、json ファイルを用意する。

hello.json
{
  "hello": "${hello}"
}

次にワークフローを定義する。

.github/workflows/hello.yml
name: hello

on:
  push:
    branches:
      - main

env:
  HELLO_WORLD: HelloWorld

jobs:
  hello:
    name: HelloWorld sample
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      # json ファイル出力
      - name: before modify json file
        run: cat hello.json

      # sed コマンドで json ファイルの変数展開
      - name: modify json file
        run: sed -i 's/${hello}/${{ env.HELLO_WORLD }}/g' hello.json

      # json ファイル出力
      - name: after modify json file
        run: cat hello.json

以下のようなディレクトリ構造になっていればOK。

❯ tree -a -I .git
.
├── .github
│   └── workflows
│       └── hello.yml
└── hello.json

この状態で main branch にプッシュすると github action が走る。以下が実行結果である。

ワークフロー中で外部ファイルを読み込み、外部ファイル中の変数を展開することができた。