¿Cómo puedo pasar los artefactos de GitLab a otra etapa?

Resuelto ygoe asked hace 54 años • 0 respuestas

Me gustaría usar GitLab CI con el .gitlab-ci.ymlarchivo 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.exey ese directorio contiene otros archivos necesarios (DLL y otros). Mi .gitlab-ci.ymlarchivo 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.

ygoe avatar Jan 01 '70 08:01 ygoe
Aceptado

Usar dependencies. Con esta configuración, la testetapa descargará los archivos sin seguimiento que se crearon durante la buildetapa:

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

test:
  stage: test
  dependencies:
    - build
  script:
    - ./Test.ps1
user1495793 avatar Jul 02 '2016 02:07 user1495793

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

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 avatar Jun 11 '2019 19:06 Chuan

Si desea foo/estar disponible en la siguiente etapa Y está en su, .gitignoredeberá incluirlo en artifactsla 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 dependenciesespecifica en la siguiente etapa)

   artifacts:
     paths:
       - foo/
     expire_in: 1 hour

Por cierto, con respecto a la expire_in: 1 hourparte:
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/

k1eran avatar May 03 '2021 17:05 k1eran

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, needstodo 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 truey puede omitirse. Cuando se establece en false, el trabajo no cargará los artefactos ascendentes.

ashtonium avatar Jul 20 '2023 19:07 ashtonium