es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para ejecutar un trabajo de CI/CD solo para master y etiquetas, verificando además si existe el Dockerfile utilizando rules en GitLab CI.

    Para ejecutar un trabajo de CI/CD solo para master y etiquetas, verificando también si existe el Dockerfile utilizando rules en GitLab CI, se puede implementar la siguiente solución:

    build-images:
      stage: build
      image: docker:stable
      script:
        - docker info
        - |
          if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
            tag="latest"
            echo "Ejecutando en la rama predeterminada '$CI_DEFAULT_BRANCH'"
          else
            tag="$CI_COMMIT_TAG"
            echo "Ejecutando en la rama 'etiqueta/$CI_COMMIT_TAG'"
          fi
        - docker build --pull -t "$CI_REGISTRY_IMAGE/testing:${tag}" .
        - docker push "$CI_REGISTRY_IMAGE/testing:${tag}"
      rules:
        - if: $CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+(-\w+)?$/
        - if: '$CI_COMMIT_BRANCH == "$CI_DEFAULT_BRANCH" && $CI_COMMIT_TAG == null'
        - if: '$CI_COMMIT_BRANCH != "$CI_DEFAULT_BRANCH" && $CI_COMMIT_TAG != null'
        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    

    Explicación:

    El código anterior construye imágenes de Docker solo para master y etiquetas, verificando además si existe el Dockerfile utilizando rules. Las reglas son las siguientes:

    • Primera regla: if: $CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+(-\w+)?$/ verifica si CI_COMMIT_TAG coincide con un formato de versionado específico. En este ejemplo, estamos verificando si la etiqueta coincide con el formato x.x.x o x.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 rama master.

    • 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.

Comments are closed.