在管線指令碼中執行 Git 命令

Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022

Git 指令可用於建置工作流程,由 Microsoft 託管的 及 自我託管的代理程式。 例如,在功能分支上完成持續整合 (CI) 建置之後,您可以將分支合併至主要分支。 本文說明如何在 Azure Pipelines 建置腳本中執行 Git 指令。

啟用指令碼以執行 Git 命令

確保 Git 使用你 Azure DevOps 帳號的預設身份。 如果需要,請將 Git 使用者設為結帳後的第一步。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

授予權限給建置服務

專案建置服務必須具有寫入來源存放庫的許可權。 設定所需的權限,如下所示:

  1. 在您的專案的專案設定中,選擇Repos下的Repositories。

  2. 在 [ 所有存放庫 ] 頁面上,選取 [ 安全性 ] 以設定專案中所有存放庫的許可權。 或者,選取您要執行 Git 命令的存放庫,然後選取該存放庫頁面上的 [ 安全性 ]。

    顯示選擇儲存庫安全性的螢幕截圖。

  3. 在 [ 使用者許可權 ] 頁面上,選取 [建置服務 ] 身分識別。 請務必在Users 選擇 專案名稱 Build Service(組織),而非 專案集合建置服務帳號。 根據預設,此身分識別可以從存放庫讀取,但無法推送任何變更。

  4. 下拉式清單,然後選取您要執行的 Git 命令所需的每個權限旁的 [允許] ,通常是 [建立分支]、[ 貢獻]、[ 讀取] 和 [建立標籤]。

    螢幕擷取畫面,顯示授與存放庫的身分識別許可權。

允許腳本存取系統令牌

要允許腳本存取 GitHub OAuth 令牌:

在你的 YAML 管線中新增一個 checkout 步驟,並將 persistCredentials 設定為 true。

steps:
- checkout: self
  persistCredentials: true

若需了解更多有關 checkout 步驟的資訊,請參閱 steps.checkout 定義。

清理本機儲存庫

建置流程不會自動清除本機存放庫的特定變更,例如刪除本機分支或復原本機 git config 變更。 如果您在使用自我裝載代理程式時遇到問題,您可以在執行組建之前清除存放庫。

一般而言,為了加快自我裝載代理程式的效能,請勿清除存放庫。 清理對 Microsoft 託管代理來說並不有效,因為他們每次都會使用新的代理程式。 如需詳細資訊,請參閱 清除代理程式上的本機存放庫。

若要在執行組建之前清除存放庫:

在步驟clean中將true設為checkout。 選擇此選項會先執行git clean -ffdx,然後在擷取之前執行git reset --hard HEAD。

steps:
- checkout: self
  clean: true

在管線編輯器中選取 變數, 建立或修改 Build.Clean 變數,並將其值設定為 source。

Git 命令範例

下列範例會在 命令列 工作和 批次指令碼 工作中執行 Git 命令。

列出存放庫中的檔案

若要列出 Git 存放庫中的檔案,請在 YAML 管線中使用 命令列 工作,如下所示:

- task: CmdLine@2
  inputs:
    script: 'git ls-files'

將功能分支合併至main

下列經典管線範例會在組建成功時將 CI 組建合併至 main。

  1. 在存放庫的根目錄中建立名為 merge.bat 的檔案,其中包含下列內容:

    @echo off
    ECHO SOURCE BRANCH IS %BUILD_SOURCEBRANCH%
    IF %BUILD_SOURCEBRANCH% == refs/heads/main (
       ECHO Building main branch so no merge is needed.
       EXIT
    )
    SET sourceBranch=origin/%BUILD_SOURCEBRANCH:refs/heads/=%
    ECHO GIT CHECKOUT MAIN
    git checkout main
    ECHO GIT STATUS
    git status
    ECHO GIT MERGE
    git merge %sourceBranch% -m "Merge to main"
    ECHO GIT STATUS
    git status
    ECHO GIT PUSH
    git push origin
    ECHO GIT STATUS
    git status
    
  2. 在 Classic 管線的 [觸發] 索引標籤上,勾選 [啟用持續整合] 复选框。

  3. 在 [分支篩選] 和 [路徑篩選] 底下,選取要從組建中 包含 或 排除 的分支和路徑。

  4. 將 批次指令碼 新增為管線中的最後一個工作。

  5. 在工作組態的 [路徑] 底下,輸入 merge.bat 檔案的位置和名稱。

FAQ

如果我的遠端倉庫是在 GitHub 或其他 Git 服務(例如 Bitbucket Cloud)上,我可以執行 Git 指令嗎?

是的,如果你的遠端倉庫是在 GitHub 或其他 Git 服務(例如 Bitbucket Cloud),你可以執行 Git 指令。

我可以使用哪些工作來執行 Git 命令?

你可以使用以下 Azure Pipelines 任務來執行 Git 指令:

如何避免在腳本推送時觸發 CI 建置?

若要避免在指令碼推送時觸發 CI 組建,請在您的認可訊息或描述中加入 [skip ci]。 例如:

  • git commit -m "This is a commit message [skip ci]"
  • git merge origin/features/hello-world -m "Merge to main [skip ci]"

你也可以使用以下任何變體來提交 Azure Repos Git、Bitbucket Cloud、GitHub 或 GitHub Enterprise Server:

  • [skip ci] 或 [ci skip]
  • skip-checks: true 或 skip-checks:true
  • [skip azurepipelines] 或 [azurepipelines skip]
  • [skip azpipelines] 或 [azpipelines skip]
  • [skip azp] 或 [azp skip]
  • ***NO_CI***

我需要代理程式來執行管線嗎?

是,您至少需要一個 代理程式 來執行組建或發行管線。

如何解決問題?

請參閱 管線執行的疑難排解。

如何修正無法選取預設代理程式集區或將管線執行排入佇列的問題?

請參閱 建立和管理代理程式集區。

如何解決 NuGet 推送任務失敗並顯示「錯誤:無法取得本機簽發者憑證」?

您可以新增受信任的根憑證來修正此問題。 將環境變數新增至 NODE_EXTRA_CA_CERTS=file 建置代理程式,或在管線中新增 NODE.EXTRA.CA.CERTS=file 工作變數。

如需此變數的詳細資訊,請參閱 Node.js 文件中的 NODE_EXTRA_CA_CERTS=file 。 如需在管線中設定變數的指示,請參閱在 管線中設定變數。

為什麼我在本地的 Azure DevOps Server 裡看不到這些功能?

部分功能僅在 Azure DevOps Services 上可用,無法在本地端 Azure DevOps Server 上使用。 部分功能僅在最新版本的 Azure DevOps Server 中提供。