¿Es posible "bloquear" el grupo de trabajos a través de múltiples tuberías de gitlab

11

Tengo varios trabajos trabajando con un solo recurso externo (servidor). El primer trabajo implementa la aplicación en el entorno, el segundo ejecuta las pruebas en este entorno, el tercero ejecuta las pruebas de integración en este entorno.

Sé que hay una opción de grupo de recursos . Pero solo bloquea trabajos. Si dos tuberías coincide en el tiempo que necesito para ejecutar job1, job2, job3de la primera tubería y sólo cuando el primer recurso liberación de tuberías - la segunda tubería puede lanzar jobs1-3. ¿Hay una manera de lograr esto? Hay otros trabajos en tramitación: deberían funcionar al mismo tiempo.

Zufar Muhamadeev
fuente

Respuestas:

1

Configure un corredor dedicado para los trabajos 1-3.

  1. Configure un nuevo corredor con una etiqueta única, por ejemplo, 'jobs-1-2-3' y configure la opción concurrenten1 .

  2. Agregue la etiqueta única, por ejemplo, 'jobs-1-2-3' a los trabajos en cuestión.

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

En mi humilde opinión esto es menos esfuerzo y más confiable.

RiWe
fuente
No estoy seguro de que funcione. Escenario posible: tubería1 (p1) ejecutar trabajo1 (j1), luego tubería2 (p2) ejecutar trabajo1 (j1), luego tubería 1 iniciar trabajo2. Necesito p1 ejecutar j1, j2, j3 y luego p2 ejecutar j1, j2, j3. Parece que el grupo de recursos hará lo mismo
Zufar Muhamadeev
Dado que el nuevo corredor procesará solo un trabajo a la vez y debido a la etiqueta única que ningún otro corredor seleccionará los trabajos, se garantiza que p2 espera a que p1 termine. Ver también docs.gitlab.com/ee/user/project/pipelines/…
RiWe
No quiero cancelar las tuberías pendientes. Como dije, hay otros trabajos: deberían funcionar al mismo tiempo. Entonces, ¿está seguro si se están ejecutando dos canales y se establece la opción concurrente: el corredor siempre elegirá los trabajos del primer canal?
Zufar Muhamadeev
Sí, el corredor finalizará los trabajos en p1 antes de procesar los trabajos desde p2.
RiWe
Este enfoque funciona hasta ahora
Zufar Muhamadeev
0

Creo que se puede implementar a través de los needsy las resource_grouppalabras clave y la API gitlab.

Cada trabajo recibe la identificación de la tubería a la que pertenece como a predefined-variable. Si usa la API de gitlab, puede ver el estado de otros trabajos en la tubería. Si puede usar este estado needsy las resource_grouppalabras clave, creo que puede lograr lo que pretendía. Consulte la descripción del código a continuación y sus comentarios para obtener más detalles.

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.

(No lo probé yo mismo, por lo que este método necesita una revisión).

Referenecs:

aluc
fuente
Gracias por tu respuesta. Si entendí correcto en el traffic_lighttrabajo, debería esperar a que finalice la ejecución del trabajo1-3 en la tubería concurrente. Lo que no me gusta de este enfoque: sus minutos de ci se perderán al verificar el estado de la canalización concurrente.
Zufar Muhamadeev
Si le preocupan los minutos ci, puede usar gitlab-runner autohospedado para traffic_lightusar la tagspalabra clave. Muchos proveedores de la nube de hoy ofrecen instancias de niveles gratuitas, que son suficientes para ejecutar tareas de espera simples como traffic_light.
aluc
Parece que gitlab cuenta minutos incluso en corredores autohospedados. Estoy tratando de volver a intentar el trabajo que tiene una etiqueta para el corredor autohospedado
Zufar Muhamadeev
1
Si está relacionado con el problema this ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), parece que el corredor específico no funciona una vez que se supera la cuota. No estoy seguro de si esto está claro, pero esto no está directamente relacionado con su pregunta original, por lo que sugeriría publicar una pregunta por separado aquí o en gitlab.
aluc