發佈和下載管線成品

Azure DevOps Services

您可以使用 Azure Pipelines,從管線或另一個管線的先前階段下載成品。 您也可以將成品發佈至檔案共享,或讓它以管線成品的形式提供。

發佈成品

您可以使用 YAML、傳統編輯器或 Azure CLI 來發佈成品:

注意

發行管線中不支持發佈管線成品。

steps:
- publish: $(System.DefaultWorkingDirectory)/bin/WebApp
  artifact: WebApp

注意

關鍵詞publish是發佈管線成品工作的快捷方式

雖然成品的名稱是選擇性的,但最好指定正確反映成品內容的名稱。 如果您打算從在不同 OS 上執行的作業取用成品,您必須確定所有檔案路徑都對目標環境有效。 例如,包含字元 \ 的檔名,或 * 無法在 Windows 上下載。

您需要要發佈的檔案/資料夾路徑。 這可以是的絕對路徑或相對路徑 $(System.DefaultWorkingDirectory)

Azure Artifacts 中的套件是不可變的。 發行套件之後,其版本將會永久保留。 如果封裝已發佈,重新執行失敗的作業將會失敗。 如果您想要能夠在沒有遇到錯誤 套件的情況下重新執行失敗的工作,最好使用 條件 ,只有在先前的作業成功時才能執行。

  jobs:
  - job: Job1
    steps:
      - script: echo Hello Job1!

  - job: Job2
    steps:
      - script: echo Hello Job2!
    dependsOn: Job1

注意

您不會因儲存管線成品而計費。 管線快取也可免除記憶體計費。 查看 哪些成品計入我的總計費記憶體

警告

刪除管線執行會導致刪除與該執行相關聯的所有 Artifacts。

使用 .artifactignore

.artifactignore 會使用類似 .gitignore 語法(但有一些限制)來指定發佈成品時應該忽略哪些檔案。 請確定 .artifactignore 檔案位於發佈管線成品工作的 targetPath 自變數所指定的目錄中。

注意

URL 路徑中不支援加號字元 + ,有些建置套件類型的元數據,例如 Maven。

範例:忽略 .exe 檔案以外的所有檔案:

**/*
!*.exe

重要

當您沒有 .artifactignore 檔案時,Azure Artifacts 會自動忽略 .git 資料夾路徑。 您可以藉由建立空 的 .artifactignore 檔案來略過此檔案。

下載成品

您可以使用 YAML、傳統編輯器或 Azure CLI 來下載成品。

steps:
- download: current
  artifact: WebApp
  • current:下載目前管線執行所產生的成品。 選項:目前、特定。

注意

已發佈的成品清單僅適用於下列相依性工作。 因此, current 僅在個別作業中使用 選項,而該作業相依於具有發行成品工作的作業。

提示

您可以使用 管線資源 在一個地方定義您的來源,並在管線中的任何位置使用它。

注意

download關鍵詞會下載成品。 如需詳細資訊,請參閱 steps.download

若要從組織內的不同項目下載管線成品,請確定您已為下游專案和下游管線設定適當的 許可權 。 根據預設,檔案會下載至 $(Pipeline.Workspace)。 如果未指定成品名稱,則會為每個下載的成品建立子目錄。 您可以使用比對模式來限制下載的檔案。 如需詳細資訊,請參閱 檔案比對 模式。

steps:
- download: current
  artifact: WebApp
  patterns: |
    **/*.js
    **/*.zip

成品選取專案

單一下載步驟可以下載一或多個成品。 若要下載多個成品,請將 成品名稱 欄位保留空白,並使用檔案比對模式來限制要下載的檔案。 ** 是預設檔案比對模式(所有成品中的所有檔案)。

單一成品

指定成品名稱時:

  1. 只會下載該特定成品的檔案。 如果成品不存在,工作將會失敗。

  2. 檔案比對模式會相對於成品的根目錄進行評估。 例如,模式 *.jar 會比對成品根目錄具有擴展名的所有檔案 .jar

下列範例說明如何從成品WebApp下載全部 *.js

steps:
- download: current
  artifact: WebApp
  patterns: '**/*.js'

多個成品

未指定任何成品名稱時:

  1. 您可以下載多個成品,如果找不到任何檔案,工作就不會失敗。

  2. 系統會為每個成品建立子目錄。

  3. 檔案比對模式應該假設模式的第一個區段是成品名稱(或相符)。 例如, WebApp/** 符合成品 WebApp 中的所有檔案。 此模式 */*.dll 會比對每個成品根目錄具有擴展名的所有檔案 .dll

下列範例說明如何從所有成品下載所有 .zip 檔案:

steps:
- download: current
  patterns: '**/*.zip'

發行和部署作業中的成品

成品只會在部署作業中自動下載。 根據預設,成品會下載至 $(Pipeline.Workspace)。 只有在部署中使用 deploy 生命週期勾點時,才會自動插入下載成品工作。 若要停止自動下載成品,請新增 download 步驟並將其值設定為 none。 在一般建置作業中,您必須明確使用 download 步驟關鍵詞或 下載管線成品 工作。 請參閱 生命週期勾點 ,以深入瞭解其他類型的勾點。

steps:
- download: none

跨階段使用成品

如果您想要能夠在管線中的不同階段存取您的成品,現在可以在一個階段中發佈成品,然後在下一個階段中利用相依性進行下載。 如需其他詳細資訊,請參閱階段到階段相依性

範例

在下列範例中,我們會將腳稿資料夾從存放庫複製併發佈至 $(Build.ArtifactStagingDirectory)。 在第二個階段中,我們將下載並執行腳本。

trigger:
- main
stages:
- stage: build
  jobs:
  - job: run_build
    pool:
      vmImage: 'windows-latest'
    steps:
    - task: VSBuild@1
      inputs:
        solution: '**/*.sln'
        msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
        platform: 'Any CPU'
        configuration: 'Release'

    - task: CopyFiles@2
      displayName: 'Copy scripts'
      inputs:
        contents: 'scripts/**'
        targetFolder: '$(Build.ArtifactStagingDirectory)'

    - publish: '$(Build.ArtifactStagingDirectory)/scripts'
      displayName: 'Publish script'
      artifact: drop

- stage: test
  dependsOn: build
  jobs:
  - job: run_test
    pool:
      vmImage: 'windows-latest'
    steps:
    - download: current
      artifact: drop
    - task: PowerShell@2
      inputs:
        filePath: '$(Pipeline.Workspace)\drop\test.ps1'

Screenshot showing the PowerShell task output

從組建成品移轉

管線成品是新一代的組建成品,是使用成品的建議方式。 使用發行組建成品工作發佈的成品仍然可以使用下載組建成品來下載,但建議您改用最新的下載管線成品工作。

從組建成品移轉至管線成品時:

  1. 根據預設,下載 管線成品 工作會將檔案下載至 $(Pipeline.Workspace)。 這是所有類型的成品的預設和建議路徑。

  2. 下載組建成品工作的檔案比對模式應該以成品名稱開頭(或比對),而不論是否已指定特定成品。 在 [ 下載管線成品 ] 工作中,當已指定成品名稱時,模式不應該包含成品名稱。 如需詳細資訊,請參閱 單一成品選取

範例

- task: PublishPipelineArtifact@1
  displayName: 'Publish pipeline artifact'
  inputs:
    targetPath: '$(Pipeline.Workspace)'
    ${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
        artifact: 'prod'
    ${{ else }}:
        artifact: 'dev'
    publishLocation: 'pipeline'
  • targetPath:(必要) 要發行之檔案或目錄的路徑。 可以是絕對或相對於預設工作目錄。 可以包含 變數,但不支援通配符。 默認值:$(Pipeline.Workspace)。

  • publishLocation:(必要) 成品發佈位置。 選擇要將成品儲存在 Azure Pipelines 中,或將其複製到必須可從管線代理程式存取的檔案共用。 選項: pipelinefilepath。 默認值:管線。

  • artifact:(選擇性) 要發佈的成品名稱。 如果未設定,則預設為限定為作業的唯一標識符。

常見問題集

問:什麼是組建成品?

答:組建成品是您組建所產生的檔案。 若要深入瞭解如何發佈及取用組建成品,請參閱 建置成品

問:我可以在重新執行失敗的作業時刪除管線成品嗎?

答:管線成品不可移除或可覆寫。 如果您想要在重新執行失敗的作業時重新產生成品,您可以將作業標識碼包含在成品名稱中。 $(system.JobId) 是適合此用途的變數。 若要深入瞭解預先定義的變數,請參閱 系統變數

問:如何存取防火牆後方的成品摘要?

答:如果您的組織使用防火牆或 Proxy 伺服器,請確定您允許 Azure Artifacts 網域 URL 和 IP 位址