Reputation: 20404
I'd like to use GitLab CI with the .gitlab-ci.yml
file to run different stages with separate scripts. The first stage produces a tool that must be used in a later stage to perform tests. I've declared the generated tool as an artifact.
Now how can I execute that tool in a later stage job? What is the correct path, and what files will there be around it?
For example the first stage builds artifacts/bin/TestTool/TestTool.exe
and that directory contains other required files (DLLs and others). My .gitlab-ci.yml
file looks like this:
releasebuild:
script:
- chcp 65001
- build.cmd
stage: build
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
script:
- chcp 65001
- WHAT TO WRITE HERE?
stage: test
The build and test jobs run on Windows if that's relevant.
Upvotes: 314
Views: 375137
Reputation: 165
You can use needs
section. Docs needs.
releasebuild:
needs: [] # Pass there dependencies that needs to start this job or leave it empty
...
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
needs: ["releasebuild"]
script:
# Now you can do whatever you want with artifacts/bin/TestTool/ here
# Example:
- cp artifacts/bin/TestTool/* test/*
...
The same for needs:artifacts, just another syntax
releasebuild:
needs: [] # Pass there dependencies that needs to start this job or leave it empty
...
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
needs:
- job: releasebuild
artifacts: true
script:
# Now you can do whatever you want with artifacts/bin/TestTool/ here
# Example:
- cp artifacts/bin/TestTool/* test/*
This is pretty same that dependencies
ones.
Upvotes: 3
Reputation: 2437
If you use the needs:
keyword, the default artifact management behavior changes. The only artifacts available are from "upstream" jobs on the needs graph. Also, the dependencies:
keyword cannot be used with the needs:
keyword.
To address the pipeline snippet from the question, adding a needs
relationship to the job that creates the required artifacts is all that is needed:
releasebuild:
script:
- chcp 65001
- build.cmd
stage: build
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
script:
- chcp 65001
stage: test
needs:
- job: releasebuild
artifacts: true
NOTE: The needs:artifacts:
keyword defaults to true
and can be omitted. When set to false
, the job won't load the upstream artifacts.
Upvotes: 8
Reputation: 4990
If you want foo/
to be available in the next stage AND it is in your .gitignore
you'll need to list it in the artifacts
of the stage that creates it, or as explained at here use untracked: true
. As I wanted just a subset I didn’t use untracked: true
.
The following approach worked for me (with NO dependencies
specified in the following stage)
artifacts:
paths:
- foo/
expire_in: 1 hour
BTW regarding the : expire_in: 1 hour
part:
I read at https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2133 there's no way to get artifacts to automatically expire at the conclusion of pipeline and the default retention was surprisingly long (30 days by default) - hence the time-based kludge to get rid of them - see https://docs.gitlab.com/ee/ci/yaml/
Upvotes: 13
Reputation: 2613
Use dependencies
. With this config, the test
stage will download the untracked files that were created during the build
stage:
build:
stage: build
artifacts:
untracked: true
script:
- ./Build.ps1
test:
stage: test
dependencies:
- build
script:
- ./Test.ps1
Upvotes: 253
Reputation: 3451
Since artifacts from all previous stages are passed by default, we just need to define stages in correct order. Please try the example below, which could help understanding.
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
And in case to pass artifacts between jobs in different stages, we can use dependencies together with artifacts to pass the artifacts, as described from the document.
And one more simpler example:
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
Upvotes: 246