身為一個韌體工程師,做好韌體的版本控制是非常重要的一環,而版本控制最好要能做到自動化不但可以減少因人員產生的錯誤,還可以減少工作負擔。
因此如何透過 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 |
@echo off |
接著在 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