dotnet 將自動程式碼格式化機器人帶入團隊 GitLab 平台
- 2021 年 12 月 3 日
- 筆記
- dotnet core
給團隊帶入一個 程式碼格式化機器人 能提升團隊的幸福度,讓團隊的成員安心寫程式碼,不用關注程式碼格式化問題,將格式程式碼這個粗活交給機器人去做。同時也能減少在程式碼審查里撕格式化問題的時間,讓更多的時間投入到更有價值的工作上
本文來告訴大家如何給團隊的 GitLab 平台上帶入一個自動程式碼格式化機器人的方法
本文所使用的工具和程式碼都是完全開源的,請看 //github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK
我所在的團隊,用的程式碼平台只有兩個,分別是 GitHub 和 GitLab 這兩個。其中 GitHub 上有 GitHub 的 Action 平台,基於此平台上,做啥都特別方便,在去年我就完成了給 GitHub 倉庫配置自動程式碼格式化機器人,請看 dotnet 基於 dotnet format 的 GitHub Action 自動程式碼格式化機器人
在咱 dotnet 裡面,有官方發布的專門用於程式碼格式化的工具 dotnet format 工具。此工具也在 GitHub 上開源,請看 dotnet/format: Home for the dotnet-format command
引入自動程式碼格式化機器人,相當於雇一個免費的工具人幫你不斷進行 ctrl+k ctrl+d 進行格式化程式碼
想要在 GitLab 的倉庫上引入 C# 自動程式碼格式化機器人,可以通過組合兩個工具來實現,第一個工具是 dotnet format 工具,進行程式碼格式化。另一個工具是將格式化完成的程式碼進行推送和創建合併請求
為了方便大家使用,我編寫了另一個新的工具,此工具合入了程式碼格式化和推送程式碼創建合併請求的功能,使用方法特別簡單。只有一句命令行調用即可完成格式化程式碼和推送。此工具基於 dotnet tool 發布,大家部署起來也只需要一句話
給團隊引入自動程式碼格式化機器人,只需要以下兩句程式碼,分別是部署和執行
- "dotnet tool update -g dotnetCampus.GitLabCodeFormatBot" # 安裝或更新工具
- "AutomateFormatCodeAndCreateGitLabMergeRequest -Token $Token" # 格式化程式碼,推送程式碼和創建合併請求
如以下程式碼就是我所在團隊裡面的 .gitlab-ci.yml
配置,只需要如下幾句話即可自動在 dev 分支有推送的時候,自動格式化程式碼,然後創建一個創建合併請求
stages:
- build
FormatCode:
# 自動格式化程式碼機器人,將使用 dotnet format 格式化
# 格式化規則參閱 .editorconfig 文件
stage: build
script:
- "chcp 65001" # 解決中文亂碼
- "dotnet tool update -g dotnetCampus.GitLabCodeFormatBot" # 安裝或更新工具
- "AutomateFormatCodeAndCreateGitLabMergeRequest -Token $Token" # 格式化程式碼,推送程式碼和創建合併請求
only:
- dev # 只有在 dev 分支有推送時,才進行自動格式化
運行效果如下
對於 AutomateFormatCodeAndCreateGitLabMergeRequest 命令,是支援傳入豐富的參數的,參數列表如下
-
-CodeFormatBranch
: 用於給格式化程式碼使用的分支,默認是 t/bot/FixCodeFormatting 分支 -
-GitLabPushUrl
: 用於上傳程式碼的 GitLab 地址,格式如[email protected]:lindexi/foo.git
地址。可選,默認將通過環境變數拼接git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git
地址 -
-GitLab
: GitLab 地址,如//gitlab.sdlsj.net
。可選,默認將通過環境變數獲取 GitLab 的$CI_SERVER_URL
變數 -
-Token
: 擁有創建 MergeRequest 的 Token 值,可在 GitLab 上的profile/personal_access_tokens
生成。可選,默認將通過環境變數獲取 GitLab 的Token
變數。此變數需要運維手動設置才有值,詳細請參閱下文 -
-ProjectId
: 將要創建 MergeRequest 的倉庫項目 Id 值。可選,默認將通過環境變數獲取 GitLab 的$CI_PROJECT_ID
常量,也就是當前項目 -
-TargetBranch
: 將從 SourceBranch 合併到 TargetBranch 分支。可選,默認將通過環境變數獲取 GitLab 的$CI_DEFAULT_BRANCH
分支,也就是倉庫的默認分支 -
-SourceBranch
: 將從 SourceBranch 合併到 TargetBranch 分支。可選,默認將通過環境變數獲取 GitLab 的$CI_COMMIT_BRANCH
分支,也就是當前 CI 正在運行分支 -
-Title
: 提交 MergeRequest 的標題。可選,默認是 “[Bot] Automated PR to fix formatting errors” 字元串
在 GitLab 上,將會在調用命令時,通過環境變數傳入很多變數,因此以上的大部分可選的命令都是可以不用輸入
有一點需要特別關注的是 Token 的生成,這個是需要大家自己配置的,詳細請參閱 dotnet tool 創建 GitLab 合併請求 Merge Requests 工具
如果覺得機器人默認自動格式化出來的內容不符合你的預期,沒關係,自動格式化工具的格式化的配置,是依靠倉庫的 .editorconfig
文件進行配置,更多請參閱 .NET code style rule options – .NET