Как передать артефакты на другой этап?

110

Я хотел бы использовать GitLab CI с файлом .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, если это необходимо.

ygoe
источник

Ответы:

104

Используйте dependencies. С помощью этого этапа тестирования конфигурации будут загружены неотслеживаемые файлы, которые были созданы на этапе сборки:

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

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1
user1495793
источник
9
Наконец-то он заработал! Ключевым моментом здесь является то, что зависимости должны использоваться вместе с артефактами. Только включенные артефакты будут доступны для использования на следующем этапе. Излишне говорить, что нужно быть консервативным в том, что загружается. Я бы сказал, используйте expire_in. В противном случае мы могли бы потратить впустую много места для хранения. Эти артефакты загружаются в gitlab в задании / этапе / этапе сборки и загружаются в тесте.
равикант
18
Вам действительно нужно использовать зависимости? В документации Gitlab указано Note that artifacts from all previous stages are passed by default.. Вопрос в том, когда нужно использовать зависимости.
2
Документация это довольно хорошо проясняет
chetbox
3
Артефакты @Josef со всех предыдущих этапов передаются по умолчанию (не из предыдущих заданий)
Вивек
1
документация сбивает с толку - что значит пропускать артефакты «всех предыдущих этапов»? Если я правильно понимаю, если все предыдущие этапы всегда пройдены, то будут доступны все данные со всех заданий, и мне не нужно использовать тег «зависимости». Единственный случай, о котором я могу думать, - это если я НЕ хочу такого поведения и передаю артефакты только из одной или нескольких выбранных заданий.
skofgar
52

Поскольку по умолчанию передаются артефакты со всех предыдущих этапов, нам просто нужно определить этапы в правильном порядке. Пожалуйста, попробуйте приведенный ниже пример, который может помочь в понимании.

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, все задания будут выполняться последовательно, тогда мы сможем без путаницы использовать одно и то же имя для всех артефактов. К вашему сведению, я дополняю ответ еще одним примером.
Чуан
В вашем примере я вижу, что вы добавляете файл result.txt. Если вы перезаписали файл result.txt в задании unit_test, я предполагаю, что развертывание задания никогда не получит доступа к содержимому result.txt из сборки задания. Я просто прошу убедиться, что я никогда не вызываю этот тип ошибок в своих скриптах.
Майкл Ософски
1
Согласно журналу, на этапе развертывания будут загружены оба файла result.txt из этапов сборки и тестирования, но более поздний будет перезаписывать предыдущий.
Чуан
1
Кстати, исходный артефакт не затрагивается и всегда доступен для загрузки с CI / CD -> Pipelines, затем нажмите кнопку раскрывающегося списка для артефактов справа, вы найдете все артефакты всех этапов.
Чуан