給團隊帶入一個 代碼格式化機器人 能提升團隊的幸福度,讓團隊的成員安心寫代碼,不用關注代碼格式化問題,將格式代碼這個粗活交給機器人去做。同時也能減少在代碼審查里撕格式化問題的時間,讓更多的時間投入到更有價值的工作上
本文來告訴大家如何給團隊的 GitLab 平台上帶入一個自動代碼格式化機器人的方法
本文所使用的工具和代碼都是完全開源的,請看 https://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 地址,格式如git@gitlab.sdlsj.net:lindexi/foo.git
地址。可選,默認將通過環境變量拼接git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git
地址 -
-GitLab
: GitLab 地址,如https://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