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ビルドと組み合わせる例を紹介しています。

 

使用したアクション