Czy można „zablokować” grupę zadań w wielu rurociągach gitlab

11

Mam wiele zadań pracujących z jednym zasobem zewnętrznym (serwerem). Pierwsze zadanie polega na wdrożeniu aplikacji w środowisku, drugie wykonanie testów w tym środowisku, trzecie wykonanie testów integracyjnych w tym środowisku.

Wiem, że istnieje opcja grupy zasobów . Ale blokuje tylko zadania. Jeśli dwa rurociągi uruchomić równocześnie muszę wykonać job1, job2, job3od pierwszego rurociągu i tylko wtedy pierwszego zasobu uwalnianiu rurociąg - drugi rurociąg można uruchomić jobs1-3. Czy istnieje sposób na osiągnięcie tego? W przygotowaniu są inne zadania - powinny one działać jednocześnie.

Zufar Muhamadeev
źródło

Odpowiedzi:

1

Skonfiguruj dedykowanego biegacza dla zadań 1-3.

  1. Skonfiguruj nowego biegacza z unikalnym znacznikiem, np. „Jobs-1-2-3” i ustaw opcję concurrentna1 .

  2. Dodaj unikalny znacznik, np. „Jobs-1-2-3” do danych zadań.

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

IMHO to mniej wysiłku i bardziej niezawodny.

RiWe
źródło
Nie jestem pewien, czy to zadziała. Możliwy scenariusz: uruchom rurociąg1 (p1) uruchom zadanie 1 (j1), następnie uruchom zadanie pipeline2 (p2) uruchom zadanie1 (j1), a następnie uruchom zadanie2 rurociąg 1. Potrzebuję p1 uruchomić j1, j2, j3, a następnie p2 uruchomić j1, j2, j3. Wygląda na to, że grupa zasobów zrobi to samo
Zufar Muhamadeev
Ponieważ nowy biegacz będzie przetwarzał tylko jedno zadanie na raz, a ze względu na unikalny znacznik żaden inny biegacz nie wybierze zadań, zapewnione jest, że p2 czeka na zakończenie p1. Zobacz także docs.gitlab.com/ee/user/project/pipelines/…
RiWe
Nie chcę anulować oczekujących potoków. Jak powiedziałem, istnieją inne prace - powinny one działać jednocześnie. Czy więc wygrywasz, jeśli uruchomione są dwa potoki i ustawiona jest opcja równoczesna - program runner zawsze wybiera zadania z pierwszego potoku?
Zufar Muhamadeev
Tak, biegacz zakończy zadania w p1 przed przetworzeniem zadań z p2.
RiWe
To podejście działa do tej pory
Zufar Muhamadeev
0

Myślę, że może być realizowany przez needsi resource_groupsłów kluczowych i API gitlab.

Każde zadanie otrzymuje identyfikator potoku, do którego należy jako predefined-variable. Jeśli używasz interfejsu gitlab, możesz zobaczyć status innych zadań w potoku. Jeśli możesz użyć tego statusu needsi resource_groupsłów kluczowych, myślę, że możesz osiągnąć to, co zamierzałeś. Zobacz opis poniższego kodu i jego komentarze, aby uzyskać więcej informacji.

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.

(Nie testowałem tego sam, więc ta metoda wymaga przeglądu.)

Referencje:

aluc
źródło
Dzięki za odpowiedź. Jeśli zrozumiałem poprawność w traffic_lightzadaniu, powinienem poczekać na zakończenie wykonywania zadania 1-3 w równoległym potoku. Czego nie lubię w tym podejściu - twoje minuty ci zostaną zmarnowane na sprawdzanie statusu współbieżnego potoku.
Zufar Muhamadeev
Jeśli obawiasz się o CI minut, można użyć self-hosted gitlab-runner dla traffic_lightużyciem tagssłowa kluczowego. Obecnie wielu dostawców usług w chmurze udostępnia bezpłatne wystąpienia warstw, które wystarczają do wykonywania prostych zadań oczekiwania, takich jak traffic_light.
aluc
Wygląda na to, że gitlab liczy minuty, nawet u samozwańczych biegaczy. Próbuję ponowić zadanie, które ma tag dla hosta prowadzącego własny serwer
Zufar Muhamadeev
1
Jeśli jest to związane z tym problemem ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), wydaje się, że określony biegacz nie działa po przekroczeniu limitu. Nie jestem pewien, czy jest to jasne, ale nie jest to bezpośrednio związane z twoim pierwotnym pytaniem, dlatego sugeruję opublikowanie osobnego pytania tutaj lub na gitlab.
aluc