【Github】Github Actions ~ 設定ファイルを考える ~

■ はじめに

小ネタ。

https://dk521123.hatenablog.com/entry/2024/02/18/232926

で設定値の切り替えについて行った。

 ただ、設定を固定値で書くと、もし、その設定値が変わった場合
逐一書き直さないとならない。
更に、この設定値が別のファイルにも書かれていた場合、
手間だけでなく、メンテナンス性含めてしんどいことになるので
出来る限り一ヶ所でまとめて管理したい。

そこで、 Github Actionsで使える設定ファイルのフォーマットについて
考えてみた

目次

【1】Github Actionsで使える設定ファイルを考える
 1)補足:yq コマンド 
 2)実験コード
【2】使用上の注意
 1)jq / JSONの場合
【3】サンプル
 例1:cat コマンド を利用する場合
 例2:jq コマンド を利用する場合

【1】Github Actionsで使える設定ファイルを考える

* Github Actions の場合、Bash などのコマンドベースで行うことが多い。
 コマンドベースで行う場合、jq などの専用コマンドで扱えないとしんどい。
 問題は、Github Actionsの実行環境でそのコマンドが使えるかが焦点になる
* そこで、以下の観点で考えてみる必要があると思う
~~~~~~~
[1] 実行環境(GitHub hosted runners or Self-hosted runner)
[2] その他現場の要件(実行環境に自由にソフトウェアをインストール可能か?)
~~~~~~~

* 値が1つしかない場合(例えば、versionなど)は、
 catコマンドなどでシンプルにするのもありかと。(サンプル参照)

メモ

* 本当は、YAMLを使いたいが、現場がSelf-hosted runnerで yq が入っていない
* jq コマンドは比較的にどの環境でもデフォルトで入っているのでJSONであれば問題ない

1)補足:yq コマンド

jq はJSONを扱うコマンド(以下の関連記事を参照のこと)だが、そのYAML版。
(XMLなら、xqがあるみたい。使わないだろーけど)

jq コマンド ~ JSON を扱う ~
https://dk521123.hatenablog.com/entry/2020/02/01/000000

2)実験コード

* GitHub hosted runners(ubuntu-latest)の場合、jq/yq コマンドが使える模様

.github/workflows/demo_workflow.yml

name: DemoWorkflow

on:
  workflow_dispatch:
jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: |
          jq --version
          yq --version
          dasel --version

出力結果

# jq --version
jq-1.6
# yq --version
yq (https://github.com/mikefarah/yq/) version v4.44.1
# dasel --version
/home/runner/work/_temp/xxxxx-xxxxx-xxxxx-xxxxx-xxxxx.sh: line 3: dasel: command not found
Error: Process completed with exit code 127.

【2】使用上の注意

1)jq / JSONの場合

* 文字列の場合、jq -r しないと、区切り文字付きの値が取得することになる
 => -rオプションなどの詳細は、以下の関連記事を参照のこと

jq コマンド ~ JSON を扱う ~
https://dk521123.hatenablog.com/entry/2020/02/01/000000

【3】サンプル

例1:cat コマンド を利用する場合

.github/VERSION

1.2.3

.github/workflows/workflow1.yml

name: DemoWorkflow

on:
  workflow_dispatch:
jobs:
  demo_job:
    runs-on: ubuntu-latest
    steps:
      # まずは、Githubリポジトリに管理されているファイルをダウンロード
      - uses: actions/checkout@v4
      - run: |
          version_value=$(cat .github/VERSION)
          echo "version_value: $version_value"

出力結果

version_value: 1.2.3

例2:jq コマンド を利用する場合

* jq コマンドについては、以下の関連記事を参照のこと

jq コマンド ~ JSON を扱う ~
https://dk521123.hatenablog.com/entry/2020/02/01/000000

.github/settings.json

{
  "dev": {
    "aws_account_id": 111111111111111,
    "s3_bucket_name": "your-s3-for-dev"
  },
  "stage": {
    "aws_account_id": 222222222222222,
    "s3_bucket_name": "your-s3-for-stage"
  },
  "prod": {
    "aws_account_id": 999999999999999,
    "s3_bucket_name": "your-s3-for-prod"
  }
}

.github/workflows/workflow2.yml

name: DemoWorkflow2

on:
  workflow_dispatch:
    inputs:
      environment:
        required: true
        type: choice
        default: dev
        options:
        - dev
        - stage
        - prod
jobs:
  demo_job:
    runs-on: ubuntu-latest
    steps:
      # まずは、Githubリポジトリに管理されているファイルをダウンロード
      - uses: actions/checkout@v4
      - name: settings
        env:
          ENVIRONMENT: ${{ inputs.environment }}
        run: |
          env=${{ env.ENVIRONMENT }}
          # [1] aws_account_id
          aws_account_id=$(cat .github/settings.json | jq ".${env}.aws_account_id")
          echo "aws_account_id: $aws_account_id"
          # [2] s3_bucket_name
          s3_bucket_name=$(cat .github/settings.json | jq -r ".${env}.s3_bucket_name")
          echo "s3_bucket_name: $s3_bucket_name"

出力例:inputs.environment = prod の場合

aws_account_id: 999999999999999
s3_bucket_name: your-s3-for-prod

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ 設定値を切り替えることを考える ~
https://dk521123.hatenablog.com/entry/2024/02/18/232926
jq コマンド ~ JSON を扱う ~
https://dk521123.hatenablog.com/entry/2020/02/01/000000