- PVSM.RU - https://www.pvsm.ru -
Эта статья является результатом недельного поиска весьма разрозненной информации о том, как же настроить деплой web-сервиса на Go. Не на Heroku, не на Docker, не на Digital Ocean, а просто на старомодный
Сразу предупрежу, что впервые настраивал CI/CD процесс, так что это статья от новичка новичку.
Наверняка здесь многое можно будет поправить, так что любые замечания с удовольствием приму в комментариях и постараюсь обновить изменения как можно скорее. Так же, возможно, что такая статья уже есть, и я просто ужасно пользуюсь поисковиком. Тогда дайте, пожалуйста, ссылку на неё, и в этом случае, я удалю статью и пойду посыпать голову пеплом.
src/
public/
index.html
main.go
Сначала создадим сервис для нашего приложения. В CentOS 7 это делается довольно просто. Нужно написать вот такой скрипт в файле под названием serviceName.service:
[Unit]
# Описание сервиса
Description=Service Description
After=network.target
[Service]
Type=simple
# Имя пользователя, от имени которого будет запускаться сервис
User=username
# Путь до сервиса
ExecStart=/username/service/binaryFile
Restart=on-abort
[Install]
WantedBy=multi-user.target
Сам скрипт необходимо положить в папку etc/systemd/system/
На сервере запускаем команду:
ssh-keygen -f /etc/ssh/hmp.key
На просьбу
Enter passphrase (empty for no passphrase)
не вводим пароль, просто нажимаем на Enter.
В папке /etc/ssh/ сгенерируется два файла:
Нам нужен приватный ключ. Просматриваем его содержимое с помощью команды:
cat /etc/ssh/hmp.key
Оно будет выглядеть примерно так:
-----BEGIN RSA PRIVATE KEY-----
{Здесь сам по себе ключ}
-----END RSA PRIVATE KEY-----
Все полностью копируем себе в буфер обмена
ВНИМАНИЕ! — не только сам ключ, но и
-----BEGIN RSA PRIVATE KEY----- и -----END RSA PRIVATE KEY-----
Сначала заполним данные, важные для деполя, (имя пользователя, пароль и.т.п.).
Даже если Ваш репозиторий публичный, они останутся закрытыми.
В Gitlab в репозитории заходим в Settings --> CI/CD --> Variables. Создаем там следующие переменные:
Добавляем в репозиторий файл .gitlab-ci.yml со следующим содержимым:
image: golang:latest
before_script:
# Гитлаб скачивает себе утилиту sshpass
- apt-get update -qq && apt-get install -y -qq sshpass
# Скачиваем зависимости, необходимые для сборки проекта. Можно использовать govendor, но его нужно отдельно настраивать
- go get github.com/gorilla/mux
- go get github.com/gorilla/websocket
# Настраиваем SSH
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config
# Создаем папку для репозитория
- mkdir -p /go/src/gitlab.com/$GROUP_NAME
# Клонируем в неё репозиторий
- git clone git@gitlab.com:$GROUP_NAME/$REPOSITORY_NAME.git /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME
# Создаем папку под готовый билд
- mkdir -p $CI_PROJECT_DIR/build/
# Копирем в папку с билдом все ассеты (картинки, HTML-файлы и.т.п) из репозитория.
# У меня они лежат в папке src/public
- cp -r $CI_PROJECT_DIR/src/public $CI_PROJECT_DIR/build
stages:
- build
- deploy
compile:
stage: build
script:
# Переходим в папку с Go файлами
- cd /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME/src
# Вызываем в ней сборку. Указываем, что готовый бинарник будет положен в папку build рядом с ассетами и будет называться main
- go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/build/main
artifacts:
paths:
- main
deploy:
stage: deploy
script:
# Переходим в папку с билдом () там лежит бинарник и папка public
- cd $CI_PROJECT_DIR/build
# Используем утилиту sshpass для удаленного выполнения команд на VDS
- sshpass -V
- export SSHPASS=$USER_PASS
# Останавливаем сервис
- sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl stop $SERVICE_NAME
# Копируем новые файлы
- sshpass -e scp -o stricthostkeychecking=no -r . $USER@$HOST:$TARGET_DIR_ON_HOST
# Перезапускаем сервис
- sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl restart $SERVICE_NAME
После донастройки, этот скрипт пушим в репозиторий и у нас оказывается готовая сборка и деплой. На этом все!
Надеюсь статья была полезной. По любым вопросам и замечаниям с радостью отвечу в комментариях!
Автор: Indermove
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/golang/290206
Ссылки в тексте:
[1] VDS: https://www.reg.ru/?rlink=reflink-717
[2] Источник: https://habr.com/post/421087/?utm_campaign=421087
Нажмите здесь для печати.