Как передать переменную между джобами в CI/CD пайплайне?

«Как передать переменную между джобами в CI/CD пайплайне?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Механизм зависит от используемой CI/CD-системы. Вот как я это делал в GitLab CI и Jenkins.

В GitLab CI: Основной способ — использование артефактов с типом dotenv. Переменные записываются в файл в одной джобе, а в зависимой джобе автоматически становятся переменными окружения.

stages:
  - prepare
  - deploy

prepare_vars:
  stage: prepare
  script:
    # Генерируем значение (например, динамический тег образа)
    - echo "IMAGE_TAG=${CI_COMMIT_SHORT_SHA}-$(date +%s)" >> build.env
  artifacts:
    reports:
      dotenv: build.env  # Ключевая директива

deploy_app:
  stage: deploy
  needs: ["prepare_vars"] # Указываем зависимость
  script:
    - echo "Deploying image with tag: $IMAGE_TAG" # Переменная доступна здесь
    # ... команды деплоя с использованием $IMAGE_TAG

В Jenkins (используя Declarative Pipeline): Для передачи простых значений можно использовать params или env, но для передачи файлов или сложных данных между этапами одного пайплайна используется stash/unstash.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    // Создаем файл с данными
                    writeFile file: 'metadata.json', text: "{ "version": "${env.BUILD_ID}" }"
                    // 'Запаковываем' файлы для передачи
                    stash name: 'build-artifacts', includes: 'metadata.json, target/*.jar'
                }
            }
        }
        stage('Test') {
            steps {
                // 'Распаковываем' файлы из предыдущей стадии
                unstash 'build-artifacts'
                script {
                    // Читаем переданный файл
                    def metadata = readJSON file: 'metadata.json'
                    echo "Testing version: ${metadata.version}"
                }
            }
        }
    }
}

Ключевые различия:

  • GitLab CI dotenv идеален для передачи набора переменных окружения.
  • Jenkins stash предназначен для передачи любых файлов и артефактов между этапами в рамках одного выполнения пайплайна (не сохраняется после его завершения). Для долгосрочного хранения артефактов используется archiveArtifacts.