Как настроить CI/CD пайплайн?

Ответ

Настройка CI/CD пайплайна зависит от выбранного инструмента (Jenkins, GitLab CI/CD, GitHub Actions, CircleCI), но общая структура схожа. Я обычно начинаю с определения этапов и триггеров.

Основные этапы типичного пайплайна:

  1. Сборка (Build): Компиляция кода, сборка Docker-образа.
  2. Тестирование (Test): Запуск unit-тестов, интеграционных тестов, статического анализа кода (linting).
  3. Деплой (Deploy): Развертывание в staging-окружение, а затем, после ручного или автоматического подтверждения, в production.

Пример .gitlab-ci.yml для приложения на Go с деплоем в Kubernetes:

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: golang:1.21
  script:
    - go build -o myapp ./cmd/app
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  artifacts:
    paths:
      - myapp

test:
  stage: test
  image: golang:1.21
  script:
    - go test ./... -v
    - go vet ./...

deploy-staging:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/myapp myapp=$DOCKER_IMAGE -n staging
  only:
    - main
  environment:
    name: staging
    url: https://staging.myapp.com

Ключевые практики, которые я применяю:

  • Хранение секретов: Использую встроенные секреты инструмента (GitLab CI Variables, GitHub Secrets) для хранения токенов, паролей и kubeconfig.
  • Кэширование: Настраиваю кэш для зависимостей (например, ~/.cache/go, node_modules) для ускорения сборок.
  • Артефакты: Передаю результаты сборки (бинарники, образы) между джобами.
  • Уведомления: Интегрирую пайплайн с Slack или Teams для оповещений об успешных/неудачных сборках.
  • Откат (Rollback): Готовлю скрипт или конфигурацию для быстрого отката к предыдущей версии образа в Kubernetes (kubectl rollout undo).

Ответ 18+ 🔞

Слушай, ну это ж классика, ебать мои старые костыли. Настраивать пайплайн — это как собирать мешок с еблами: вроде всё просто, но если накосячить, то потом овердохуища проблем вылезет. Но если по делу, то схема-то везде примерно одна и та же, хоть в Jenkins, хоть в GitLab, хоть в этих ваших GitHub Actions.

Основные этапы, которые тебе не обойти:

  1. Сборка (Build): Тут всё ясно — берёшь код и делаешь из него что-то работающее. Собираешь бинарник, лепишь Docker-образ, ну ты понял.
  2. Тестирование (Test): А вот это уже интереснее. Тут надо всё проверить: unit-тесты прогнать, линтером пройтись, чтобы код не выглядел как пиздопроебибна. Если этот этап провален — дальше идти смысла ноль ебать.
  3. Деплой (Deploy): Ну а тут уже выкатываем наше творение. Сначала на тестовое окружение (staging), чтобы не устроить хиросиму на проде, а потом, если всё ок, — на боевое.

Вот тебе пример конфига для GitLab CI, чтоб было понятнее, о чём речь. Смотри, тут приложение на Go, которое потом в Kubernetes засунуть надо.

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: golang:1.21
  script:
    - go build -o myapp ./cmd/app
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  artifacts:
    paths:
      - myapp

test:
  stage: test
  image: golang:1.21
  script:
    - go test ./... -v
    - go vet ./...

deploy-staging:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/myapp myapp=$DOCKER_IMAGE -n staging
  only:
    - main
  environment:
    name: staging
    url: https://staging.myapp.com

А теперь, чувак, главные фишки, без которых ты просто распиздяй:

  • Секреты: Никогда, блядь, не пиши пароли или токены прямо в конфиг! Это уровень «сам от себя охуел». Используй специальные переменные в самом инструменте (GitLab CI Variables, GitHub Secrets). Спрячь это добро туда.
  • Кэширование: Если не хочешь, чтобы каждая сборка длилась как будто на дворе 2002-й год, кэшируй зависимости. Кэш для ~/.cache/go или node_modules — твой лучший друг. С ним сборки летают.
  • Артефакты: Чтобы не пересобирать одно и то же десять раз, передавай результаты между этапами. Собрал бинарник на одном шаге — отдай его на тестирование, а потом и на деплой.
  • Уведомления: Настрой оповещения в Slack или Teams. Чтобы ты не сидел как дурак и не обновлял страницу каждые пять секунд, а тебе прилетало сообщение: «Всё ок» или «Ёпта, всё накрылось медным тазом, иди смотри логи».
  • Откат (Rollback): Это святое. Всегда имей наготове план «Б». В случае, если на проде всё пошло по пизде, ты должен уметь откатиться к прошлой версии одной командой. В Kubernetes это kubectl rollout undo. Без этого ты ходишь по охуенно тонкому льду, поверь.