Как настроить деплой web-приложения на Go для Gitlab на VDS

от автора

Предисловие

Эта статья является результатом недельного поиска весьма разрозненной информации о том, как же настроить деплой web-сервиса на Go. Не на Heroku, не на Docker, не на Digital Ocean, а просто на старомодный VDS с CentOS 7×64. Почему-то в сети нет этой информации, а большинство туториалов начинаются с того, как настроить билд, и заканчиваются запуском тестов.

Сразу предупрежу, что впервые настраивал CI/CD процесс, так что это статья от новичка новичку.

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

Исходные данные

  • VDS сервер
  • ОС: CentOS 7×64
  • Проект на go со следующей структурой:

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

На сервере запускаем команду:

ssh-keygen -f /etc/ssh/hmp.key

На просьбу

Enter passphrase (empty for no passphrase)

не вводим пароль, просто нажимаем на Enter.

В папке /etc/ssh/ сгенерируется два файла:

  1. hmp.key — приватный ключ
  2. hmp.key.pub — публичный ключ

Нам нужен приватный ключ. Просматриваем его содержимое с помощью команды:

cat /etc/ssh/hmp.key

Оно будет выглядеть примерно так:

-----BEGIN RSA PRIVATE KEY----- {Здесь сам по себе ключ} -----END RSA PRIVATE KEY-----

Все полностью копируем себе в буфер обмена

ВНИМАНИЕ! — не только сам ключ, но и
——BEGIN RSA PRIVATE KEY—— и ——END RSA PRIVATE KEY——

Настройка Gitlab

Сначала заполним данные, важные для деполя, (имя пользователя, пароль и.т.п.).
Даже если Ваш репозиторий публичный, они останутся закрытыми.

В Gitlab в репозитории заходим в Settings —> CI/CD —> Variables. Создаем там следующие переменные:

  • SSH_PRIVATE_KEY — сюда вставляем значение, скопированное в предыдущем пункте
  • USER_PASS — пароль пользователя, из под которого будет запускаться приложение
  • USER — имя пользователя, из под которого будет запускаться приложение
  • HOST — адрес вашего VDS
  • TARGET_DIR_ON_HOST — целевая папка, в которой будет находиться ваш сервис в моем примере это /username/service/
  • SERVICE_NAME — имя сервиса
  • GROUP_NAME — имя вашего пользователя на Gitlab
  • REPOSITORY_NAME — название вашего репозитория

Добавляем в репозиторий файл .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 *\n\tStrictHostKeyChecking no\n\n" > ~/.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 

После донастройки, этот скрипт пушим в репозиторий и у нас оказывается готовая сборка и деплой. На этом все!

Надеюсь статья была полезной. По любым вопросам и замечаниям с радостью отвечу в комментариях!


ссылка на оригинал статьи https://habr.com/post/421087/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *