Ответ
CI/CD — это методология и набор практик в разработке ПО, направленные на автоматизацию сборки, тестирования и развертывания приложений. Это позволяет командам выпускать качественный софт быстрее и надёжнее.
CI (Continuous Integration — Непрерывная интеграция)
Это практика частой автоматической интеграции кода от разных разработчиков в общую кодовую базу.
- Цель: Раннее обнаружение конфликтов слияния, ошибок компиляции и багов в тестах.
- Процесс:
- Разработчик отправляет (push) изменения в свою ветку.
- Создает Pull/Merge Request в основную ветку (
mainилиdevelop). - Система CI автоматически запускает сборку проекта, прогоняет линтеры и юнит-тесты.
- Если все проверки пройдены, код можно безопасно вливать.
CD (Continuous Delivery / Deployment — Непрерывная доставка / развертывание)
Это следующий шаг после CI, который автоматизирует выпуск готового продукта.
-
Цель: Сделать процесс релиза быстрым, надёжным и предсказуемым.
-
Процесс:
- После успешного прохождения CI создаётся артефакт (например, бинарный файл Go или Docker-образ).
- Этот артефакт автоматически развертывается на тестовое (staging) окружение для дальнейшего тестирования (интеграционного, E2E).
-
Continuous Delivery (Непрерывная доставка): После всех тестов релиз в production требует ручного подтверждения (нажатия кнопки).
-
Continuous Deployment (Непрерывная развертывание): Релиз в production происходит полностью автоматически без вмешательства человека, если все этапы пройдены успешно.
Пример простого CI-пайплайна для Go в .github/workflows/ci.yml:
name: Go CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. Получаем исходный код
- uses: actions/checkout@v4
# 2. Устанавливаем нужную версию Go
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
# 3. Запускаем тесты
- name: Test
run: go test -v ./...
# 4. Собираем приложение
- name: Build
run: go build -v -o myapp ./cmd/server Ответ 18+ 🔞
Давай я тебе на пальцах объясню, что это за зверь такой — CI/CD. Представь, что ты пишешь код, а потом тебе надо его куда-то засунуть, чтобы он работал. Без CI/CD это выглядит как поход в лес срать: долго, неудобно, и можно наступить в говно.
CI (Continuous Integration — Непрерывная интеграция)
Это когда твои потуги в коде постоянно и автоматически проверяются, чтобы не вышло как в том анекдоте: «Один чувак написал, второй переписал, а третий пришёл — нихуя не работает, все друг друга обвиняют».
- Суть: Ты отправил код в общую кучу (репозиторий), а система тут же, как злая училка, начинает его проверять: компилируется ли? Тесты проходят? Другим код не сломала? Если всё ок — можно сливать. Если нет — получаешь по шапке сразу, а не через месяц на проде.
- Процесс, ёпта:
- Ты запилил фичу и толкаешь её в свою ветку.
- Создаёшь пулл-реквест, типа «эй, народ, гляньте, какую хуйню я написал».
- Система CI автоматом собирает проект, прогоняет тесты и линтеры.
- Если зелёная галочка — можно вливать, не стесняясь. Если красный крест — сиди, мудак, исправляй.
CD (Continuous Delivery / Deployment — Непрерывная доставка / развёртывание)
А это уже магия. CI проверил, что код не сломан, а CD берёт эту проверенную хуйню и тащит её туда, где она должна работать. Разница в одном шаге.
- Цель: Чтобы релиз был не как полёт в космос с молитвами, а как поход в туалет — быстро и без сюрпризов.
- Процесс:
- После CI у тебя есть готовый артефакт — собранная программа или Docker-образ.
- Этот артефакт автоматом выкатывается на тестовое окружение (staging), где его ещё потыкают палкой.
- Вот тут тонкость, блядь:
- Continuous Delivery (Доставка): Всё автоматически докатилось до самого края — до кнопки «Выпустить в продакшен». Но чтобы нажать эту кнопку, нужен человек. Для трусов.
- Continuous Deployment (Развёртывание): А вот это для отбитых. Если все тесты прошли — система, не спросив ни у кого разрешения, сама выкатывает твой код на боевые сервера. Проснулся утром — а твой код уже работает. Или не работает. Но это уже твои проблемы, чувак.
Пример простейшего CI-пайплайна для Go (файл .github/workflows/ci.yml):
Смотри, как это выглядит под капотом. Код не трогаю, он святой.
name: Go CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. Выкачиваем код из гита
- uses: actions/checkout@v4
# 2. Ставим Go нужной версии
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
# 3. Гоняем тесты. Если упадут — всё, пиши пропало.
- name: Test
run: go test -v ./...
# 4. Собираем бинарь на всякий случай
- name: Build
run: go build -v -o myapp ./cmd/server
Короче, если без этой всей автоматизации — это как строить дом вручную, а с CI/CD — как нажать кнопку и получить готовый небоскрёб. Ну, или груду кирпичей, если в коде говно. Но узнаешь-то ты об этом сразу, а не когда жильцы начнут жаловаться.