← Назад к вопросам

Как передавать переменную между джобами

2.0 Middle🔥 251 комментариев
#CI/CD и автоматизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Передача переменных между джобами в CI/CD

В контексте CI/CD-пайплайнов (GitLab CI, GitHub Actions, Jenkins и др.) передача переменных между джобами — это важная задача для организации зависимостей, обмена данными и управления состоянием пайплайна. Основные подходы различаются в зависимости от используемой платформы, но общая идея заключается в персистентном хранении данных между независимыми этапами выполнения.

Основные стратегии передачи данных

1. Использование артефактов (Artifacts)

Наиболее распространённый и надёжный способ — запись переменной в файл в одной джобе и передача этого файла как артефакта в следующую джобу.

Пример в GitLab CI:

stages:
  - build
  - test

build_job:
  stage: build
  script:
    # Генерируем значение и сохраняем в файл
    - echo "BUILD_VERSION=1.2.3" > build.env
  artifacts:
    paths:
      - build.env
    expire_in: 1 hour

test_job:
  stage: test
  script:
    # Загружаем артефакт и экспортируем переменные
    - source build.env
    - echo "Testing version $BUILD_VERSION"
  dependencies:
    - build_job

Пример в GitHub Actions:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Set variable
        run: echo "VALUE=production" >> $GITHUB_ENV
      - name: Save variable to file
        run: echo "${{ env.VALUE }}" > deployment.txt
      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: config
          path: deployment.txt
          
  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Download artifact
        uses: actions/download-artifact@v3
        with:
          name: config
      - name: Read variable
        run: |
          DEPLOY_ENV=$(cat deployment.txt)
          echo "Deploying to $DEPLOY_ENV"

2. Использование кэша (Cache)

Кэш подходит для передачи данных, которые могут быть повторно использованы, но не являются критически важными (например, зависимости, промежуточные результаты).

# GitLab CI пример с кэшированием
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - cached_data.txt

job1:
  script:
    - echo "cached_value=100" > cached_data.txt
    
job2:
  script:
    - if [ -f cached_data.txt ]; then source cached_data.txt; fi
    - echo "Value is $cached_value"

3. Использование workflow-переменных (GitHub Actions) или pipeline variables (GitLab CI)

Некоторые системы предоставляют встроенные механизмы для передачи данных между джобами.

GitHub Actions (outputs/inputs):

jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      output_var: ${{ steps.set-output.outputs.test_var }}
    steps:
      - id: set-output
        run: echo "test_var=hello_world" >> $GITHUB_OUTPUT
        
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo "Received ${{ needs.job1.outputs.output_var }}"

GitLab CI (dotenv artifacts):

generate_vars:
  stage: build
  script:
    - echo "DEPLOY_URL=https://example.com" >> deploy.env
  artifacts:
    reports:
      dotenv: deploy.env

use_vars:
  stage: deploy
  script:
    - echo "Deploying to $DEPLOY_URL"  # Переменная доступна автоматически!
  needs:
    - job: generate_vars
      artifacts: true

4. Внешние хранилища

Для сложных сценариев или межпайплайнового взаимодействия используются внешние системы:

  • Хранилища ключ-значение: Redis, Consul, etcd
  • Файловые хранилища: S3, MinIO, NFS
  • Базы данных: PostgreSQL, MySQL
  • Секретные менеджеры: HashiCorp Vault, AWS Secrets Manager

Пример с Redis:

# В первой джобе
redis-cli -h redis.example.com set build_status "SUCCESS"

# Во второй джобе
STATUS=$(redis-cli -h redis.example.com get build_status)
echo "Build status: $STATUS"

Ключевые принципы и рекомендации

  1. Безопасность: Никогда не передавайте секреты через артефакты или кэш без шифрования
  2. Идемпотентность: Данные должны быть согласованными при повторных запусках
  3. Зависимости: Чётко определяйте зависимости между джобами через needs (GitLab) или dependencies
  4. Очистка: Настраивайте TTL (time-to-live) для артефактов и кэша
  5. Объём данных: Для больших данных используйте внешние хранилища, а не артефакты

Сравнение подходов

МетодПлюсыМинусыЛучший сценарий
АртефактыНативно поддерживается, надёжноОграничения по размеру, время жизниПередача конфигов, метаданных
КэшБыстрый доступ, экономия ресурсовНе гарантируется актуальностьЗависимости, промежуточные билды
Workflow переменныеПростая интеграция, типизацияОграниченный объём, специфично для платформыПростые строковые значения
Внешние хранилищаГибкость, масштабируемостьСложность настройки, дополнительные затратыМежпайплайновое взаимодействие

Выбор конкретного метода зависит от требований безопасности, объёма данных, необходимости персистентности и особенностей вашей CI/CD-платформы. В большинстве случаев артефакты с dotenv-файлами или workflow переменные являются оптимальным выбором для типовых сценариев передачи переменных между джобами.