CI/CD
Содержание
Что такое CI?
Коротко - главное это тесты в проекте, а потом уже предпочтения к окружению, желание после тестов деплоить на сервер. CI запускает тесты и ставит статусы каждому пушу. CI/CD это отдельные сервисы, которые у себя поднимают виртуалки и тестируют ваше приложения у себя, при этом выдавая инфу о происходящем.
Continuous Integration — это практика разработки программного обеспечения, которая заключается в слиянии рабочих копий в общую основную ветвь разработки несколько раз в день и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем. В обычном проекте, где над разными частями системы разработчики трудятся независимо, стадия интеграции является заключительной. Она может непредсказуемо задержать окончание работ. Переход к непрерывной интеграции позволяет снизить трудоёмкость интеграции и сделать её более предсказуемой за счет раннего обнаружения и устранения ошибок и противоречий. Основным преимуществом является сокращение стоимости исправления дефекта, за счёт раннего его выявления.
- Continuous Integration (CI)
- Continuous Delivery (CD)
- Continuous Deployment (CD)
Зачем это нужно?
В процессе работы мне часто приходится обновлять сервисы и разворачивать их на конечные сервера. Когда проектов было мало, это не составляло особых проблем, т.к. релизы были редкими, развертывания выполнялись довольно редко. Тесты выполнялись вручную. Со временем, проектов и задач становилось больше, и выполнение однотипных задач стало занимать больше времени. Рассмотрим классический процесс решения задачи, подходящий для большинства компаний:
- Берем задачу из списка/Получаем от начальства
- Создаем новую ветку в git и открываем пул реквест
- Пишем код
- Лично или с помощью коллеги выполняем код-ревью (code review — обзор/проверку кода)
- Запускаем тесты
- Сливаем ветку в мастер
- Выполняем сборку проекта
- Публикуем новую сборку
Этот процесс повторяется для каждой задачи, если вы 10 дней писали код и на сборку/развертывание потратили 1 час, то это выглядит разумно и не трудозатратно. Но что если вы поправили мелкий баг за 1 минуту, но на развертывание потратите тот же час? В этой ситуации это выглядит довольно расточительно. А если вам нужно выполнять в день 10 — 20 багфиксов (bugfix, исправление ошибки)?
Первый путь, укрупнять пул реквесты и делать объединение в мастер как можно реже. Второй путь настроить CI чтобы процесс тестирования/построения/развертывания выполнялся автоматически. Делать ревью больших пул реквестов неудобно, поэтому мы пойдем вторым путем.
Сервисы CI/CD
Пример
# .travis.yml
language: node_js
node_js:
- "8"
branches:
only:
- master
# .gitlab-ci.yml
# The configuration file starts by declaring a docker image that
# allows you to specify a certain version of NodeJS you want to use during build time.
image: node:latest
# we define the different continuous integration process it will run.
stages:
- build
- test
# we’ve defined the stages, the configuration includes a cache
# that specifies files that should be saved for later to be used between runs or stages.
cache:
paths:
- node_modules/
# install_dependencies, in the process of demonstrating the interaction between stages,
# we are extracting this step to run its own stage.
# Typically, running npm install can be combined with the next testing stages.
install_dependencies:
stage: build
script:
- npm install
artifacts:
paths:
- node_modules/
# testing_testing(you can name as u want) declares the command that will run the test suit,
# Since this is the last stage, it will access what
# is been produced by the build stage, which are the project dependencies in our case.
testing_testing:
stage: test
script: npm test