Reglas de GitLab solo para `master` y ‘etiquetas’
Estoy buscando una solución para ejecutar un trabajo de CI/CD solo para master
y tags
, pero al mismo tiempo me gustaría verificar si existe el archivo Dockerfile
, lo cual requiere el uso de rules
.
¿Qué quiero lograr?
Me gustaría construir imágenes de Docker solo para master
y tags
sin restricción a una notación de etiqueta específica.
Solía poder lograr algo así a través de only
.
gitlab-ci.yml
only:
- master
- tags
Desafortunadamente, con only
tendría que renunciar a mi verificación del “Dockerfile”, por lo que cambié a rules
.
Problema con `rules`
Sin embargo, el problema con rules
es que hasta ahora la única forma de resolver una solución aquí es mediante el uso de expresiones regulares. Esto limita considerablemente la convención para las etiquetas.
En mi ejemplo
0-9.0-9.0-9
Otras notaciones estarían prohibidas, como 1.0.0.1 o 1.0.0-alpha, que tendrían que definirse e implementarse por separado para cada proyecto.
¿No hay alguna opción para manejar esto de manera más elegante?
Build Images:
stage: Build
<<: *docker
<<: *registry
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG =~ "/[0-9].[0-9].[0-9]/g"
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag="latest"
echo "Ejecutando en rama predeterminada '$CI_DEFAULT_BRANCH'"
else
tag="$CI_COMMIT_TAG"
echo "Ejecutando en rama 'tag/$CI_COMMIT_TAG'"
fi<br>
- docker build --pull -t "$CI_REGISTRY_IMAGE/testing:${tag}" .
- docker push "$CI_REGISTRY_IMAGE/testing:${tag}"
Edit:
La línea `if: $CI_COMMIT_TAG =~ "/[0-9].[0-9].[0-9]/g"
no funciona correctamente.
davy.ai
Solución para ejecutar un trabajo de CI/CD solo para
master
yetiquetas
, verificando además si existe elDockerfile
utilizandorules
en GitLab CI.Para ejecutar un trabajo de CI/CD solo para
master
yetiquetas
, verificando también si existe elDockerfile
utilizandorules
en GitLab CI, se puede implementar la siguiente solución:Explicación:
El código anterior construye imágenes de Docker solo para
master
yetiquetas
, verificando además si existe elDockerfile
utilizandorules
. Las reglas son las siguientes:if: $CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+(-\w+)?$/
verifica siCI_COMMIT_TAG
coincide con un formato de versionado específico. En este ejemplo, estamos verificando si la etiqueta coincide con el formatox.x.x
ox.x.x-abc
. Esta regla asegura que solo se construyan etiquetas válidas.Segunda regla:
if: '$CI_COMMIT_BRANCH == "$CI_DEFAULT_BRANCH" && $CI_COMMIT_TAG == null'
verifica si la rama actual es la rama predeterminada (master
) y no hay una etiqueta asociada con el commit. Esta regla asegura que la imagen de Docker se construya solo cuando el código se fusiona con la ramamaster
.Tercera regla:
if: '$CI_COMMIT_BRANCH != "$CI_DEFAULT_BRANCH" && $CI_COMMIT_TAG != null'
verifica si la rama actual no es la rama predeterminada (master
) y hay una etiqueta asociada con el commit. Esta regla asegura que solo se construyan las etiquetas comprometidas en las ramas de características.Cuarta regla:
if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
verifica si la fuente del pipeline es un evento de solicitud de fusión. Esta regla asegura que el pipeline no se active para solicitudes de fusión.La sección
script
construye y empuja la imagen de Docker al Registro de Contenedores de GitLab.Nota: Esta solución asume que tienes el Registro de Contenedores de GitLab configurado y listo para tu proyecto. Además, el formato de versionado utilizado en el ejemplo es solo un ejemplo, puedes utilizar un formato diferente si lo prefieres.