Come posso trasferire gli artefatti a un altro stadio?


107

Vorrei utilizzare GitLab CI con il file .gitlab-ci.yml per eseguire fasi diverse con script separati. La prima fase produce uno strumento che deve essere utilizzato in una fase successiva per eseguire i test. Ho dichiarato lo strumento generato come artefatto.

Ora come posso eseguire quello strumento in un lavoro in fase successiva? Qual è il percorso corretto e quali file ci saranno intorno?

Ad esempio, la prima fase crea artifacts / bin / TestTool / TestTool.exe e quella directory contiene altri file richiesti (DLL e altri). Il mio file .gitlab-ci.yml ha questo aspetto:

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

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

La build ei test vengono eseguiti su Windows, se pertinente.

Risposte:


102

Usa dependencies. Con questa fase di test di configurazione verranno scaricati i file non tracciati che sono stati creati durante la fase di build:

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

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1

9
Finalmente ha funzionato! Il punto chiave qui è che le dipendenze dovrebbero essere usate insieme agli artefatti. Solo i manufatti inclusi sarebbero stati disponibili per il consumo nella fase successiva. Inutile dire che sii prudente su ciò che viene caricato. Direi che usa expire_in. Altrimenti potremmo finire per sprecare molto spazio di archiviazione. Questi artefatti vengono caricati su gitlab nel processo di compilazione / fase / passaggio e scaricati in prova.
Ravikanth

18
Devi davvero usare le dipendenze? Stati della documentazione di Gitlab Note that artifacts from all previous stages are passed by default.. La domanda è quando è necessario utilizzare le dipendenze.

2
La documentazione lo chiarisce abbastanza bene: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox

3
Gli artefatti di @Josef da tutte le fasi precedenti vengono passati per impostazione predefinita (non dai lavori precedenti)
Vivek

1
@ Josef quando non hai bisogno di tutti gli artefatti di tutte le fasi precedenti per il lavoro corrente. Supponiamo che tu abbia 10 GB di binari generati dalla fase di compilazione, ma la tua fase finale invia solo alcune e-mail sulla compilazione riuscita - non è necessario scaricare tutti i 10 GB per questo lavoro
Ezh

50

Poiché gli artefatti di tutte le fasi precedenti vengono trasmessi per impostazione predefinita, è sufficiente definire le fasi nell'ordine corretto. Prova l'esempio di seguito, che potrebbe aiutarti a capire.

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

inserisci qui la descrizione dell'immagine

E nel caso in cui si trasferiscano artefatti tra lavori in fasi diverse, è possibile utilizzare le dipendenze insieme agli artefatti per passare gli artefatti, come descritto dal documento .

E un altro esempio più semplice:

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

Spiegazione molto chiara, grazie. Se uno stage nomina un artefatto con lo stesso nome di un artefatto di una fase precedente, l'artefatto originale viene sovrascritto?
Michael Osofsky il

1
@MichaelOsofsky Puoi chiamare l'artefatto con lo stesso nome, l'artefatto originale non verrà sovrascritto da quello della fase successiva con lo stesso nome. La fase successiva scarica solo l'artefatto dalla fase precedente, ne è una copia. Li nomino in modo diverso nell'esempio principalmente a causa dello unit test e l'integrazione verrà eseguita in parallelo. Se rimuoviamo il lavoro di test di integrazione .eg, tutti i lavori verranno eseguiti in sequenza, quindi possiamo utilizzare lo stesso nome per tutti gli artefatti senza alcuna confusione. Cordiali saluti, aggiorno la risposta con un altro esempio.
Chuan

Nel tuo esempio vedo che stai aggiungendo a result.txt. Se si sovrascrive il file result.txt nel job unit_test, presumo che la distribuzione del lavoro non avrebbe mai accesso ai contenuti di result.txt dalla build del lavoro. Chiedo solo di assicurarmi di non causare mai questo tipo di bug nei miei script.
Michael Osofsky

1
Secondo il registro, la fase di distribuzione scaricherà sia result.txt dalle fasi di compilazione che di test, ma l'ultima sovrascriverà quella precedente.
Chuan

1
A proposito, l'artefatto originale non viene toccato e sempre disponibile per il download da CI / CD -> Pipelines, quindi fai clic sul pulsante a discesa per gli artefatti sulla destra, troverai tutti gli artefatti di tutte le fasi.
Chuan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.