Ответ
Механизм зависит от используемой 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.