Более быстрый CI / CD

Buddy - это инструмент непрерывной интеграции, доставки и развертывания, который использует преимущества Git для обеспечения удобного и настраиваемого взаимодействия при настройке конвейеров для автоматизации задач репозитория.

Конвейеры Buddy состоят из набора действий, определенных разработчиком, которые выполняются в определенном порядке и могут выполняться вручную или автоматически при выполнении Git push. Визуальный подход также позволяет новичкам и экспертам DevOps легко настраивать полнофункциональные конвейеры в кратчайшие сроки.

В этой статье мы настроим конвейер непрерывной доставки для приложения Golang. Конвейер поможет нам достичь двух целей:

  1. Более быстрый процесс разработки за счет стандартизованного цикла обратной связи при разработке.
  2. Более безопасное развертывание за счет снижения риска ошибок вручную

Мы сделаем это, построив конвейер, который сначала тестирует приложение, а затем создает образ контейнера Docker (если тесты прошли успешно). Затем образ Docker будет извлечен и запущен в капле DigitalOcean. Мы также будем отправлять уведомления с последним статусом сборки участникам, работающим над проектом, через Slack и по электронной почте.

Действия, используемые в этом руководстве:

Шаг 1. Начало работы

Чтобы следовать этому руководству, убедитесь, что у вас установлены следующие инструменты:

  1. Голанг - чтобы вы могли запускать и тестировать приложение локально.
  2. DigitalOcean CLI - чтобы вы могли настроить все ресурсы DigitalOcean, необходимые для конвейера (также можно сделать с помощью графического интерфейса).
  3. Docker - устанавливается на локальную машину разработчика для контейнерной обработки и запуска нашего приложения.

Протестируйте приложение

В этой статье мы будем использовать существующий проект, размещенный на GitHub, что упрощает изучение статьи. Приложение представляет собой очень простой HTTP-сервер, использующий стандартную библиотеку net/http Golang с двумя конечными точками GET, которые отображают некоторый жестко закодированный текст.

Это нормально, если вы хотите использовать вместо этого собственное приложение, но имейте в виду, что некоторые команды и каталоги в действиях могут измениться.

Начнем с клонирования приложения из GitHub и его локального запуска:

$ git clone https://github.com/buddy-works/learning-go.git 
$ cd learning-go/beginner-programs/HttpServer/

Теперь приложение можно запустить с помощью команды go run:

$ git run main.go

Теперь вы можете получить доступ к приложению по адресу localhost:8080. Вы должны увидеть простую веб-страницу с надписью «Hello World!».

Dockerize приложение

Чтобы развернуть приложение как контейнер, нам нужно создать Dockerfile, содержащий определения нашего образа Docker.

Я включил Dockerfile в корневой каталог проекта HttpServer. Вот содержание:

Каждая строка в файле соответствует одному шагу в процессе создания образа Docker. Давайте пройдемся по нему, чтобы лучше понять:

  • Первая строка определяет базовое изображение, с которого запускается контейнер, с использованием ключевого слова FROM, за которым следует желаемое изображение и версия (в данном случае версия 1.15.0 официального образа Golang).
  • После этого мы устанавливаем текущий рабочий каталог с помощью ключевого слова WORKDIR и включаем модули Go, задав для переменной GO111MODULE значение on.
  • Ключевое слово COPY позволяет нам копировать файлы из хост-системы в контейнер. Здесь мы используем его для копирования файлов go.mod и go.sum в контейнер, чтобы мы могли установить все необходимые зависимости с помощью команды go mod download.
  • Установив все зависимости, мы можем продолжить, скопировав оставшиеся файлы в контейнер и собрав приложение с помощью команды go build. Это даст нам исполняемый файл, который мы можем запустить с помощью ключевого слова CMD.

Запуск образа Docker

Теперь образ Docker можно создать и запустить с помощью следующей команды:

$ docker build -t httpserver . 
$ docker run -p 8080:8080 httpserver

Команда build создаст образ Docker, выполнив шаги, которые мы определили в Dockerfile. Флаг -t используется для присвоения образу Docker определенного тега. После успешного построения образа можно использовать команду run для запуска контейнера. Флаг-p используется для публикации порта 8080 контейнера на порт 8080 хост-машины. Откройте http://localhost:8080 в браузере и убедитесь, что приложение работает правильно.

Шаг 2. Настройте ресурсы DigitalOcean.

Прежде чем мы начнем строить конвейер CI / CD, давайте начнем с настройки необходимых ресурсов DigitalOcean и установки необходимых инструментов. Для создания ресурсов мы будем использовать интерфейс командной строки DigitalOcean, также известный как doctl.

Запустите терминал и авторизуйтесь в интерфейсе командной строки с помощью команды doctl auth init, если вы еще этого не сделали.

Используйте команду ниже, чтобы создать каплю для размещения нашего приложения. Мы используем образ DigitaloOean Docker, потому что на последнем этапе руководства мы развернем приложение с помощью Docker.

$ doctl compute droplet create buddy-golang --region fra1 --image docker-18-04 --size s-1vcpu-2gb

Подождите, пока капля будет готова к использованию, проверив текущий статус:

$ doctl compute droplet list buddy-golang

После создания капли пора установить Golang в системе. Для этого вы можете следовать этому руководству по установке от DigitalOcean.

Шаг 3. Конвейер непрерывной интеграции

Теперь, когда у нас настроены все ресурсы, пришло время создать конвейер, который будет автоматически тестировать, строить и развертывать наше приложение всякий раз, когда мы вносим изменения в кодовую базу.

Конфигурация проекта

Войдите в свою учетную запись Buddy и создайте новый проект, в котором вы выбираете GitHub для хостинг-провайдера Git и выбираете Learning-go в качестве репозитория:

Конфигурация трубопровода

Добавьте в проект новый конвейер и установите для триггера значение On push, чтобы запускать конвейер всякий раз, когда что-то помещается в репозиторий GitHub. Второй шаг - это выбор ветки, из которой будет развертываться Buddy. Что касается названия, вы можете называть конвейер как хотите:

На следующем экране вы можете выбрать первое действие, которое будет добавлено в конвейер. Поскольку у нас есть приложение, написанное на Go, и мы хотим протестировать и собрать его с помощью инструментов Golang, нам нужно добавить действие Go:

Добавьте следующие команды в детали действия:

# Download dependencies 
go mod download 
# Execute Golang test files 
go test ./... -v

Вот как это выглядит в действии:

Давайте рассмотрим эти команды:

  • Команда go mod download используется для установки всех необходимых зависимостей приложения.
  • Команда go test ./... -v запускает все тесты Golang в каталоге и распечатывает результаты. Флаг -v, также известный как подробный, используется для более подробной распечатки результатов теста, что упрощает их отладку в случае сбоя.

Далее вам нужно выбрать рабочий каталог действия в окне cache. Если вы используете пример приложения, это должно быть /src/github.com/TannerGabriel/learning-go/beginner-programs/HttpServer.

Наконец, нам нужно изменить версию Golang, используемую действием, с текущего стандартного значения на 1.15.0, поскольку модули Golang не поддерживаются в более старых версиях (версия 1.11 и ниже):

Протестируйте конвейер

Когда вы закончите настройку действия Golang, вы можете протестировать конвейер, вручную нажав кнопку «Запустить конвейер» в правом верхнем углу экрана. Затем вы можете щелкнуть конвейер для получения сведений о выполнении:

Шаг 4. Трубопровод непрерывной доставки

Теперь, когда тесты успешно запущены, пришло время создать и развернуть приложение в нашей капле DigitalOcean. Поскольку мы хотим, чтобы наше приложение было развернуто с помощью Docker, нам сначала нужно создать образ и отправить его в какой-то реестр контейнеров, прежде чем использовать его в нашей капле.

Создайте приложение

На этом этапе мы создадим Docker-образ нашего приложения и поместим его в реестр контейнеров. Мы будем использовать Docker Hub в качестве реестра, так как он является наиболее популярным и бесплатным для общедоступных образов (плюс один частный образ предоставляется бесплатно).

Примечание. Вы можете использовать другой общедоступный реестр или свой частный. Если вы хотите узнать, как создать собственный частный реестр с нуля, вы можете следовать этому руководству.

Начните с добавления действия Build image из раздела Docker списка действий:

Затем нам нужно выбрать Dockerfile, который будет служить основой нашего образа, вместе с контекстом, в котором будет выполняться команда сборки. Здесь выбираем каталог для проекта:

Теперь вам нужно только выбрать реестр и предоставить необходимые учетные данные для отправки образа в вашу учетную запись в окне «Параметры». Вы также можете установить репозиторий и тег изображения:

Запустите образ Docker

Следующим шагом является развертывание и запуск образа в нашей капле DigitalOcean. В настоящее время для этого нет официального действия Buddy (пока), поэтому мы собираемся использовать вместо него действие SSH:

После добавления действия в конвейер нам нужно настроить его в соответствии с нашими настройками капли:

  • Установите режим аутентификации Password (если вы используете SSH-ключ, выберите вместо него Private SSH key или Buddy workspace key)
  • Введите IP-адрес, имя пользователя и пароль, которые использовались для входа на ваш сервер.

Затем добавьте следующие команды к сведениям о действии:

# Pull Docker image 
docker pull gabrieltanner/golang-http-server:latest 
# Stop and remove the container if it already exists 
docker stop http-server || true && docker rm http-server || true 
# Start the new container 
docker run -p 8080:8080 -d --name http-server gabrieltanner/golang-http-server

Давайте рассмотрим эти команды:

  • Команда docker pull используется для извлечения нашего образа из реестра контейнеров на выбранном сервере.
  • Вторая команда используется для остановки и удаления существующего контейнера. Это необходимо сделать, чтобы обновить контейнер до новой версии созданного образа. Команды вернут ошибку, если контейнер не запущен. Это ожидаемое поведение, поэтому нам нужно игнорировать его, используя ... || true.
  • Команда docker run запускает контейнер и публикует порт 8080 в хост-системе с помощью флага -p.

Правильно настроенное действие SSH будет выглядеть так:

Вы можете использовать переменные среды для хранения конфиденциальных данных, таких как логин и пароль.

Необязательно: дождитесь утверждения

Вы можете добавить в процесс какое-то ручное подтверждение перед развертыванием новой версии на рабочем сервере. Это можно сделать, добавив в конвейер действие «Ждать утверждения»:

Протестируйте конвейер

После того, как вы закончите настройку вновь добавленных действий, пора повторно запустить конвейер, чтобы проверить функциональность. Для этого вы можете либо внести некоторые изменения в репозиторий Git, либо нажать кнопку Run pipeline, чтобы запустить запуск вручную:

Теперь у вас есть полнофункциональный конвейер непрерывной интеграции / развертывания для вашего приложения Golang. Однако при каждом нажатии на выбранную ветку вы все равно можете добавить некоторые полезные действия, которые будут держать вас в курсе текущего статуса сборки вашего приложения.

Шаг 5. (Необязательно) Отправьте уведомления об успехе или неудаче

В этом разделе мы рассмотрим, как мы можем отправить уведомление, чтобы держать вас и вашу команду в курсе новейшего статуса сборки.

Вот список всех доступных действий с уведомлениями на момент публикации этой статьи:

Для этого мы будем использовать действие по электронной почте для неудачных сборок и действие Slack для успешных сборок, но вы также можете использовать другие, если вы, например, не используете Slack.

Уведомления об успешных сборках можно отправить, добавив еще одно действие в нижней части конвейера, которое будет выполнено только тогда, когда все остальные действия будут успешными. Действие по уведомлению об ошибке необходимо добавить в ACTIONS RUN ON FAILURE раздел конвейера.

После добавления действия в конвейер настройте его, используя переменные среды на странице настройки действия. Пример конфигурации электронной почты может выглядеть примерно так:

Резюме

Вот и все! Вы успешно настроили свой собственный конвейер CI / CD для своего приложения Golang, который автоматически тестирует и развертывает ваше приложение всякий раз, когда вы отправляете изменение в репозиторий Git, и даже отправляет уведомления с текущим статусом сборки вам и вашим коллегам. Я предлагаю вам поиграть с различными Действиями друзей, показанными в статье, и дополнительно настроить параметры для ваших целей. Наслаждаться!

Спасибо за прочтение! Если возникнут вопросы, оставьте, пожалуйста, комментарий.