Sobes.tech
Middle

Как да прехвърлите променлива между задачи в процеса CI/CD?

sobes.tech AI

Отговор от AI

В процеса на CI/CD обикновено се използват артефакти или променливи на околната среда за прехвърляне на променливи между задачите. Нека разгледаме типичните методи:

  1. Артефакти: Предишната задача запазва стойността на променлива във файл, който се обявява като артефакт. Следващата задача изтегля този артефакт и чете стойността от файла. Подходящо за големи обеми данни или файлове.

    # .gitlab-ci.yml (пример за 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 "Стойността на променливата е: $MY_VARIABLE"
    
  2. Променливи на околната среда: Някои системи за CI/CD позволяват директно от скрипта на текущата задача да се задават променливи за следващите задачи.

    • Gitlab CI: Използвайте artifacts:reports:dotenv.

      # .gitlab-ci.yml (пример с 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 # Уверете се, че артефактите са заредени
        script:
          - echo "Стойността на променливата е: $MY_VARIABLE" # Променливата е налична директно
      
    • Jenkins Pipeline: Използвайте функциите stash и unstash за файлове или env за променливи на околната среда.

      // Jenkinsfile (пример с env)
      pipeline {
          agent any
          stages {
              stage('Producer') {
                  steps {
                      script {
                          env.MY_VARIABLE = "MY_VARIABLE_VALUE"
                      }
                      echo "Зададен MY_VARIABLE в продюсера: ${env.MY_VARIABLE}"
                  }
              }
              stage('Consumer') {
                  steps {
                      echo "Стойността в консумира: ${env.MY_VARIABLE}" // Променливата е налична
                  }
              }
          }
      }
      

      или с stash/unstash:

      // Jenkinsfile (пример с 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 "Стойността в консумира: ${myVariable}"
                      }
                  }
              }
          }
      }
      
  3. API, специфични за CI/CD: Някои платформи предоставят API за съхраняване и получаване на променливи. Това е по-рядко срещано за стандартните случаи.

  4. Общ обем: Ако задачите се изпълняват на един и същ хост или клъстер, може да се използва общ обем за временна съхранение на данни.

Изборът на метод зависи от използваната платформа за CI/CD, типа и обема на пренасяните данни. Артефактите и променливите на околната среда чрез специални механизми на платформата (dotenv, set +e) са най-разпространените и надеждни подходи.