GitHub Actions バージョンナンバー追加
組み込み開発でバージョンナンバーを内部に入れたい時、定義を手動で更新していくとバージョンの更新忘れが不安になります。
バージョンの更新を忘れた場合、同じバージョン表記で挙動が違うファームウェアが出来てしまうことは恐怖でしかありません。
そのため、自動でバージョンナンバーを付与する仕組みを考えてみます。
バージョンの定義は、ヘッダーファイル中に #define で定義をすることにします。
そのファイルをソースコード中でインクルードし、使用します。
バージョンを更新するためのトリガーとしては、Gitフックを使用することがまず思い浮かびます。
Gitのコマンド実行前にバージョンを更新するためのスクリプトを実行する形です。
しかしながら、Gitフックで実行するスクリプトが置かれる .git/hooks/ フォルダはGit管理下にはなっていません。
つまり、複数箇所からで開発を行う場合に、設定漏れがあった場合はバージョンが更新されない状態になります。
今回は、Gitのホスティングサービス「GitHub」を使う前提で、GitHub側で任意のコマンドを実行できる「GitHub Actions」を使用してバージョンナンバーを管理する方法を考えてみます。
GitHub Actionsの使い方
対象のリポジトリの .github/workflows/ フォルダにYAMLで記述されたファイルを配置すれば使用できます。
複数のファイルが設置可能で、注意点としては同じトリガー条件が書かれたファイルが複数あると全部並列に処理されます。
GitHub ActionsでPushされた時にバージョン定義ファイルを生成し再度Pushする
.github/workflows/version.yml として以下のファイルを配置しました。
name: Add Version Number
on: push
env:
TZ: "Asia/Tokyo"
FILE_NAME: "./src/version.h"
FILE_HEADER: "#ifndef VERSION_H\n#define VERSION_H\n\n// !!! DO NOT EDIT THIS FILE !!!\n// This file is automatically generated by GitHub Actions\n"
FILE_FOOTER: "\n#endif"
jobs:
generate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create File
run: |
cat <<EOF > "$FILE_NAME"
$FILE_HEADER
#define VER_BRANCH_STR "$GITHUB_REF_NAME"
#define VER_SHA_STR "$GITHUB_SHA"
#define VER_RUN_ID $GITHUB_RUN_ID
#define VER_RUN_ID_STR "$GITHUB_RUN_ID"
#define VER_RUN_NUM $GITHUB_RUN_NUMBER
#define VER_RUN_NUM_STR "$GITHUB_RUN_NUMBER"
#define VER_YEAR $(date +'%y')
#define VER_YEAR_STR "$(date +'%y')"
#define VER_MON $(date +'%m')
#define VER_MON_STR "$(date +'%m')"
#define VER_DATE $(date +'%d')
#define VER_DATE_STR "$(date +'%d')"
#define VER_HOUR $(date +'%H')
#define VER_HOUR_STR "$(date +'%H')"
#define VER_MIN $(date +'%M')
#define VER_MIN_STR "$(date +'%M')"
#define VER_SEC $(date +'%S')
#define VER_SEC_STR "$(date +'%S')"
$FILE_FOOTER
EOF
- name: Commit Push
run: |
git config user.name "GitHub Actions"
git config user.email "github-actions@github.com"
git add "$FILE_NAME"
git commit -m "Add Version Number"
git push
このワークフローでは、バージョンナンバーが記述されているテキストファイルを生成し、Pushしています。
最初の「Checkout」では、自分のリポジトリをチェックアウトしています。
ファイル操作するためには必須の作業です。
次に「Create File」です。
catコマンドにてヒアドキュメントとして出力しています。
これで実際に生成される内容は以下のようなファイルになります。
version.h
#ifndef VERSION_H
#define VERSION_H
// !!! DO NOT EDIT THIS FILE !!!
// This file is automatically generated by GitHub Actions
#define VER_BRANCH_STR "master"
#define VER_SHA_STR "5ad3835b7845118d0214801b386746851b885e97"
#define VER_RUN_ID 9814039116
#define VER_RUN_ID_STR "9814039116"
#define VER_RUN_NUM 10
#define VER_RUN_NUM_STR "10"
#define VER_YEAR 24
#define VER_YEAR_STR "24"
#define VER_MON 07
#define VER_MON_STR "07"
#define VER_DATE 06
#define VER_DATE_STR "06"
#define VER_HOUR 07
#define VER_HOUR_STR "07"
#define VER_MIN 04
#define VER_MIN_STR "04"
#define VER_SEC 27
#define VER_SEC_STR "27"
#endif
環境変数で一部内容を表しているので、適宜展開しています。
ポイントとしては日時を入れるためにdateコマンドを使用していますが、実行時にタイムゾーンがUTCになってしまいます。
日本から操作する場合に9時間ずれた日時が入っていると分かりづらいため、冒頭で「TZ」環境変数を設定し、タイムゾーンを東京にしています。
最後に「Commit Push」です。
gitに先ほど生成したファイルを追加し、Pushします。
GitHub Actions側でプッシュされるので、自分ひとりで開発していても、必ず作業前にプルする必要が出てきます。
注意して使いましょう。
他のGitHub Actionsから呼び出して使用する
他のGitHub Actionsから呼び出したい場合は、onに書かれているトリガー条件を以下のように変更します。
on: workflow_call
workflow_dispatchにすれば手動実行もできますが、この用途だと必要はないと思われます。
上記ページではRaspberry Pi Pico SDKビルドと組み合わせる例を紹介しています。
使用したアクション