Gitlab CI: Как запустить скрипт curl после загрузки артефактов в одном и том же задании? - PullRequest
1 голос
/ 14 марта 2020

Я хочу запустить задание, настроенное в репозитории B, для которого требуется артефакт (exe-файл) из репозитория A.

Для загрузки этого артефакта я использую GitLab API, для которого требуется jobID для загрузки Артефакт.

Проблема : Поскольку я использую команду curl (с идентификатором JOB) для запуска задания ui_test в Repo B, ui_test запускается даже до того, как артефакты закончатся sh выгрузка из задания build в репо А.

Есть ли способ запустить команду триггера скручивания после загрузки артефактов? или если есть какой-то другой способ сделать sh это?

Что я пробовал до сих пор

  1. Я пытался переместить локон к after_script: но, к сожалению, он запускается до загрузки артефактов
  2. Я настроил еще одно задание в Repo A, которое запускается после задания build, моя идея состояла в том, чтобы сохранить задание JOB_ID из build в глобальная переменная и передать ее на следующую работу. Но, к сожалению, мы не можем экспортировать переменные или переопределять глобальные переменные. https://gitlab.com/gitlab-org/gitlab/-/issues/16765
  3. Я пытался использовать when with delay для отсрочки начала задания, это ненадежно, поскольку загрузка артефактов также может занять более 4 минут.

Вот мой скелет yml из обоих репозиториев

Хранилище A : содержит код разработки

Jobs :  unit-test
        build
        deploy

Хранилище B : содержит тест пользовательского интерфейса

Jobs : ui-test

скелет Yml от Repo A.

stages:
  - test
  - build
  - deploy

# Unit tests on the branch
unit-test:
  tags:
    - docker
  stage: test
  script:
    - echo test 

# This jobs creates the exe file 
build:
  stage: build
  tags:
    - docker
  script:
    - some build commands
    - curl -X POST -F token=<triggertoken> -F ref=master -F variables[JOB_ID]=${CI_JOB_ID}  https://gitlab.com/api/####/projects/<repoBprojectid>/trigger/pipeline
  artifacts:
    paths:
      - /build/demo/test.exe

скелет Yml от Repo B.

ui_test:
  stage: test
  when: delayed
  start_in: 4 minutes
  tags:
    - selenium
  before_script:
    - echo ${JOB_ID}
    - 'curl --location --output ../resources/exe/test.exe --header "PRIVATE-TOKEN: $token" "https://gitlab.com/api/#/projects/<repoAprojectid>/jobs/$JOB_ID/artifacts//build/demo/test.exe"'
  script:
    - java loginTest.java

1 Ответ

0 голосов
/ 14 марта 2020

Интересно, почему так много проектов имеют тесты селена в разных репозиториях. Я категорически против такого разделения проектов, так как разработчики, как правило, забывают о тестах пользовательского интерфейса, и они бесполезны, когда не обновляются.

Тесты Selenium не занимают много места, поскольку в большинстве случаев это только исходный код для тестируйте классы, поэтому было бы разумно хранить их вместе с основным кодом проекта. Другое дело, что вам не нужно беспокоиться о прохождении артефактов и тестов вариантов в соответствии с основным продуктом.

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

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

Так что, если вы хотите запустить тесты пользовательского интерфейса, я бы go предложил решение, которое вы предложили иметь еще одну работу, которая запускает внешнюю работу после этапа сборки. Ваш yaml будет выглядеть так:

stages:
  - test
  - build
  - deploy

...

# This jobs creates the exe file 
build:
  stage: build
  tags:
    - docker
  script:
    - some build commands
    - echo "export JOB_ID=$CI_JOB_ID;" >> variables
  artifacts:
    paths:
      - /build/demo/test.exe
      - variables

trigger_ui_test:
  stage: deploy
  script:
    - source variables
    - curl <your curl command with -F variables[JOB_ID]=${JOB_ID} >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...