Что реализуют на этапе выборки (fetch) в CI/CD?

Ответ

На этапе выборки (fetch) в CI/CD-пайплайне происходит подготовка исходного кода и окружения для последующих стадий (сборки, тестирования, развертывания). Это фундаментальный шаг, от которого зависит успех всего пайплайна.

Основные задачи этапа:

  1. Клонирование/получение кода: Загрузка актуального кода из системы контроля версий (Git, SVN) по указанной ветке или тегу.
  2. Настройка контекста: Определение переменных окружения, параметров (например, номер коммита, ветка, автор).
  3. Восстановление зависимостей: Установка библиотек и инструментов, необходимых для работы проекта (например, через npm install, pip install -r requirements.txt, go mod download).

Пример секции в .gitlab-ci.yml:

stages:
  - fetch
  - test
  - deploy

# Этап выборки
fetch_dependencies:
  stage: fetch
  script:
    - echo "Fetching code for $CI_COMMIT_REF_NAME"
    - git fetch origin $CI_COMMIT_REF_NAME
    - git checkout -f $CI_COMMIT_SHA
    # Установка зависимостей для Node.js проекта
    - npm ci --cache .npm --prefer-offline
  artifacts:
    paths:
      - node_modules/
    expire_in: 1 hour

Почему это важно:

  • Изоляция: Каждый запуск пайплайна начинается с чистого состояния, что гарантирует воспроизводимость.
  • Эффективность: Кэширование артефактов (как node_modules в примере) ускоряет последующие запуски.
  • Надёжность: Сбой на этапе выборки (например, недоступность репозитория) сразу останавливает пайплайн, предотвращая выполнение некорректных операций.

Ответ 18+ 🔞

Э, слушай, а давай про эту самую выборку в пайплайнах поговорим, а? Этап, который все почему-то пропускают, а потом охуевают, когда всё падает. Типа, ну что там, git pull и поехали, да? Ага, щас.

Вот представь: у тебя конвейер, как на заводе. И первая операция — это не сборка двигателя, а привезти, блядь, запчасти со склада. И если вместо поршней тебе привезли, прости господи, манда с ушами, то что ты будешь собирать-то? Вот этап fetch — он и есть тот самый складской мужик, который должен притащить именно те исходники и зависимости, с которыми дальше работать.

Чё он делает, этот чувак?

  1. Код тащит. Не абы какой, а именно ту версию, которую ты сейчас закоммитил. По нужной ветке, с нужным тегом. Чтобы не вышло, что ты в main пушил, а пайплайн на dev гоняет — такое бывает, ёпта.
  2. Окружение настраивает. Выставляет все переменные, чтоб последующие шаги понимали, кто они, где они и что от них хотят. Номер коммита, автор (чтобы знать, кому предъявить, если всё накроется медным тазом) — всё тут.
  3. Зависимости ставит. А вот это, сука, самый интересный пункт. Это когда твой npm install или pip install решает, что сегодня он будет капризничать и тянуть пол-интернета, а в итоге выдаёт ошибку про какую-нибудь libssl-dev. Волнение ебать! На этом этапе это и ловят.

Смотри, как это в гите выглядит, на примере:

stages:
  - fetch
  - test
  - deploy

fetch_dependencies:
  stage: fetch
  script:
    - echo "Тащим код для ветки $CI_COMMIT_REF_NAME"
    - git fetch origin $CI_COMMIT_REF_NAME
    - git checkout -f $CI_COMMIT_SHA
    # Ставим зависимости для Node.js, чтоб потом не орать "а где модули?"
    - npm ci --cache .npm --prefer-offline
  artifacts:
    paths:
      - node_modules/
    expire_in: 1 hour

Видишь, в конце artifacts? Это гениальная штука. Он папку node_modules, которую только что наставил, запаковывает и говорит следующему этапу: «На, брат, не мучайся, всё уже готово». И следующий шаг не тратит полчаса на установку того же самого. Экономия времени — овердохуища.

А почему это, блядь, так важно?

  • Чистота. Каждый запуск начинается с нуля. Никаких левых файлов с прошлого билда, которые могут всё похерить. Полная изоляция.
  • Скорость. Засчёт кеширования тех же артефактов не нужно каждый раз качать всю вселенную. Всё уже тут, припасено.
  • Стойкость, мать его. Если репозиторий лег, или пакетный менеджер с ума сошёл, то пайплайн сдохнет сразу на этом этапе. А не потратит твои кредиты на облаке, чтобы собрать проект из битого кода и упасть на тестах. Доверия ебать ноль ко всему, что снаружи, вот принцип.

Короче, не халявь на fetch. Это тот фундамент, на котором всё стоит. Сделаешь его криво — получишь пизда рулю на самом интересном месте.