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

Как сделать повторяющиеся джобы в Gitlab CI

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

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

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

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

Организация повторяющихся джобов в Gitlab CI

В GitLab CI/CD существует несколько стратегий для создания повторяющихся джобов, которые позволяют избежать дублирования кода, упростить поддержку и обеспечить единообразие выполнения задач. Основные подходы включают использование шаблонов джоб (job templates), якорей (anchors), extends, скрытых джобов (hidden jobs) и include.

1. Использование директивы extends (рекомендуемый способ)

Директива extends позволяет наследовать конфигурацию одной джобы от другой. Это наиболее гибкий и читаемый подход.

.base_job:
  script:
    - echo "Выполняю базовые шаги"
    - run_tests
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

test:unit:
  extends: .base_job
  script:
    - echo "Запуск юнит-тестов"
    - pytest tests/unit/

test:integration:
  extends: .base_job
  script:
    - echo "Запуск интеграционных тестов"
    - pytest tests/integration/
  needs: []

2. Якоря (anchors) и алиасы

Якоря позволяют определить повторяющиеся блоки конфигурации и ссылаться на них в разных местах.

.base_config: &base_config
  image: python:3.9
  before_script:
    - pip install -r requirements.txt
  after_script:
    - echo "Job completed"

lint:
  <<: *base_config
  script:
    - flake8 .

test:
  <<: *base_config
  script:
    - pytest

3. Скрытые джобы (hidden jobs)

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

.deploy_template:
  stage: deploy
  script:
    - deploy_prepare
    - deploy_execute
  rules:
    - if: $CI_COMMIT_TAG

deploy:staging:
  extends: .deploy_template
  variables:
    ENVIRONMENT: staging
  script:
    - echo "Деплой на staging"
    - *deploy_template_script

deploy:production:
  extends: .deploy_template
  variables:
    ENVIRONMENT: production
  only:
    - tags

4. Внешние конфигурации через include

Для управления повторяющимися джобами в больших проектах можно выносить общие шаблоны в отдельные файлы.

.gitlab-ci/common.yml:

.base_test:
  stage: test
  image: node:16
  cache:
    paths:
      - node_modules/

.unit_tests:
  extends: .base_test
  script:
    - npm test

.gitlab-ci.yml:

include:
  - local: '.gitlab-ci/common.yml'

frontend_tests:
  extends: .unit_tests
  variables:
    TEST_SUITE: frontend

backend_tests:
  extends: .unit_tests
  image: python:3.9
  variables:
    TEST_SUITE: backend

5. Динамические джобы с rules и variables

Для сложных сценариев можно комбинировать правила и переменные.

.deploy_job:
  stage: deploy
  script:
    - echo "Деплой в $ENVIRONMENT"
    - deploy.sh $ENVIRONMENT
  rules:
    - if: $DEPLOY_ENVIRONMENTS

deploy:development:
  extends: .deploy_job
  variables:
    ENVIRONMENT: development
  rules:
    - if: $CI_COMMIT_BRANCH == "develop"

deploy:production:
  extends: .deploy_job
  variables:
    ENVIRONMENT: production
  rules:
    - if: $CI_COMMIT_TAG

6. Параметризация через parallel:matrix

GitLab 13.3+ поддерживает параметризацию джоб для параллельного выполнения с разными переменными.

test:parallel:
  stage: test
  script:
    - echo "Testing $DB $VERSION"
    - run_tests --db $DB --version $VERSION
  parallel:
    matrix:
      - DB: [postgresql, mysql, sqlite]
        VERSION: ["1.0", "2.0"]

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

  • Приоритет подходов: extends > anchors > копирование кода
  • Поддержка читаемости: Используйте понятные имена для шаблонов (.base_test, .deploy_template)
  • Избегайте излишней абстракции: Не создавайте сложные шаблонные системы для простых проектов
  • Комбинируйте подходы: Можно использовать extends вместе с include для максимальной гибкости
  • Документирование: Комментируйте назначение шаблонов в корневом .gitlab-ci.yml

Правильная организация повторяющихся джобов значительно упрощает поддержку CI/CD, уменьшает количество ошибок и ускоряет добавление новых задач в конвейер. Начинайте с простых шаблонов и усложняйте архитектуру по мере роста проекта.