GitLab CI: evite compilar al agregar una etiqueta

5 minutos de lectura

avatar de usuario de djna
djna

¿Cómo evito que se active una tubería gitlab ci cuando agrego una etiqueta git? Estoy ejecutando este comando localmente (a diferencia de un trabajo de gitlab-ci)

git tag -a "xyz"

y luego empujando la etiqueta; y esto desencadena varias canalizaciones. Quiero excluir la ejecución de algunas de esas canalizaciones.

Estoy probando variaciones de ideas a partir de preguntas como esta; esa pregunta esta usando solamente, Quiero excluir, así que intento excepto. Las respuestas allí tienen dos variantes, una con árbitros uno sin

build:  
  # ... my work here ...  
  except:
    - tags


build:  
  # ... my work here ...  
  except:
    refs:
      - tags

Ninguno parece tener ningún efecto; Agrego una etiqueta, la compilación aún sucede.

Mi comprensión puede estar completamente equivocada aquí, ya que parece haber tres posibles significados de la palabra etiquetas y cuando leo documentos o ejemplos, no siempre estoy seguro de qué significado es aplicable:

  1. Etiquetas Git aplicadas usando etiqueta git
  2. Etiquetas CI de Gitlab utilizadas para determinar qué corredores eligen un trabajo
  3. los árbitro identificador de una confirmación utilizada para desencadenar una canalización a través de la API REST. Este suele ser un nombre de rama, pero podría ser una etiqueta de git.

Me interesa controlar lo que pasa si es el primer caso. Parece claro a partir de los comentarios hasta ahora que “excepto: -etiquetas” no es relevante para mi caso, entonces, ¿hay algún enfoque que funcione?

  • Por docs.gitlab.com/ee/ci/yaml/#onlyexcept-basic esto se refiere a las etiquetas git. También puede ver información sobre la estrategia de referencias en esa página. Tenga en cuenta que habrá dos compilaciones para una confirmación etiquetada; uno para la confirmación, uno para la etiqueta.

    – jonrsharpe

    22 de febrero de 2020 a las 11:20


  • Gracias @jonrsharpe. Estoy de acuerdo en que eso es lo que dicen los documentos que es el sentido de “etiqueta”. ¿Hay alguna forma de evitar que estas compilaciones se deban a las etiquetas git?

    – djna

    22 de febrero de 2020 a las 20:58

  • Estas usando git tag -a TAG localmente y luego git push origin TAG? O el git tag El mando es parte de tu .gitlab-ci.yml trabajos ?

    – Nicolás Pepinster

    24 de febrero de 2020 a las 9:42

  • @Nicolas Pepinster: corriendo localmente y presionando, agregó esa aclaración

    – djna

    24 de febrero de 2020 a las 12:06

avatar de usuario de makozaki
makozaki

Except tags es exactamente lo que debe usar si desea omitir la creación de etiquetas.

Debe asegurarse de comprender el compromiso frente a las ramas frente a las etiquetas

Para ilustrar lo que sucede cuando presionas la confirmación etiquetada en gitlab, hice lo siguiente:

  1. Creado .gitlab-ci.yml con el siguiente contenido:
tests_always_run:
    script:
      - echo I should always execute
tests_except_tags:
    script:
      - echo I skip tagged triggers
    except:
      - tags
  1. Cambios confirmados, confirmados etiquetados y empujados con --follow-tags para asegurarse de que la etiqueta también se propague al servidor:
git add .gitlab-ci.yml
git commit -m 'my great yml with except tags'
git tag -a "abc" -m "Test tag"
git push --follow-tags

Resultados ilustrados:
Resultados de canalización de confirmación etiquetados

Si desea omitir CI para la confirmación seleccionada, puede usar git push -o ci.skipinspirado por Este artículo

avatar de usuario de diegosasw
diegosasw

Parece que GitLab recomienda usar rules en vez de except según la documentación

sólo y excepto no se están desarrollando activamente. rules es la palabra clave preferida para controlar cuándo agregar trabajos a las canalizaciones.

asi seria

your_job:
  stage: your_stage
  script:
    - echo "Hello"
  rules:
    - if: $CI_COMMIT_TAG
      when: never 
    - when: always

  • @diegosaw, gracias. Todavía estamos en v12 donde los documentos dicen: “Nota: la sintaxis de las reglas ahora es el método preferido para establecer políticas de trabajo. Solo y excepto son candidatos para la desaprobación y pueden eliminarse en el futuro”. Me alegro de que me hayas llamado la atención.

    – djna

    26 de junio de 2021 a las 5:47


Avatar de usuario de LeGEC
LeGEC

(nota: este es un comentario con formato más que una respuesta)

Para depurar las condiciones que desencadenan su canalización:

documento de gitlab menciona varias variables que se establecen cuando se ejecuta un trabajo de CI, entre las cuales:

  • CI_COMMIT_REF_NAME : El nombre de la rama o etiqueta para la que se construye el proyecto
  • CI_COMMIT_BRANCH : El nombre de la rama de confirmación. Presente solo al construir ramas.
  • CI_COMMIT_TAG : El nombre de la etiqueta de confirmación. Presente solo al crear etiquetas.

Haga que su trabajo de compilación genere algunas de estas variables (por ejemplo: echo "triggered by ref : " $CI_COMMIT_REF_NAME) para ver qué desencadenó su trabajo.

Yo estaba en la misma situación, mi solución fue esta:

Antes::
ANTES DE

Después:
DESPUÉS

Ambas etapas están configuradas en mi archivo .gitlab-ci.yml, con diferente nombre The “Pruebas unitarias de desarrollo“, solo se ejecuta cuando alguien se compromete con el repositorio, sin efecto en etiquetas y la rama”prueba

Dev-UnitTests:
  stage: pruebas 
  script:
    - mvn $MAVEN_CLI_OPTS test
  artifacts:
    when: always
    reports:
      junit: 
        - target/surefire-reports/*Test.xml
        - target/failsafe-reports/*Test.xml
      cobertura: target/site/jacoco/jacoco.xml
  tags:
    - shell 
  except: 
    - test 
    - tags   

los Pruebas unitarias solo se ejecuta cuando se realiza una fusión en la rama prueba

Unit Tests:
  stage: pruebas 
  script:
    - mvn $MAVEN_CLI_OPTS test
  artifacts:
    when: always
    reports:
      junit: 
        - target/surefire-reports/*Test.xml
        - target/failsafe-reports/*Test.xml
      cobertura: target/site/jacoco/jacoco.xml
  tags:
    - shell 
  only: 
    - test

Eso no volvió a ejecutar ningún pipeline al crear una etiqueta, espero que te ayude.

La clave es:

...
 except:  
    - tags   
...

¿Ha sido útil esta solución?