¿Cómo puedo pasar artefactos a otra etapa?

107

Me gustaría usar GitLab CI con el archivo .gitlab-ci.yml para ejecutar diferentes etapas con scripts separados. La primera etapa produce una herramienta que debe usarse en una etapa posterior para realizar pruebas. He declarado la herramienta generada como artefacto.

Ahora, ¿cómo puedo ejecutar esa herramienta en un trabajo de etapa posterior? ¿Cuál es la ruta correcta y qué archivos habrá a su alrededor?

Por ejemplo, la primera etapa crea artifacts / bin / TestTool / TestTool.exe y ese directorio contiene otros archivos necesarios (DLL y otros). Mi archivo .gitlab-ci.yml 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

La compilación y las pruebas se ejecutan en Windows si es relevante.

ygoe
fuente

Respuestas:

102

Utilice dependencies. Con esta etapa de prueba de configuración, se descargarán los archivos sin seguimiento que se crearon durante la etapa de compilación:

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

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1
usuario1495793
fuente
9
¡Finalmente lo puse a funcionar! El punto clave aquí es que las dependencias deben usarse junto con los artefactos. Solo los artefactos incluidos estarían disponibles para el consumo en la etapa posterior. No hace falta decir que sea conservador con lo que se está cargando. Yo diría que use expire_in. De lo contrario, podríamos terminar desperdiciando mucho almacenamiento. Estos artefactos se cargan en gitlab en el trabajo / etapa / paso de compilación y se descargan en prueba.
ravikanth
18
¿Realmente tienes que usar dependencias? Estados de la documentación de Gitlab Note that artifacts from all previous stages are passed by default.. La pregunta es cuándo es necesario utilizar dependencias.
2
La documentación aclara esto bastante bien: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox
3
Los artefactos de @Josef de todas las etapas anteriores se pasan de forma predeterminada (no de los trabajos anteriores)
Vivek
1
@Josef cuando no necesita todos los artefactos de todas las etapas anteriores para el trabajo actual. Supongamos que tiene 10 GB de binarios generados por la etapa de compilación, pero su etapa final solo envía algunos correos electrónicos sobre la compilación exitosa; no necesita descargar los 10 GB para este trabajo
Ezh
49

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 ejemplo a continuación, que podría ayudar a comprender.

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

ingrese la descripción de la imagen aquí

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
Chuan
fuente
Explicación muy clara, gracias. Si una etapa nombra un artefacto con el mismo nombre que un artefacto de una etapa anterior, ¿se sobrescribe el artefacto original?
Michael Osofsky
1
@MichaelOsofsky Puede nombrar el artefacto con el mismo nombre, el artefacto original no será sobrescrito por el de la siguiente etapa con el mismo nombre. La siguiente etapa solo descarga el artefacto de la etapa anterior, es una copia del mismo. Los nombro de manera diferente en el ejemplo principalmente debido a que la prueba unitaria y la integración se ejecutarán en paralelo. Si eliminamos el trabajo de prueba de integración .eg, todos los trabajos se ejecutarán en secuencia, luego podemos usar el mismo nombre para todos los artefactos sin ninguna confusión. FYI, actualizo la respuesta con un ejemplo más.
Chuan
En su ejemplo, veo que está agregando a result.txt. Si sobrescribió result.txt en el trabajo unit_test, supongo que la implementación del trabajo nunca tendrá acceso al contenido de result.txt desde la construcción del trabajo. Solo pido que me asegure de no causar este tipo de error en mis scripts.
Michael Osofsky
1
Según el registro, la etapa de implementación descargará result.txt de las etapas de compilación y prueba, pero la última sobrescribirá la anterior.
Chuan
1
Por cierto, el artefacto original no se toca y siempre está disponible para descargar desde CI / CD -> Pipelines, luego haga clic en el botón desplegable de Artefactos a la derecha, encontrará todos los artefactos de todas las etapas.
Chuan