如何将工件传递到另一个阶段?


107

我想将GitLab CI与.gitlab-ci.yml文件一起使用,以使用单独的脚本运行不同的阶段。第一个阶段产生了一个工具,以后必须使用它来执行测试。我已将生成的工具声明为工件。

现在如何在以后的工作中执行该工具?正确的路径是什么,周围会有什么文件?

例如,第一阶段构建artifacts / 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上运行构建和测试。

Answers:


102

使用dependencies。通过此配置,测试阶段将下载在构建阶段创建的未跟踪文件:

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

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

9
终于让它工作了!这里的关键是依赖项应该与工件一起使用。只有包含的工件才可以在后续阶段使用。不用说,对上传的内容保持保守。我会说使用expire_in。否则,我们最终可能会浪费大量存储空间。这些工件在构建作业/阶段/步骤中上传到gitlab,并在测试中下载。
ravikanth '16

18
您真的必须使用依赖项吗?Gitlab文档指出Note that artifacts from all previous stages are passed by default.。问题是何时需要使用依赖项。

2
该文档很好地解决了
chetbox

3
默认情况下,将传递来自所有先前阶段的 @Josef工件(而不是来自先前作业)
Vivek '18

1
@Josef,当您不需要当前工作的所有先前阶段的所有工件时。假设您在构建阶段生成了10 GB的二进制文件,但是最后阶段只是发送了一些有关成功构建的电子邮件-您无需下载所有10 GB的文件即可完成此工作
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

在此处输入图片说明

并且为了在不同阶段的作业之间传递工件,我们可以将依赖项工件一起使用以传递工件,如文档中所述

还有一个更简单的示例:

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

非常清楚的解释,谢谢。如果一个阶段使用与上一个阶段的工件相同的名称来命名工件,那么原始工件会被覆盖吗?
Michael Osofsky '19年

1
@MichaelOsofsky您可以使用相同的名称来命名工件,原始工件不会被下一阶段的相同名称所覆盖。下一阶段仅下载前一阶段的工件,它是其副本。我在示例中使用不同的名称,主要是因为单元测试和集成将并行执行。如果我们删除.eg集成测试作业,那么所有作业将按顺序执行,那么我们可以对所有工件使用相同的名称,而不会造成任何混淆。仅供参考,我再举一个例子来更新答案。

在您的示例中,我看到您正在追加到result.txt。如果您在作业unit_test中重写了result.txt,我认为作业部署将永远无法访问作业构建中的result.txt内容。我只是想确保我不会在脚本中引起这种类型的错误。
迈克尔·奥索夫斯基

1
根据日志,部署阶段将同时从构建和测试阶段下载result.txt,但后一个将覆盖前一个。

1
顺便说一句,原始工件不会被触摸,并且始终可以从CI / CD-> Pipelines下载,然后单击右侧Artifacts的下拉按钮,您将找到所有阶段的所有工件。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.