Est-il possible de «verrouiller» un groupe d'emplois sur plusieurs pipelines gitlab

11

J'ai plusieurs emplois travaillant avec une seule ressource externe (serveur). Le premier travail déploie l'application dans l'environnement, le deuxième exécute des tests dans cet environnement, le troisième exécute des tests d'intégration dans cet environnement.

Je sais qu'il existe une option de groupe de ressources . Mais cela ne verrouille que les emplois. Si deux pipelines fonctionnent en même temps que je dois exécuter job1, job2, job3de la première canalisation et que lorsque la première ressource de libération de pipeline - le deuxième pipeline peut lancer jobs1-3. Existe-t-il un moyen d'y parvenir? Il y a d'autres emplois dans le pipeline - ils devraient travailler simultanément.

Zufar Muhamadeev
la source

Réponses:

1

Configurez un coureur dédié pour les travaux 1-3.

  1. Configurez un nouveau coureur avec une balise unique, par exemple «jobs-1-2-3» et définissez l'option concurrentsur1 .

  2. Ajoutez la balise unique, par exemple «jobs-1-2-3» aux jobs en question.

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

À mon humble avis, c'est moins d'effort et plus fiable.

RiWe
la source
Je ne suis pas sûr que cela fonctionnera. Scénario possible: pipeline1 (p1) exécuter job1 (j1), puis pipeline2 (p2) exécuter job1 (j1), puis pipeline 1 démarrer job2. J'ai besoin de p1 exécuter j1, j2, j3 puis p2 exécuter j1, j2, j3. On dirait que le groupe de ressources fera de même
Zufar Muhamadeev
Étant donné que le nouveau coureur ne traitera qu'un seul travail à la fois et qu'en raison de la balise unique, aucun autre coureur ne choisira les travaux, il est assuré que p2 attend la fin de p1. Voir également docs.gitlab.com/ee/user/project/pipelines/…
RiWe
Je ne veux pas annuler les pipelines en attente. Comme je l'ai dit, il y a d'autres emplois - ils devraient travailler simultanément. Alors, êtes-vous sûr que deux pipelines sont en cours d'exécution et que l'option simultanée est définie - le coureur choisira toujours les travaux du premier pipeline?
Zufar Muhamadeev
Oui, le coureur terminera les tâches de p1 avant de traiter les tâches de p2.
RiWe
Cette approche fonctionne jusqu'à présent
Zufar Muhamadeev
0

Je pense qu'il peut être mis en œuvre à travers les needset resource_groupmots - clés et l'API gitlab ce.

Chaque travail reçoit l'ID de pipeline auquel il appartient en tant que predefined-variable. Si vous utilisez l'api gitlab, vous pouvez voir l'état des autres tâches dans le pipeline. Si vous pouvez utiliser ce statut needset ces resource_groupmots clés, je pense que vous pouvez réaliser ce que vous vouliez. Voir la description du code ci-dessous et ses commentaires pour plus de détails.

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.

(Je ne l'ai pas testé moi-même, cette méthode doit donc être revue.)

Références:

aluc
la source
Merci pour votre réponse. Si j'ai bien compris dans le traffic_lighttravail, je devrais attendre la fin de l'exécution du travail 1-3 dans le pipeline simultané. Ce que je n'aime pas dans cette approche - vos minutes ci seront gaspillées pour vérifier l'état du pipeline simultané.
Zufar Muhamadeev le
Si vous êtes préoccupé par les minutes ci, vous pouvez utiliser gitlab-runner auto-hébergé pour traffic_lightutiliser le tagsmot-clé. De nombreux fournisseurs de cloud proposent aujourd'hui des instances de niveau gratuit, qui sont suffisantes pour exécuter des tâches d'attente simples comme traffic_light.
aluc
On dirait que gitlab compte des minutes même chez les coureurs auto-hébergés. J'essaie de réessayer le travail qui a une balise pour le runner auto-hébergé - mais il ne se lance pas et affiche un message sur la limite de minutes de pipeline dépassée: i.imgur.com/vBftxmk.png
Zufar Muhamadeev
1
S'il est lié au problème this ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), il semble que le coureur spécifique ne fonctionne pas une fois le quota dépassé. Je ne suis pas sûr que ce soit clair, mais ce n'est pas directement lié à votre question d'origine, je suggère donc de poster une question distincte ici ou sur gitlab.
aluc