Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Разработка /
Разработка: Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Это пятая часть материала. Первая часть. Вторая часть. Третья часть. Четвёртая часть.

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

Как?

Для этой цели мы воспользуемся сторонним сервисом: Codeship

Код нашего приложения хранится на GitHub и Codeship настроен так, что каждое изменение репозитория на GitHub, автоматически вызывает преднастроенные процессы в Codeship.

Это процесс состоит из следующих шагов:

  1. Получение кода и завимостей
  2. Сборка бинарника
  3. Копирование бинарника на сервер
  4. Перезапуск приложения на сервере

Получение кода

Эта часть самая простая — Codeship сделает это за нас. Нам нужно только настроить проект в Codeship и привязать его к GitHub. При привязке аккаунта GitHub к Codeship будет создан веб-хук для оповещения Codeship об изменениях в репозитории.

Разработка: Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Затем нужно настроить скрипты, запускаемые при срабатывании хука.

Разработка: Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Вот сценарий, который работает у меня:

GO_VERSION=${GO_VERSION:="1.8.0"}
# strip all components from PATH which point toa GO installation and configure the
# download location
CLEANED_PATH=$(echo $PATH | sed -r 's|/(usr/local\|tmp)/go(/([0-9]\.)+[0-9])?/bin:||g')
CACHED_DOWNLOAD="${HOME}/cache/go${GO_VERSION}.linux-amd64.tar.gz"
# configure the new GOROOT and PATH
export GOROOT="/tmp/go/${GO_VERSION}"
export PATH="${GOROOT}/bin:${CLEANED_PATH}"
# no set -e because this file is sourced and with the option set a failing command
# would cause an infrastructur error message on Codeship.
mkdir -p "${GOROOT}"
wget --continue --output-document "${CACHED_DOWNLOAD}" "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz"
tar -xaf "${CACHED_DOWNLOAD}" --strip-components=1 --directory "${GOROOT}"
# check the correct version is used
go version | grep ${GO_VERSION}
go get -t -v ./...

Команда для запуска тестов:

go test -v ./...

Затем добавим скрипт для развёртывания. Но вначале настроим, чтобы применялись коммиты/пуши только из ветки «production».

Разработка: Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Выберем вариант «custom script» и вставим такой текст:

go build
scp -P 2222 currencyconverter root@$SERVER:/root/tmp_currencyconverter
ssh -p 2222 root@$SERVER<<EOF
    killall currencyconverter
    rm /root/currencyconverter
    mv /root/tmp_currencyconverter /root/currencyconverter
    chmod +x /root/currencyconverter
    GFS_CURRENCY_HOST=0.0.0.0 GFS_CURRENCY_PORT=80 nohup /root/currencyconverter > /dev/null 2>&1 &
EOF

Этот скрипт соберёт приложение из исходников и скопирует готовый бинарник на наш сервер. Затем подсоединится по ssh к серверу, остановит службу, заменит новыми файлами и запустит процесс заново.

Для этого нужно будет добавить открытый ключ SSH (из Project settings > General) в папку ~/.ssh/authorized_keys пользователя root. Это даст возможность Codeship соединяться с сервером без указания паролей.

Обратите внимание на переменную $SERVER — так можно указывать переменные проекта, которые потом легко будет заменить.

Разработка: Full stack проект на Go за неделю. День 5: Настраиваем CI/CD

Готово. Мы настроили CI/CD и теперь при каждом обновлении ветки “production” Codeship получит измененный код, протестирует его, скопирует на сервер и запустит приложение. И всё это автоматически!

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

Продолжение.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.