dotnet 將自動程式碼格式化機器人帶入團隊 GitLab 平臺

lindexi發表於2021-12-03

給團隊帶入一個 程式碼格式化機器人 能提升團隊的幸福度,讓團隊的成員安心寫程式碼,不用關注程式碼格式化問題,將格式程式碼這個粗活交給機器人去做。同時也能減少在程式碼審查裡撕格式化問題的時間,讓更多的時間投入到更有價值的工作上

本文來告訴大家如何給團隊的 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

相關文章