È possibile "bloccare" un gruppo di lavori su più pipeline gitlab


11

Ho più lavori che lavorano con una singola risorsa esterna (server). Il primo lavoro distribuisce l'app nell'ambiente, il secondo esegue i test in questo ambiente, il terzo esegue i test di integrazione in questo ambiente.

So che esiste un'opzione per il gruppo di risorse . Ma blocca solo i lavori. Se due condotte eseguiti simultaneamente ho bisogno di eseguire job1, job2, job3dalla prima tubazione e solo quando la prima risorsa di rilascio gasdotto - la seconda tubazione può lanciare jobs1-3. C'è un modo per raggiungere questo obiettivo? Ci sono altri lavori in cantiere - dovrebbero funzionare contemporaneamente.

Risposte:


1

Imposta un corridore dedicato per i lavori 1-3.

  1. Imposta un nuovo corridore con un tag univoco, ad esempio 'jobs-1-2-3' e imposta l'opzione concurrentsu1 .

  2. Aggiungi il tag univoco, ad esempio "jobs-1-2-3" ai lavori in questione.

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

IMHO questo è meno sforzo e più affidabile.


Non sono sicuro che funzionerà. Scenario possibile: pipeline1 (p1) esegue job1 (j1), quindi pipeline2 (p2) esegue job1 (j1), quindi pipeline 1 avvia job2. Ho bisogno di eseguire p1 run j1, j2, j3 quindi p2 run j1, j2, j3. Sembra che il gruppo di risorse farà lo stesso
Zufar Muhamadeev il

Poiché il nuovo corridore elaborerà solo un lavoro alla volta e, a causa del tag univoco, nessun altro corridore sceglierà i lavori, è garantito che p2 attenda il completamento di p1. Vedi anche docs.gitlab.com/ee/user/project/pipelines/…
RiWe

Non desidero annullare le pipeline in sospeso. Come ho detto, ci sono altri lavori: dovrebbero lavorare contemporaneamente. Quindi stai dicendo se sono in esecuzione due pipeline e l'opzione simultanea è impostata: il corridore sceglierà sempre i lavori dalla prima pipeline?
Zufar Muhamadeev,

Sì, il corridore finirà i lavori in p1 prima di elaborare i lavori da p2.
RiWe

Questo approccio funziona finora
Zufar Muhamadeev,

0

Penso che possa essere attuato attraverso le needse resource_groupparole chiave e l'API gitlab.

Ogni lavoro riceve l'ID della pipeline a cui appartiene come predefined-variable. Se si utilizza gitlab api, è possibile visualizzare lo stato di altri lavori nella pipeline. Se riesci a utilizzare questo stato needse le resource_groupparole chiave penso che tu possa ottenere ciò che volevi. Vedi la descrizione del codice sottostante e i suoi commenti per maggiori dettagli.

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.

(Non l'ho provato io stesso, quindi questo metodo ha bisogno di una revisione.)

Referenecs:


Grazie per la tua risposta. Se ho capito bene nel traffic_lightlavoro, dovrei attendere il completamento dell'esecuzione di job1-3 nella pipeline simultanea. Quello che non mi piace in questo approccio: i tuoi minuti ci saranno sprecati nel controllo dello stato della pipeline simultanea.
Zufar Muhamadeev,

Se sei preoccupato per ci minuti, puoi usare gitlab-runner self-hosted per traffic_lightusare la tagsparola chiave. Molti fornitori di servizi cloud oggi forniscono istanze di livello gratuite, sufficienti per eseguire semplici lavori di attesa come traffic_light.
aluc

Sembra che Gitlab conti i minuti anche nei corridori self-hosted. Sto provando a riprovare il lavoro che ha un tag per il corridore self-hosted, ma non si avvia e mostra un messaggio sul limite di minuti della pipeline superato: i.imgur.com/vBftxmk.png
Zufar Muhamadeev

1
Se è correlato a questo problema ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), sembra che il corridore specifico non funzioni una volta superata la quota. Non sono sicuro che sia chiaro, ma non direttamente correlato alla tua domanda originale, quindi suggerirei di pubblicare una domanda separata qui o su gitlab.
aluc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.