アーティファクトを別のステージに渡すにはどうすればよいですか?


107

.gitlab-ci.ymlファイルでGitLab CIを使用して、別々のスクリプトで異なるステージを実行したいと思います。最初の段階では、後の段階でテストを実行するために使用する必要があるツールを生成します。生成されたツールをアーティファクトとして宣言しました。

では、後の段階のジョブでそのツールをどのように実行できますか?正しいパスは何ですか?また、その周りにはどのファイルがありますか?

たとえば、最初のステージではアーティファクト/bin/TestTool/TestTool.exeをビルドし、そのディレクトリには他の必要なファイル(DLLなど)が含まれています。私の.gitlab-ci.ymlファイルは次のようになります。

releasebuild:
  script:
    - chcp 65001
    - build.cmd
  stage: build
  artifacts:
    paths:
      - artifacts/bin/TestTool/

systemtests:
  script:
    - chcp 65001
    - WHAT TO WRITE HERE?
  stage: test

ビルドとテストは、必要に応じてWindowsで実行されます。

回答:


102

を使用しdependenciesます。この構成では、テスト段階で、ビルド段階中に作成された追跡されていないファイルがダウンロードされます。

build:
  stage: build
  artifacts:
    untracked: true
  script:
    - ./Build.ps1

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1

9
ついに動作しました!ここで重要なのは、依存関係をアーティファクトとともに使用する必要があることです。含まれているアーティファクトのみが後続のステージで使用できます。言うまでもなく、何をアップロードするかについては慎重に考えてください。私はexpire_inを使用すると言います。そうしないと、大量のストレージが無駄になる可能性があります。これらのアーティファクトはビルドジョブ/ステージ/ステップでgitlabにアップロードされ、テストでダウンロードされます。
ラビカンス

18
本当に依存関係を使用する必要がありますか?Gitlabドキュメントの状態Note that artifacts from all previous stages are passed by default.。問題は、いつ依存関係を使用する必要があるかです。

2
ドキュメントはこれを非常によくクリアしています:docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox

3
以前のすべてのステージからの@Josefアーティファクトはデフォルトで渡されます(前のジョブからではありません)
Vivek

1
現在のジョブで以前のすべてのステージのすべてのアーティファクトが必要ない場合の@Josef。あなたはこの仕事のためにすべての10ギガバイトをダウンロードする必要はありません-あなたは、ビルド段階で生成されたバイナリの10ギガバイトを持っていたと言うが、あなたの最終段階だけで成功したビルドに関するいくつかの電子メールを送信してみよう
Ezh

49

以前のすべてのステージのアーティファクトはデフォルトで渡されるため、ステージを正しい順序で定義する必要があります。以下の例を試してみてください。理解に役立ちます。

image: ubuntu:18.04

stages:
  - build_stage
  - test_stage
  - deploy_stage

build:
  stage: build_stage
  script:
    - echo "building..." >> ./build_result.txt
  artifacts:
    paths:
    - build_result.txt
    expire_in: 1 week

unit_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt unittest_result.txt
    - echo "unit testing..." >> ./unittest_result.txt
  artifacts:
    paths:
    - unittest_result.txt
    expire_in: 1 week

integration_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt integration_test_result.txt
    - echo "integration testing..." >> ./integration_test_result.txt
  artifacts:
    paths:
    - integration_test_result.txt
    expire_in: 1 week

deploy:
  stage: deploy_stage
  script:
    - ls
    - cat build_result.txt
    - cat unittest_result.txt
    - cat integration_test_result.txt

ここに画像の説明を入力してください

また、異なるステージのジョブ間でアーティファクトを渡す場合、ドキュメントで説明されているように、依存関係アーティファクトを使用してアーティファクトを渡すことができます

そしてもう1つの簡単な例:

image: ubuntu:18.04

build:
  stage: build
  script:
    - echo "building..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

unit_test:
  stage: test
  script:
    - ls
    - cat result.txt
    - echo "unit testing..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ls
    - cat result.txt

非常に明確な説明、ありがとうございます。ステージでアーティファクトに前のステージのアーティファクトと同じ名前を付けた場合、元のアーティファクトは上書きされますか?
マイケルオソフスキー

1
@MichaelOsofsky同じ名前でアーティファクトに名前を付けることができます。元のアーティファクトは、同じ名前の次のステージのアーティファクトによって上書きされません。次のステージは前のステージからアーティファクトをダウンロードするだけで、それはそのコピーです。例では主に単体テストのために異なる名前を付けており、統合は並行して実行されます。.eg統合テストジョブを削除すると、すべてのジョブが順番に実行され、混乱なくすべてのアーティファクトに同じ名前を使用できます。参考までに、もう1つの例で回答を更新します。
チュアン

あなたの例では、result.txtに追加しているのがわかります。ジョブunit_testでresult.txtを上書きした場合、ジョブデプロイがジョブビルドからのresult.txtのコンテンツにアクセスできないと思います。スクリプトでこの種のバグが発生しないようにお願いします。
マイケルオソフスキー

1
ログによると、デプロイステージはビルドステージとテストステージの両方からresult.txtをダウンロードしますが、後の方が前の方を上書きします。
チュアン

1
ところで、元のアーティファクトには触れず、常にCI / CD-> Pipelinesからダウンロードできます。次に、右側のアーティファクトのドロップダウンボタンをクリックすると、すべてのステージのすべてのアーティファクトが見つかります。
チュアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.