Posterior a consultar con expertos en esta materia, programadores de deferentes ramas y maestros dimos con la solución a la interrogande y la dejamos plasmada en este post.
Solución:
Puede usar una expresión variable de gitlab con solo/excepto como se muestra a continuación y luego pasar la variable a la ejecución de la canalización según sea necesario.
Este ejemplo ejecuta por defecto ambos trabajos, pero si se pasa ‘true’ para “firstJobOnly” solo ejecuta el primer trabajo.
Viejo enfoque — (aún válido a partir de gitlab 13.8) – solo/excepto
variables:
firstJobOnly: 'false'
before_script:
- docker info
job1:
script:
- do something
job2:
script:
- do something
except:
variables:
- $firstJobOnly =~ /true/i
Enfoque actualizado – normas
Si bien lo anterior aún funciona, la mejor manera de lograr esto ahora sería usar la sintaxis de reglas. Un ejemplo simple similar a mi respuesta original está a continuación.
Si explora las opciones en la sintaxis de las reglas, dependiendo de las restricciones específicas del proyecto, hay muchas formas de lograrlo.
variables:
firstJobOnly: 'false'
job1:
script:
- do something
job2:
script:
- do something
rules:
- if: '$firstJobOnly == "true"'
when: never
when: always
Enfrentamos el mismo problema en el pasado y estoy compartiendo con ustedes nuestra solución.
#Observación#
- leí la respuesta de Yawad y lo encontré bueno y lo hemos probado cuando enfrentamos el problema.
- Mi comentario es que agregar
when: manual
siempre mostrará TODOS sus trabajos en la tubería. - Entonces, si trabaja en un equipo grande, no puede evitar que otros colaboradores hagan clic por error o por error en el trabajo que no desea que se inicie.
#Lo que estoy suponiendo antes de continuar#
- Digamos que tienes 4 trabajos.
- Necesita ejecutar siempre (manual o automáticamente)
job 1
,job 2
yjob 4
pero nojob3
. - Solo quieres correr
job 3
en un caso específico o simplemente cuando decidas ejecutarlo.
#La idea es #
-
Lanzamos el tercer trabajo solo para etiquetas que coincidan con una expresión regular.
-
En el siguiente ejemplo, se lanza para etiquetas como
helloTag.1
,helloTag.2
,helloTag.3
… etc -
si estamos en
develop
omaster
(u otra rama), tendremos 3 etapas (etapa 1, etapa 2, etapa 4)Tenga en cuenta cómo el tercer trabajo no está presente en la canalización
-
Vaya a “Repositorio” –> “Etiquetas” –> “Nueva etiqueta”
Asigne a la etiqueta un nombre que se parezca mucho a su expresión regular.
-
Si estamos en una etiqueta cuyo nombre comienza con “helloTag.”, tendremos 1 etapa (etapa 3)
Tenga en cuenta cómo otras etapas no están presentes aquí
#Ejemplo de .gitlab-ci
expediente#
stages:
- myStage1
- myStage2
- myStage3
- myStage4
This is my first stage:
stage: myStage1
before_script:
- echo "my stage 1 before script"
script:
- echo "my stage 1 script"
except:
- /^helloTag.*$/
This is my second stage:
stage: myStage2
before_script:
- echo "my stage 2 before script"
script:
- echo "my stage 2 script"
except:
- /^helloTag.*$/
This is my third stage:
stage: myStage3
before_script:
- echo "my stage 3 before script"
script:
- echo "my stage 3 script"
only:
- /^helloTag.*$/
This is my fourth stage:
stage: myStage4
before_script:
- echo "my stage 4 before script"
script:
- echo "my stage 4 script"
except:
- /^helloTag.*$/
Espero que esto te ayude.
Simplemente agregue un when: manual
a los trabajos que no desea ejecutar.
Estos trabajos seguirán apareciendo en su canalización, pero no se ejecutarán, a menos que alguien los inicie “manualmente” a través de la interfaz web, de ahí el nombre.
Aquí hay más información sobre esto: https://docs.gitlab.com/ce/ci/yaml/README.html#when
Si está buscando algo más “programable”, digamos que ejecute job1
o job2
dependiendo de un nombre de rama o una etiqueta, entonces debería echar un vistazo a la only
y except
palabras clave: https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except