Sobes.tech
Middle

Como transferir uma variável entre jobs no processo CI/CD?

sobes.tech IA

Resposta da IA

Para transferir variáveis entre jobs num processo CI/CD, geralmente usam-se artefactos ou variáveis de ambiente. Vejamos os métodos típicos:

  1. Artefactos: O job anterior guarda o valor da variável num ficheiro, que é declarado como artefacto. O próximo job faz o download deste artefacto e lê o valor do ficheiro. Adequado para grandes volumes de dados ou ficheiros.

    # .gitlab-ci.yml (exemplo Gitlab CI)
    job_producer:
      stage: build
      script:
        - echo "MY_VARIABLE_VALUE" > variable.txt
      artifacts:
        paths:
          - variable.txt
    
    job_consumer:
      stage: deploy
      dependencies:
        - job_producer
      script:
        - MY_VARIABLE=$(cat variable.txt)
        - echo "O valor da variável é: $MY_VARIABLE"
    
  2. Variáveis de ambiente: Alguns sistemas CI/CD permitem definir variáveis de ambiente para jobs subsequentes diretamente a partir do script do job atual.

    • Gitlab CI: Use artifacts:reports:dotenv.

      # .gitlab-ci.yml (exemplo com dotenv)
      job_producer:
        stage: build
        script:
          - echo "MY_VARIABLE=MY_VARIABLE_VALUE" > variables.env
        artifacts:
          reports:
            dotenv: variables.env
      
      job_consumer:
        stage: deploy
        needs:
          - job: job_producer
            artifacts: true # Garantir que os artefactos sejam carregados
        script:
          - echo "O valor da variável é: $MY_VARIABLE" # Variável disponível diretamente
      
    • Jenkins Pipeline: Use funções stash e unstash para ficheiros ou env para variáveis de ambiente.

      // Jenkinsfile (exemplo com env)
      pipeline {
          agent any
          stages {
              stage('Producer') {
                  steps {
                      script {
                          env.MY_VARIABLE = "MY_VARIABLE_VALUE"
                      }
                      echo "Definido MY_VARIABLE no producer: ${env.MY_VARIABLE}"
                  }
              }
              stage('Consumer') {
                  steps {
                      echo "Valor no consumer: ${env.MY_VARIABLE}" // Variável disponível
                  }
              }
          }
      }
      

      ou com stash/unstash:

      // Jenkinsfile (exemplo com stash/unstash)
      pipeline {
          agent any
          stages {
              stage('Producer') {
                  steps {
                      sh 'echo "MY_VARIABLE_VALUE" > variable.txt'
                      stash name: 'variable_file', includes: 'variable.txt'
                  }
              }
              stage('Consumer') {
                  steps {
                      unstash 'variable_file'
                      script {
                         def myVariable = readFile 'variable.txt'
                         echo "Valor no consumer: ${myVariable}"
                      }
                  }
              }
          }
      }
      
  3. APIs específicas de CI/CD: Algumas plataformas oferecem API para guardar e obter variáveis. É um método menos comum para casos padrão.

  4. Volume partilhado: Ao executar jobs no mesmo host ou cluster, pode-se usar um volume partilhado para armazenamento temporário de dados.

A escolha do método depende da plataforma CI/CD utilizada, bem como do tipo e volume de dados a transferir. Artefactos e variáveis de ambiente através de mecanismos específicos da plataforma (dotenv, set +e) são os métodos mais comuns e confiáveis.