Ci/cd пайплайн: как настроить запуск тестов, линтера и сборки

Зачем вашему блогу вообще CI/CD, если он «просто сайт»

На практике блоги ломаются не реже сложных сервисов: одна неудачная правка Markdown, битая картинка или конфликт плагинов — и вместо статьи посетитель видит белый экран. По данным GitHub, более 60% инцидентов в небольших проектах связаны с «мелкими» правками без проверки. CI/CD для блога решает только одну задачу, но решает радикально: всё, что попадает в продакшен, сначала проходит через автоматические тесты, линтер и сборку. В результате вы перестаёте бояться кнопки «деплой», а экспериментировать становится проще: хоть по 5 релизов в день, система всё равно гоняет проверки за пару минут и отклоняет всё сомнительное ещё до сервера.

Архитектура пайплайна: от коммита до готового блога

Как создать CI/CD пайплайн, который запускает тесты, линтер и сборку - иллюстрация

Базовый сценарий выглядит так: вы пушите изменения в репозиторий, система CI ловит коммит и запускает цепочку шагов. Сначала ставятся зависимости, затем крутятся линтеры (например, ESLint и Stylelint для фронтенда, markdownlint для статей), дальше идут unit‑тесты и, при желании, визуальные скриншот‑тесты. Если всё зелёное, выполняется сборка блога (Next.js, Hugo, Gatsby — не важно) и выкладка на хостинг или S3‑совместимое хранилище с CDN. Такая cicd пайплайн настройка под ключ для блога легко укладывается в 3–7 минут даже на бесплатных раннерах, если не тянуть лишние зависимости и не собирать картинки заново каждый раз.

Технический блок: минимальный GitHub Actions для блога

```yaml
name: Blog CI

on:
push:
branches: [ main ]
pull_request:

jobs:
build-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run lint
- run: npm test -- --ci
- run: npm run build
- name: Deploy
if: github.ref == 'refs/heads/main'
run: npm run deploy
```

Такой файл покрывает базовые шаги: линтер, тесты, сборка и деплой. В реальных проектах сюда добавляют прогрев кеша, загрузку артефактов и нотификации в Slack.

Линтеры для статей: проверяем не только код, но и текст

Как создать CI/CD пайплайн, который запускает тесты, линтер и сборку - иллюстрация

Нет смысла гонять только JavaScript, если главный актив блога — тексты. Нестандартный, но очень полезный приём — включить в пайплайн линтеры для контента. Например, markdownlint поймает битые заголовки, отсутствие пробела после решётки, неправильные ссылки-якоря. Дополнительно можно включить yaspeller или hunspell для проверки орфографии на русском и английском: за один прогон вы отлавливаете опечатки и пропущенные буквы. На среднестатистическом блоге с 200–300 статьями это экономит десятки часов ручной вычитки, а главное — не даёт вернуться старым ошибкам при миграциях движка и массовых правках.

Технический блок: пример markdownlint + орфография

Как создать CI/CD пайплайн, который запускает тесты, линтер и сборку - иллюстрация

```yaml
- name: Lint markdown
run: |
npx markdownlint-cli2 "content/**/*.md"
- name: Spellcheck
run: |
npx yaspeller --config .yaspellerrc content
```

В конфиге yaspeller выносите список допустимых терминов, имён и названий библиотек. Через пару недель у вас получается небольшой «словарь проекта», который защищает статьи от массовых ложных срабатываний и делает проверки стабильнее.

GitHub vs GitLab: когда что выбрать и как смешать стэк

Если блог живёт в GitHub, проще всего стартовать с GitHub Actions — он глубоко интегрирован в экосистему, быстрее стартует и отлично подходит для open source. GitLab удобен, когда уже есть приватный GitLab‑сервер в компании: тогда настройка github gitlab ci cd тесты линтер сборка превращается в унификацию всех проектов, включая блог, через один шаблон .gitlab-ci.yml. Реальный лайфхак: хранить конфиг пайплайна для блога в отдельном репозитории-шаблоне и подключать его через include, чтобы любые изменения в процессах автоматически подтягивались во все связанные проекты без ручного копирования.

Нестандартное: превратим блог в полигон для DevOps‑экспериментов

Вместо того чтобы относиться к блогу как к «бедному родственнику», используйте его как тестовый стенд. Например, обкатывайте автоматизацию ci cd процессов в компании сначала на блоге: добавляйте новые шаги безопасности (SAST, сканирование зависимостей), экспериментируйте с кэшированием, прогревом CDN, canary‑деплоем. Блог проще сломать без серьёзных последствий, чем боевой монолит, а метрики те же: длительность пайплайна, процент упавших сборок, среднее время до восстановления. Так вы получите рабочую модель конвейера, а потом перенесёте её на основной продукт с минимальными рисками.

Технический блок: параллельные джобы и быстрые фидбеки

```yaml
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run lint

test-build:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm test -- --ci
- run: npm run build
```

Разделив линт и тесты/сборку на джобы, вы получаете первые результаты уже через 20–40 секунд, а не ждёте полной цепочки. Это особенно заметно при большом количестве pull request‑ов.

Нетипичная проверка: тестируем сами страницы блога как чёрный ящик

Помимо unit‑тестов полезно добавить end‑to‑end‑проверки, которые открывают сгенерированный сайт как обычный браузер. Cypress или Playwright поднимают статический сервер, кликают по меню, проверяют наличие поисковой строки и корректную отработку 404‑страницы. В продакшене это отлавливает до 80% «невидимых» ошибок: сломанные роуты, неправильные редиректы, забытые эксперименты с конфигом. Чтобы не увеличивать длительность пайплайна, можно запускать такие тесты только по ночам или перед релизом, а в каждую правку включать облегчённый набор из трёх-пяти самых критичных сценариев.

Когда имеет смысл подключить внешних экспертов

Если блог — часть коммерческого продукта или крупного медиа, ошибки дороже. В таких случаях логично рассматривать не только самостоятельную настройку, но и услуги по внедрению ci cd конвейера: за 2–4 недели команда DevOps может настроить пайплайн, логирование, мониторинг и обучение редакции работать через pull request‑ы. Формат может быть разным: от разового аудита конфигов до сопровождения релизов в течение нескольких месяцев. Важно понимать, что даже «идеальный» конвейер устаревает за 1–2 года, поэтому нужен план эволюции и периодический пересмотр практик, а не разовая магическая кнопка.

Консультации и эволюция пайплайна как постоянный процесс

По мере роста блога требования меняются: подключаются платные подписки, комментарии, поисковый движок. На этом этапе разовая консультация специалиста по ci cd и devops внедрению часто стоит дешевле, чем неделя экспериментов вслепую. Эксперт поможет определить, какие проверки оставить синхронными, а какие вынести в nightly‑джобы, где оправдан self-hosted runner, а где хватит облачного, какие метрики собрать, чтобы доказать бизнесу пользу пайплайна. Через год вы, скорее всего, перепишете часть шагов, но уже будете опираться на данные: сколько минут уходит на каждый этап, какой процент ошибок ловится на стадии линтинга, а какие прорываются до продакшена.

Прокрутить вверх