パイプライン成果物を発行してダウンロードする

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

注意

パイプライン成果物の保存は課金の対象になりません。 パイプライン キャッシュもストレージの課金から免除されます。 「どの成果物が課金対象ストレージの合計に加算されますか」を参照してください。

注意事項

パイプライン実行を削除すると、その実行に関連付けられているすべての成果物が削除されます。

.artifactignore を使う

.artifactignore では、.gitignore と同様の構文を使って (制限事項はほとんどありません)、成果物の公開時に無視するファイルを指定します。 .artifactignore ファイルは、必ずパイプライン成果物の公開タスクtargetPath 引数で指定したディレクトリ内に配置してください。

注意

プラス記号文字 + は、URL パスや、Maven などのパッケージの種類の一部のビルド メタデータではサポートされていません。

: .exe ファイルを除くすべてのファイルを無視します。

**/*
!*.exe

重要

.artifactignore ファイルがない場合、Azure Artifacts では .git フォルダー パスが自動的に無視されます。 これを回避するには、空の .artifactignore ファイルを作成します。

成果物をダウンロードする

成果物は、YAML、クラシック エディター、または Azure CLI を使ってダウンロードできます。

steps:
- download: current
  artifact: WebApp
  • current: 現在のパイプライン実行によって生成された成果物をダウンロードします。 オプション: current、specific。

注意

公開された成果物の一覧は、その後の依存するジョブでのみ使用できます。 そのため、current オプションは、成果物の公開タスクを含むジョブに依存する、個別のジョブでのみ使ってください。

ヒント

パイプライン リソースを使うと、ソースを 1 か所で定義し、パイプライン内の任意の場所で使うことができます。

Note

download キーワードを使って成果物をダウンロードします。 詳細については、steps.download に関する記事を参照してください。

組織内の別のプロジェクトからパイプライン成果物をダウンロードするには、ダウンストリーム プロジェクトとダウンストリーム パイプラインの両方に対して適切なアクセス許可が構成されていることを確認してください。 既定では、ファイルは $(Pipeline.Workspace) にダウンロードされます。 成果物名を指定していない場合は、ダウンロードした成果物ごとにサブディレクトリが作成されます。 一致パターンを使って、ダウンロードするファイルを限定できます。 詳しくは、ファイルの一致パターンに関する記事を参照してください。

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

成果物の選択

1 回のダウンロード手順で、1 つ以上の成果物をダウンロードできます。 複数の成果物をダウンロードするには、[成果物名] フィールドは空のままにして、ファイルの一致パターンを使ってダウンロードするファイルを限定します。 ** が既定のファイル一致パターンです (すべての成果物内のすべてのファイル)。

1 つの成果物

成果物名を指定する場合:

  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) に公開します。 2 番目のステージでは、スクリプトをダウンロードして実行します。

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. ビルド成果物のダウンロード タスクのファイル一致パターンは、特定の成果物が指定されているかどうかに関係なく、成果物名で始まる (または一致する) 必要があります。 パイプライン成果物のダウンロード タスクでは、成果物名が既に指定されている場合、パターンに成果物名を含めないようにしてください。 詳しくは、1 つの成果物の選択に関するページを参照してください。

- 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。 既定値: pipeline。

  • 成果物: (必須) 公開する成果物の名前。 設定しない場合、既定値はジョブをスコープとする一意の ID です。

よく寄せられる質問

Q: ビルド成果物とは何ですか?

A: ビルド成果物は、ビルドによって生成されるファイルです。 ビルド成果物を公開して使用する方法について詳しくは、ビルド成果物に関する記事を参照してください。

Q: 失敗したジョブを再実行するときにパイプライン成果物を削除できますか?

A: パイプライン成果物を削除したり上書きしたりすることはできません。 失敗したジョブを再実行するときに成果物を再生成したい場合は、成果物名にジョブ ID を含めることができます。 $(system.JobId) はこの目的に適した変数です。 事前定義済みの変数について詳しくは、システム変数に関する記事を参照してください。

Q: ファイアウォールの内側にある Artifacts フィードにアクセスするにはどうすればよいですか?

A: 組織でファイアウォールまたはプロキシ サーバーを使用している場合は、Azure Artifacts のドメイン URL と IP アドレスを必ず許可してください。