Як я можу передати артефакти на інший етап?


107

Я б хотів використовувати Cit GitLab з файлом .gitlab-ci.yml для запуску різних етапів з окремими сценаріями. На першому етапі виробляється інструмент, який на подальшому етапі необхідно використовувати для виконання тестів. Я оголосив створений інструмент як артефакт.

Тепер, як я можу виконати цей інструмент у подальшому етапі роботи? Який правильний шлях і які файли будуть навколо нього?

Наприклад, перший етап створює артефакти / bin / TestTool / TestTool.exe, і цей каталог містить інші необхідні файли (DLL та інші). Мій файл .gitlab-ci.yml виглядає так:

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

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

Збірка та тести працюють у Windows, якщо це доречно.

Відповіді:


102

Використовуйте dependencies. За допомогою цього тестового етапу конфігурації завантажуватимуться відслідковувані файли, створені на етапі збірки:

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

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

9
Нарешті дійшло до роботи! Ключовим моментом тут є використання залежностей від артефактів. Тільки артефакти, які були включені, були б доступні для споживання на наступній стадії. Зайве говорити, будьте консервативні щодо того, що завантажується. Я б сказав, використовуйте expire_in. В іншому випадку ми могли б втратити багато місця для зберігання. Ці артефакти завантажуються в gitlab в роботі збірки / стадії / кроку і завантажуються в тест.
ravikanth

18
Вам справді доводиться використовувати залежності? У документації Gitlab зазначено Note that artifacts from all previous stages are passed by default.. Питання в тому, коли потрібно використовувати залежності.

2
Документація це досить добре очищає: docs.gitlab.com/ee/ci/yaml/#dependitions
chetbox

3
@Josef артефакти з усіх попередніх етапів передаються за замовчуванням (Не з попередніх завдань)
Vivek

1
@Josef, коли для поточної роботи вам не потрібні всі артефакти з усіх попередніх етапів. Скажімо, у вас було створено 10 ГБ бінарних файлів, створених на етапі збірки, але ваш останній етап просто надсилає кілька повідомлень про успішну збірку - вам не потрібно завантажувати всі 10 ГБ для цієї роботи
Еж,

50

Оскільки артефакти з усіх попередніх етапів передаються за замовчуванням, нам просто потрібно визначити етапи у правильному порядку. Спробуйте скористатися прикладом нижче, який може допомогти зрозуміти.

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

введіть тут опис зображення

А якщо пройти артефакти між завданнями на різних етапах, ми можемо використовувати залежності разом з артефактами для передачі артефактів, як описано в документі .

І ще один простіший приклад:

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

Дуже чітке пояснення, дякую. Якщо етап називає артефакт тим самим іменем, що і артефакт попереднього етапу, чи буде оригінальний артефакт перезаписаний?
Михайло Ософський

1
@MichaelOsofsky Ви можете назвати артефакт за однойменною назвою, оригінальний артефакт не буде перезаписаний тим, хто з наступного етапу з такою ж назвою. Наступний етап лише завантажує артефакт з колишнього етапу, це його копія. Я називаю їх по-різному в прикладі, головним чином завдяки тестуванню блоку і інтеграція буде виконуватися паралельно. Якщо ми видалимо тестове завдання інтеграції .eg, всі завдання будуть виконуватися послідовно, то ми можемо використовувати те саме ім’я для всіх артефактів без будь-якої плутанини. FYI, я оновлюю відповідь ще одним прикладом.
Чуан

У вашому прикладі я бачу, що ви додаєте результат.txt. Якщо ви перезаписали result.txt у завданні unit_test, я припускаю, що розгортання завдання ніколи не матиме доступу до вмісту result.txt із складання завдання. Я просто прошу переконатися, що я ніколи не спричиняю такого типу помилок у своїх сценаріях.
Михайло Ософський

1
Відповідно до журналу, етап розгортання завантажить обидва результи.txt з етапів складання та тестування, але пізніший замінить попередній.
Чуан

1
До речі, оригінальний артефакт не торкається і завжди доступний для завантаження з CI / CD -> Трубопроводи, потім натисніть кнопку, що спадає на артефакти праворуч, ви знайдете всі артефакти всіх етапів.
Чуан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.