Можно ли "заблокировать" группу заданий по нескольким конвейерам gitlab? - PullRequest
11 голосов
/ 15 января 2020

У меня есть несколько заданий, работающих с одним внешним ресурсом (сервером). Первое задание развертывает приложение в среде, второе выполняет тесты в этой среде, третье выполняет интеграционные тесты в этой среде.

Я знаю, что есть Опция группы ресурсов . Но это блокирует только рабочие места. Если два конвейера работают одновременно, мне нужно выполнить job1, job2, job3 из первого конвейера и только когда первый конвейер освобождает ресурс - второй конвейер может запустить jobs1-3. Есть ли способ добиться этого? В конвейере есть другие работы - они должны работать одновременно.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Настройте выделенного участника для заданий 1-3.

  1. Установите нового участника с уникальным тегом, например «jobs-1-2-3» и установите для параметра concurrent значение 1.

  2. Добавьте уникальный тег, например 'jobs-1-2-3', к рассматриваемым вакансиям.

    job1:
      tags:
        - jobs-1-2-3
    job2:
      tags:
        - jobs-1-2-3
    job3:
      tags:
        - jobs-1-2-3
    

ИМХО это меньше усилий и надежнее.

0 голосов
/ 20 января 2020

Я думаю, что это можно реализовать с помощью ключевых слов needs и resource_group и API gitlab.

Каждое задание получает идентификатор конвейера, которому оно принадлежит, как predefined-variable. Если вы используете API gitlab, вы можете увидеть состояние других заданий в конвейере. Если вы можете использовать этот статус, ключевые слова needs и resource_group, я думаю, вы можете достичь того, что вы хотели. См. Описание приведенного ниже кода и его комментарии для получения более подробной информации.

stages:
  - ready
  - build

job1:
  stage: build
  needs: [starting_signal]
  script: 
    - sleep 10 && echo "job1"
job2:
  stage: build
  needs: [starting_signal]
  script:
    - sleep 20 && echo "job2"
job3:
  stage: build
  needs: [starting_signal]
  script:
    - sleep 30 && echo "job3"

starting_signal:
  stage: ready
  script:
    - # TODO: You need to implement it using the GitLab API.
    - # The starting condition for "job1-3" is
    - # that this `starting_signal` job finished successfully.
    - # And the condition that ends with the success of this job
    - # is that `traffic_light` becomes running.

traffic_light: 
  stage: ready
  resource_group: traffic_light
  script:
    - # TODO: You need to implement it using the GitLab API.
    - # The end condition for `traffic_light` is
    - # the end of job1-3 execution.
    - # In other words, this job must be checked and waited
    - # through gitlab api until job 1,2,3 is finished.
    - # Since this job locks the execution of a `traffic_light` job
    - # in another pipeline, the `starting_signal` job in another 
    - # pipeline does not succeed.

(я сам не тестировал его, поэтому этот метод требует пересмотра.)

Referenecs:

...