É possível "bloquear" grupos de tarefas em vários pipelines do gitlab

11

Tenho vários trabalhos trabalhando com um único recurso externo (servidor). O primeiro trabalho implementa o aplicativo no ambiente, depois executa os testes nesse ambiente e o terceiro executa os testes de integração nesse ambiente.

Eu sei que existe a opção de grupo de recursos . Mas ele bloqueia apenas trabalhos. Se dois oleodutos executados simultaneamente eu preciso para executar job1, job2, job3a partir do primeiro gasoduto e somente quando o primeiro recurso liberação gasoduto - o segundo gasoduto pode lançar jobs1-3. Existe uma maneira de conseguir isso? Existem outros trabalhos em andamento - eles devem funcionar simultaneamente.

Zufar Muhamadeev
fonte

Respostas:

1

Configure um corredor dedicado para os trabalhos1-3.

  1. Configure um novo corredor com uma etiqueta única, por exemplo, 'jobs-1-2-3' e defina a opção concurrentcomo1 .

  2. Adicione a tag exclusiva, por exemplo, 'jobs-1-2-3' aos jobs em questão.

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

IMHO isso é menos esforço e mais confiável.

RiWe
fonte
Não tenho certeza se vai funcionar. Cenário possível: o pipeline1 (p1) executa o job1 (j1), o pipeline2 (p2) executa o job1 (j1) e o pipeline 1 inicia o job2. Preciso p1 executar j1, j2, j3, em seguida, p2 executar j1, j2, j3. Parece que o grupo de recursos fará o mesmo
Zufar Muhamadeev 21/01
Como o novo corredor processará apenas um trabalho de cada vez e, devido à etiqueta exclusiva, nenhum outro corredor escolherá os trabalhos, é garantido que p2 aguarde a conclusão de p1. Consulte também docs.gitlab.com/ee/user/project/pipelines/…
RiWe
Não quero cancelar pipelines pendentes. Como eu disse, existem outros empregos - eles devem funcionar simultaneamente. Então, você está dizendo se dois pipelines estão em execução e a opção simultânea está definida - o runner sempre escolhe os trabalhos do primeiro pipeline?
Zufar Muhamadeev 22/01
Sim, o corredor finaliza os trabalhos em p1 antes de processar os trabalhos de p2.
RiWe 23/01
Essa abordagem funciona até agora
Zufar Muhamadeev 18/02
0

Eu acho que ele pode ser implementado através dos needse resource_grouppalavras-chave e a API gitlab.

Todo trabalho recebe o ID do pipeline ao qual pertence como a predefined-variable. Se você usar a API do gitlab, poderá ver o status de outros trabalhos no pipeline. Se você pode usar esse status needse as resource_grouppalavras - chave, acho que pode alcançar o que pretendia. Veja a descrição do código abaixo e seus comentários para mais detalhes.

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.

(Eu não testei, então esse método precisa de uma revisão.)

Referenecs:

aluc
fonte
Obrigado pela sua resposta. Se entendi correto no traffic_lighttrabalho, devo esperar o término da execução do trabalho1-3 no pipeline simultâneo. O que eu não gosto nessa abordagem - seus minutos de ci serão desperdiçados na verificação do status do pipeline simultâneo.
Zufar Muhamadeev 21/01
Se você está preocupado com o ci minutes, pode usar o gitlab-runner auto-hospedado para traffic_lightusar a tagspalavra-chave. Atualmente, muitos fornecedores de nuvem fornecem instâncias de camada gratuitas, suficientes para executar tarefas de espera simples como traffic_light.
aluc 21/01
Parece que o gitlab conta minutos, mesmo em corredores auto-hospedados. Estou tentando repetir um trabalho que possui uma tag para corredor auto-hospedado - mas ele não inicia e mostra a mensagem sobre o limite de minutos do pipeline excedido: i.imgur.com/vBftxmk.png
Zufar Muhamadeev
11
Se estiver relacionado ao problema ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), parece que o corredor específico não funciona quando a cota é excedida. Não tenho certeza se isso está claro, mas isso não está diretamente relacionado à sua pergunta original, por isso sugiro postar uma pergunta separada aqui ou no gitlab.
aluc 26/01