¿Cómo puedo pasar los artefactos de GitLab a otra etapa?
Me gustaría usar GitLab CI con el .gitlab-ci.yml
archivo para ejecutar diferentes etapas con scripts separados. La primera etapa produce una herramienta que debe usarse en una etapa posterior para realizar pruebas. Declaré la herramienta generada como un artefacto.
Ahora, ¿cómo puedo ejecutar esa herramienta en un trabajo posterior? ¿Cuál es la ruta correcta y qué archivos habrá a su alrededor?
Por ejemplo, la primera etapa se compila artifacts/bin/TestTool/TestTool.exe
y ese directorio contiene otros archivos necesarios (DLL y otros). Mi .gitlab-ci.yml
archivo se ve así:
releasebuild:
script:
- chcp 65001
- build.cmd
stage: build
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
script:
- chcp 65001
- WHAT TO WRITE HERE?
stage: test
Los trabajos de compilación y prueba se ejecutan en Windows si eso es relevante.
Usar dependencies
. Con esta configuración, la test
etapa descargará los archivos sin seguimiento que se crearon durante la build
etapa:
build:
stage: build
artifacts:
untracked: true
script:
- ./Build.ps1
test:
stage: test
dependencies:
- build
script:
- ./Test.ps1
Dado que los artefactos de todas las etapas anteriores se pasan de forma predeterminada, solo necesitamos definir las etapas en el orden correcto. Pruebe el siguiente ejemplo, que podría ayudar a comprenderlo.
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
Y en caso de pasar artefactos entre trabajos en diferentes etapas, podemos usar dependencias junto con artefactos para pasar los artefactos, como se describe en el documento .
Y un ejemplo más simple:
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
Si desea foo/
estar disponible en la siguiente etapa Y está en su, .gitignore
deberá incluirlo en artifacts
la etapa que lo crea, o como se explica aquí, use untracked: true
. Como quería solo un subconjunto, no lo usé untracked: true
.
El siguiente enfoque funcionó para mí (NO se dependencies
especifica en la siguiente etapa)
artifacts:
paths:
- foo/
expire_in: 1 hour
Por cierto, con respecto a la expire_in: 1 hour
parte:
leí en https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2133 que no hay forma de hacer que los artefactos caduquen automáticamente al finalizar la canalización y la retención predeterminada fue sorprendentemente de largo (30 días de forma predeterminada), de ahí la torpeza basada en el tiempo para deshacerse de ellos; consulte https://docs.gitlab.com/ee/ci/yaml/
Si utiliza la needs:
palabra clave, el comportamiento predeterminado de gestión de artefactos cambia. Los únicos artefactos disponibles provienen de trabajos "ascendentes" en el gráfico de necesidades. Además, la dependencies:
palabra clave no se puede utilizar con la needs:
palabra clave.
Para abordar el fragmento de canalización de la pregunta, needs
todo lo que se necesita es agregar una relación al trabajo que crea los artefactos necesarios:
releasebuild:
script:
- chcp 65001
- build.cmd
stage: build
artifacts:
paths:
- artifacts/bin/TestTool/
systemtests:
script:
- chcp 65001
stage: test
needs:
- job: releasebuild
artifacts: true
NOTA: La needs:artifacts:
palabra clave tiene como valor predeterminado true
y puede omitirse. Cuando se establece en false
, el trabajo no cargará los artefactos ascendentes.