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.

GitLab pasa los valores de un Pipeline hijo al Pipeline padre.

Tengo un monorepo en el que cada paquete debe ser construido como un docker, y cuando todos los paquetes modificados sean ‘dockerizados’, quiero implementarlos usando helmfile.

He creado un trabajo de activación para cada paquete que activa un pipeline secundario.

Estoy buscando una manera de obtener los valores que se generan en el pipeline secundario, como la etiqueta de Docker o la versión del gráfico, en el pipeline principal.

Necesito esos valores para la fase de implementación que ocurre después de que se completen todos los pipelines secundarios.

.gitlab-ci.yml

---
trigger-package-a:
  stage: construir
  trigger:
    include: .gitlab/ci/packages/package-gitlab-ci.yml
    strategy: depend
  rules:
   - cambios:
      - "packages/package-a/**/*"
  variables:
    PACKAGE: package-a

trigger-package-b:
  stage: construir
  trigger:
    include: .gitlab/ci/packages/package-gitlab-ci.yml
    strategy: depend
  rules:
    - cambios:
      - "packages/package-b/**/*"
  variables:
    PACKAGE: package-b

done_job:
  stage: implementar
  script:
    - "echo LISTO"
    - "cat config.json"
stages:
  - construir
  - implementar

package-gitlab-ci.yml

stages:
  - inicializar
  - validar

cache:
  key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
  paths:
    - packages/${PACKAGE}/node_modules/
  policy: pull

install-package:
  stage: inicializar
  script:
    - echo ${PACKAGE}}
    - echo '{"paquete":${PACKAGE}}' > config.json
    - "cd packages/${PACKAGE}/"
    - yarn install --frozen-lockfile
  artifacts:
    paths:
      - config.json
  cache:
    key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
    paths:
     - packages/${PACKAGE}/node_modules/
    policy: pull-push

lint-package:
  script:
   - yarn lint
  stage: validar
  needs: [install-package]
  before_script:
   - "cd packages/${PACKAGE}/"
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los valores generados en el pipeline hijo, como la etiqueta de Docker o la versión de un gráfico, en el pipeline padre, puedes utilizar los artefactos y variables en GitLab CI/CD.

    En el pipeline hijo, puedes definir una variable para almacenar el valor de la etiqueta de Docker o la versión del gráfico, y luego utilizar los artefactos para pasar ese valor al pipeline padre. Por ejemplo:

    package-gitlab-ci.yml

    stages:
      - bootstrap
      - validate
    
    cache:
      key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
      paths:
        - packages/${PACKAGE}/node_modules/
      policy: pull
    
    variables:
      DOCKER_TAG: ''
    
    install-package:
      stage: bootstrap
      script:
        - echo ${PACKAGE}
        - echo '{"package":${PACKAGE}}' > config.json
        - cd packages/${PACKAGE}/
        - yarn install --frozen-lockfile
        - export DOCKER_TAG=$(echo "$CI_COMMIT_SHA" | cut -c1-8)
      artifacts:
        paths:
          - config.json
        variables:
          DOCKER_TAG: $DOCKER_TAG
      cache:
        key: "${PACKAGE}_${CI_COMMIT_REF_SLUG}"
        paths:
          - packages/${PACKAGE}/node_modules/
        policy: pull-push
    
    lint-package:
      script:
        - yarn lint
      stage: validate
      needs: [install-package]
      before_script:
        - cd packages/${PACKAGE}/
    

    En el pipeline padre, puedes utilizar la palabra clave needs para esperar a que todos los pipelines hijos finalicen, luego utilizar la palabra clave artifacts para descargar el artefacto y obtener el valor de la etiqueta de Docker o la versión del gráfico. Por ejemplo:

    .gitlab-ci.yml

    ---
    trigger-package-a:
      stage: build
      trigger:
        include: .gitlab/ci/packages/package-gitlab-ci.yml
        strategy: depend
      rules:
        - changes:
            - "packages/package-a/**/*"
      variables:
        PACKAGE: package-a
    
    trigger-package-b:
      stage: build
      trigger:
        include: .gitlab/ci/packages/package-gitlab-ci.yml
        strategy: depend
      rules:
        - changes:
            - "packages/package-b/**/*"
      variables:
        PACKAGE: package-b
    
    done_job:
      stage: deploy
      needs:
        - trigger-package-a
        - trigger-package-b
      script:
        - echo DONE
        - cat config.json
        - export PACKAGE_A_DOCKER_TAG=$(cat ./packages/package-a/config.json | jq -r '.DOCKER_TAG')
        - export PACKAGE_B_DOCKER_TAG=$(cat ./packages/package-b/config.json | jq -r '.DOCKER_TAG')
        - echo "Package A Docker Tag: $PACKAGE_A_DOCKER_TAG"
        - echo "Package B Docker Tag: $PACKAGE_B_DOCKER_TAG"
      artifacts:
        when: on_success
        paths:
          - packages/*/config.json
        expire_in: 1 hour
      stages:
        - build
        - deploy
    

    En el pipeline padre, el trabajo done_job espera a que los pipelines hijos finalicen utilizando la palabra clave needs. Luego, descarga el artefacto utilizando la palabra clave artifacts y obtiene el valor de la etiqueta de Docker o la versión del gráfico utilizando el comando jq. Finalmente, puedes exportar los valores como variables de entorno y utilizarlos en la fase de implementación del pipeline padre.

Comments are closed.