Comment puis-je passer des artefacts à une autre étape?

107

Je voudrais utiliser GitLab CI avec le fichier .gitlab-ci.yml pour exécuter différentes étapes avec des scripts séparés. La première étape produit un outil qui doit être utilisé ultérieurement pour effectuer des tests. J'ai déclaré l'outil généré comme artefact.

Maintenant, comment puis-je exécuter cet outil dans un travail ultérieur? Quel est le chemin correct et quels fichiers y aura-t-il autour de lui?

Par exemple, la première étape crée des artefacts / bin / TestTool / TestTool.exe et ce répertoire contient d'autres fichiers requis (DLL et autres). Mon fichier .gitlab-ci.yml ressemble à ceci:

releasebuild:
  script:
    - chcp 65001
    - build.cmd
  stage: build
  artifacts:
    paths:
      - artifacts/bin/TestTool/

systemtests:
  script:
    - chcp 65001
    - WHAT TO WRITE HERE?
  stage: test

La compilation et les tests s'exécutent sur Windows si cela est pertinent.

ygoe
la source

Réponses:

102

Utilisez dependencies. Avec cette étape de test de configuration, vous téléchargerez les fichiers non suivis qui ont été créés lors de la phase de construction:

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

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1
user1495793
la source
9
Enfin réussi! Le point clé ici est que les dépendances doivent être utilisées avec les artefacts. Seuls les artefacts inclus seraient disponibles pour la consommation à l'étape suivante. Inutile de dire, soyez prudent sur ce qui est téléchargé. Je dirais utiliser expire_in. Sinon, nous pourrions finir par gaspiller beaucoup de stockage. Ces artefacts sont téléchargés sur gitlab dans la tâche / étape / étape de construction et téléchargés dans le test.
ravikanth
18
Devez-vous vraiment utiliser des dépendances? États de la documentation Gitlab Note that artifacts from all previous stages are passed by default.. La question est de savoir quand devez-vous utiliser des dépendances.
2
La documentation clarifie cela assez bien: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox
3
Les artefacts @Josef de toutes les étapes précédentes sont passés par défaut (pas des emplois précédents)
Vivek
1
@Josef lorsque vous n'avez pas besoin de tous les artefacts de toutes les étapes précédentes pour la tâche en cours. Supposons que vous ayez 10 Go de binaires générés par l'étape de construction, mais que votre étape finale envoie simplement des e-mails sur la construction réussie - vous n'avez pas besoin de télécharger les 10 Go pour ce travail
Ezh
50

Étant donné que les artefacts de toutes les étapes précédentes sont passés par défaut, nous devons simplement définir les étapes dans le bon ordre. Veuillez essayer l'exemple ci-dessous, qui pourrait vous aider à comprendre.

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

entrez la description de l'image ici

Et dans le cas de passer des artefacts entre des travaux à différentes étapes, nous pouvons utiliser des dépendances avec des artefacts pour transmettre les artefacts, comme décrit dans le document .

Et un exemple plus 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
la source
Explication très claire, merci. Si une étape nomme un artefact du même nom qu'un artefact d'une étape précédente, l'artefact d'origine est-il écrasé?
Michael Osofsky
1
@MichaelOsofsky Vous pouvez nommer l'artefact par le même nom, l'artefact d'origine ne sera pas écrasé par celui de l'étape suivante avec le même nom. L'étape suivante ne télécharge que l'artefact de l'ancienne étape, il en est une copie. Je les nomme différemment dans l'exemple principalement en raison du test unitaire et l'intégration sera exécutée en parallèle. Si nous supprimons le travail de test d'intégration .eg, tous les travaux seront exécutés en séquence, nous pouvons alors utiliser le même nom pour tous les artefacts sans aucune confusion. FYI, je mets à jour la réponse avec un autre exemple.
Chuan
Dans votre exemple, je vois que vous ajoutez à result.txt. Si vous écrasez result.txt dans le job unit_test, je suppose que le déploiement du travail n'aura jamais accès au contenu de result.txt à partir de la construction du travail. Je demande juste de m'assurer de ne jamais causer ce type de bogue dans mes scripts.
Michael Osofsky
1
Selon le journal, l'étape de déploiement téléchargera à la fois le fichier result.txt des étapes de construction et de test, mais la dernière écrasera l'ancienne.
Chuan
1
BTW, l'artefact d'origine n'est pas touché et toujours disponible au téléchargement à partir de CI / CD -> Pipelines, puis cliquez sur le bouton déroulant des artefacts sur la droite, vous trouverez tous les artefacts de toutes les étapes.
Chuan