Рекомендуемый порядок расположения блоков внутри job в .gitlab-ci.yml?
В GitLab CI/CD есть рекомендованный порядок, который улучшает читаемость и поддержку pipeline.
📌 Стандартный порядок блоков внутри job
job_name:
  extends: .some_template  # 1️⃣ Наследование (если есть)
  stage: build             # 2️⃣ Определение этапа
  tags:                    # 3️⃣ Теги для раннера (если нужны)
    - docker
  needs:                   # 4️⃣ Зависимости от других job'ов
    - previous_job
  variables:               # 5️⃣ Локальные переменные для job
    SOME_VAR: "value"
  before_script:           # 6️⃣ Подготовка окружения перед `script`
    - echo "Setting up environment..."
  script:                  # 7️⃣ Основной код
    - echo "Executing job..."
  after_script:            # 8️⃣ Завершающие действия (если нужны)
    - echo "Cleanup after job"
  artifacts:               # 9️⃣ Артефакты (если нужны)
    paths:
      - my_output/
    expire_in: 1 hour
  rules:                   # 🔟 Условия выполнения job
    - if: '$CI_COMMIT_BRANCH == "main"'
  allow_failure: false      # 1️⃣1️⃣ Позволять ли падение job
  retry: 2                 # 1️⃣2️⃣ Число повторных попыток
  timeout: 30m             # 1️⃣3️⃣ Лимит времени выполнения
📌 Разбор структуры
| Секция | Описание | 
|---|---|
extends: | 
Наследование от шаблонного job (если есть). | 
stage: | 
Назначение job к определенному этапу. | 
tags: | 
Указывает, на каких раннерах будет выполняться job. | 
needs: | 
Указывает зависимости от других job (если надо запустить job только после выполнения других). | 
variables: | 
Определяет переменные, видимые только внутри job. | 
before_script: | 
Выполняется один раз перед script: (установка окружения, логирование, авторизация и т. д.). | 
script: | 
Основной код job, выполняется после before_script:. | 
after_script: | 
Выполняется после script:, даже если script: упал. Подходит для логов, очистки файлов. | 
artifacts: | 
Определяет файлы, которые сохраняются после завершения job. | 
rules: | 
Условия выполнения job (например, только в main, только при изменениях в src/). | 
allow_failure: | 
Разрешает job завершаться с ошибкой (true → ошибки не остановят pipeline). | 
retry: | 
Число повторных попыток при падении job. | 
timeout: | 
Лимит времени выполнения job (например, 30m). | 
📌 Пример 1: Минимальная конфигурация job
Если у вас простой job, можно оставить только ключевые секции:
build_job:
  stage: build
  script:
    - echo "Building the project..."
✅ Минимально необходимый job: stage: + script:.
📌 Пример 2: Расширенная конфигурация job
Если job сложный, используем все ключевые блоки:
deploy_job:
  extends: .deploy_template
  stage: deploy
  tags:
    - production-runner
  needs:
    - build_job
  variables:
    DEPLOY_ENV: "production"
  before_script:
    - echo "Подготовка к деплою..."
  script:
    - echo "Выполняем деплой..."
  after_script:
    - echo "Очистка после деплоя..."
  artifacts:
    paths:
      - deploy_logs/
    expire_in: 1 day
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
  allow_failure: false
  retry: 2
  timeout: 20m
✅ Этот job должен выполниться ТОЛЬКО в main.
✅ Если job упадет, он попробует перезапуститься дважды (retry: 2).
✅ before_script: подготавливает окружение, а after_script: выполняет очистку.
📌 Итог
🚀 Оптимальный порядок блоков в job:
1️⃣ extends: (если используется)
2️⃣ stage:
3️⃣ tags: (если есть)
4️⃣ needs: (если job зависит от других job'ов)
5️⃣ variables: (локальные переменные)
6️⃣ before_script: (подготовка окружения)
7️⃣ script: (основная логика job)
8️⃣ after_script: (очистка, логи)
9️⃣ artifacts: (если нужны)
🔟 rules: (условия выполнения)
1️⃣1️⃣ allow_failure: (можно ли игнорировать ошибки)
1️⃣2️⃣ retry: (количество повторных попыток)
1️⃣3️⃣ timeout: (ограничение времени выполнения)