透過批次檔 (Batch File) 抓取 Git 的 version-tag 來自動更新 firmware 的版本資訊

身為一個韌體工程師,做好韌體的版本控制是非常重要的一環,而版本控制最好要能做到自動化不但可以減少因人員產生的錯誤,還可以減少工作負擔。
因此如何透過 Git 搭配 GitHub/GitLab 來達到版本控制與 commit message rule 可以參考之前的文章:半自動化版本控制與 git commit message 標準化流程
而今天要讓自動化更加成長茁壯!!!

透過之前建立的 git version tags 來產生版本資訊並輸出成 “version.h” 來讓 firmware c/c++ code include

整個過程需要做到下列幾項事情:

  • 從 Git 上抓取 version-tag
  • 將 version-tag 拆成 major, minor and patch
  • 產生 “version.h” file 然後將 major, minor and patch 寫入

git describe --abbrev=0 --always --tags 來抓取離當前提交的內容最近的 tag,並且用 –abbrev=0 將 tag 後的描述資訊隱藏起來。

接著透過 windows command line 的 delims 命令以字元 ‘.’ 來區隔開 major, minor and patch。

最後透過 echo and >> %1 來將資料以定義好的格式寫入文件中就完成了!

然後為了讓每次要做的事情簡單單一且可重複,將上述指令寫成批次檔來處理,以後就只需要呼叫批次檔就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
if "%1"=="" (
echo Usage: %0 ^<header_file_name^>
goto :eof
)
for /F "usebackq" %%v in (`"git describe --abbrev=0 --always --tags"`) DO (
echo #ifndef __VERSION_H__ > %1
echo #define __VERSION_H__ >> %1
echo.>> %1
for /f "tokens=1,2,3 delims=." %%i in ("%%v") DO (
echo #define VERSION_MAJOR ^(%%i^) >> %1
echo #define VERSION_MINOR ^(%%j^) >> %1
echo #define VERSION_PATCH ^(%%k^) >> %1
)
for /F "usebackq" %%d in (`"git show -s --format=format:%%cd --date=short"`) DO (
for /f "tokens=1,2,3 delims=-" %%i in ("%%d") DO (
echo #define BUILD_DATE_YEAR ^(%%i - 2000^) >> %1
echo #define BUILD_DATE_MONTH ^(1%%j - 100^) >> %1
echo #define BUILD_DATE_DAY ^(1%%k - 100^) >> %1
)
)
echo.>> %1
echo #endif /* __VERSION_H__ */ >> %1
echo.>> %1
echo /*** (C^) COPYRIGHT LEOLI ***/ >> %1
)

接著在 windows 中受到 Git 管控並且有提交過 sem-ver 格式的 tag 的資料夾路徑內建一個文件並在該文件內貼上上述內容,並將檔名改成 “filename.bat”。
然後在該路徑打開終端機執行 filename.bat "version.h" 就會自動執行上述指令並在 “version.h” 檔案內寫入上述資訊囉。

只要將批次檔加入受到 Git 管控的 code 內,並透過編譯器(compiler) 的 pre-build command 在編譯之前呼叫產生 “version.h” 並 include 就可以在每次 build code 前自動更新 version information 並同步囉!如何在編譯器(compiler)中加入編譯前/編譯後的動作,以及一些坑!

完整的 sample code 我放在 github 上了,歡迎下載玩玩看!

github sample code:https://github.com/leoli-git/VersionAutoGen


✏以上就是本次的內容,
💡希望對正在閱讀的你也有幫助,若有誤的地方也歡迎指教。
❓若有什麼疑問歡迎下方留言,我會盡速回復您!


支持|不只是個工程師

如果這篇文章對你有幫助,請幫我
拍拍手|LikeCoin基金將會分發LikeCoin獎勵創作者
追蹤| Facebook & Instagram
也歡迎點我小額訂閱【不只是個工程師】

歡迎關注我的其它發布渠道