Ist es möglich, eine Gruppe von Jobs über mehrere Gitlab-Pipelines hinweg zu sperren?


11

Ich habe mehrere Jobs, die mit einer einzelnen externen Ressource (Server) arbeiten. Der erste Job stellt die App in der Umgebung bereit, der zweite führt Tests in dieser Umgebung aus, der dritte führt Integrationstests in dieser Umgebung aus.

Ich weiß, dass es eine Ressourcengruppenoption gibt . Es werden jedoch nur Jobs gesperrt. Wenn zwei Pipelines gleichzeitig laufen muß ich ausführen job1, job2, job3von der ersten Pipeline und nur dann , wenn die ersten Pipeline - Release Ressource - die zweite Pipeline starten kann jobs1-3. Gibt es einen Weg, dies zu erreichen? Es sind weitere Jobs in der Pipeline - sie sollten gleichzeitig funktionieren.

Antworten:


1

Richten Sie einen dedizierten Runner für die Jobs1-3 ein.

  1. Richten Sie einen neuen Läufer mit einem eindeutigen Tag ein, z. B. 'jobs-1-2-3', und setzen Sie die Option concurrentauf1 .

  2. Fügen Sie den betreffenden Jobs das eindeutige Tag "jobs-1-2-3" hinzu.

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

IMHO ist dies weniger Aufwand und zuverlässiger.


Ich bin mir nicht sicher, ob es funktionieren wird. Mögliches Szenario: Pipeline1 (p1) führt Job1 (j1) aus, dann Pipeline2 (p2) Job1 (j1) und Pipeline1 Job2. Ich brauche p1 Lauf j1, j2, j3, dann p2 Lauf j1, j2, j3. Es sieht so aus, als würde die Ressourcengruppe dasselbe tun
Zufar Muhamadeev

Da der neue Läufer jeweils nur einen Job verarbeitet und aufgrund des eindeutigen Tags kein anderer Läufer die Jobs auswählt, wird sichergestellt, dass p2 auf den Abschluss von p1 wartet. Siehe auch docs.gitlab.com/ee/user/project/pipelines/…
RiWe

Ich möchte ausstehende Pipelines nicht stornieren. Wie gesagt, es gibt andere Jobs - sie sollten gleichzeitig arbeiten. Sind Sie also sicher, wenn zwei Pipelines ausgeführt werden und die Option "Gleichzeitig" festgelegt ist - der Läufer wählt immer Jobs aus der ersten Pipeline aus?
Zufar Muhamadeev

Ja, der Läufer beendet die Jobs in p1, bevor er Jobs von p2 verarbeitet.
RiWe

Dieser Ansatz funktioniert bisher
Zufar Muhamadeev

0

Ich denke , es kann durch die umgesetzt werden needsund resource_groupSchlüsselwörter und der Gitlab API.

Jeder Job erhält die Pipeline-ID, zu der er gehört predefined-variable. Wenn Sie die gitlab-API verwenden, können Sie den Status anderer Jobs in der Pipeline anzeigen. Wenn Sie diesen Status needsund resource_groupSchlüsselwörter verwenden können, können Sie meiner Meinung nach das erreichen, was Sie beabsichtigt haben. Weitere Informationen finden Sie in der Beschreibung des folgenden Codes und seinen Kommentaren.

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.

(Ich habe es nicht selbst getestet, daher muss diese Methode überprüft werden.)

Referenzen:


Danke für deine Antwort. Wenn ich im traffic_lightJob richtig verstanden habe, sollte ich warten, bis die Ausführung von Job1-3 in der gleichzeitigen Pipeline beendet ist. Was mir an diesem Ansatz nicht gefällt - Ihre CI-Minuten werden für die Überprüfung des Status der gleichzeitigen Pipeline verschwendet.
Zufar Muhamadeev

Wenn Sie sich Gedanken über CI-Minuten machen, können Sie selbst gehosteten Gitlab-Runner für die traffic_lightVerwendung von tagsSchlüsselwörtern verwenden. Viele Cloud-Anbieter bieten heutzutage kostenlose Tier-Instanzen an, die ausreichen, um einfache Wartejobs wie z traffic_light.
Aluc

Es sieht so aus, als würde Gitlab selbst bei selbst gehosteten Läufern Minuten zählen. Ich versuche, einen Job erneut zu versuchen, der ein Tag für einen selbst gehosteten Läufer hat. Er wird jedoch nicht gestartet und zeigt die Meldung an, dass das Minutenlimit
Zufar Muhamadeev

1
Wenn es mit diesem Problem zusammenhängt ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), scheint es, dass der spezifische Läufer nicht funktioniert, sobald das Kontingent überschritten wird. Ich bin mir nicht sicher, ob dies klar ist, aber dies hängt nicht direkt mit Ihrer ursprünglichen Frage zusammen. Daher würde ich vorschlagen, hier oder auf gitlab eine separate Frage zu stellen.
Aluc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.