Разворачивание Rails-приложения через Gitlab CI/CD и Capistrano

Описание

В инструкции показано, как настроить автоматическое разворачивание приложения Ruby On Rails через Gitlab CI/CD используя Capistrano с сохранением возможности запускать Capistrano локально. Разворачивание будет автоматически запускаться при публикации изменений в рабочую ветку конкретного окружения, после окончания будет отправлено уведомление в Slack.

Перед выполнением

Инструкция предполагает, что у вас:

  • Настроен облачный сервер под управлением Ubuntu с не-root пользователем с sudo правами и доступом по SSH.
  • Есть GitLab-репозиторий с Rails-приложением, в котором настроено разворачивание через Capistrano.
  • Скрипты Capistrano добавлены в репозиторий. Если ранее они у вас игнорировались git’ом, то перед их добавлением убедитесь, что все приватные данные вынесены в переменные окружения.

Алгоритм

Инструкция включает следующие шаги:

  1. Установка и регистрация GitLab Runner’а. Это программное обеспечение будет запускать CI/CD на сервере GitLab.
  2. Настройка подключения по SSH со стороны GitLab, чтобы процесс автоматического разворачивания мог производить удаленное подключение к серверу.
  3. Настройка переменных GitLab CI/CD, с помощью которых CI/CD получит доступ к приватной информации, которая отсутствует в репозитории.
  4. Создание файла .gitlab-ci.yml, в котором будет будет описан алгоритм выполнения автоматического разворачивания.
  5. Настройка уведомлений в Slack об окончании разворачивания.

Установка и регистрация GitLab Runner’а

Runner, это приложение, которое работает на сервере GitLab и исполняет операции CI/CD. Если у вас уже настроен Runner, то данный пункт инструкции можно пропустить.

Настройка подключения по SSH со стороны GitLab

GitLab CI/CD во время выполнения инструкций будет подключаться по SSH к облачному серверу. Необходимо настроить доступ.

ssh-keygen -t rsa -b 2048
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
git clone git@gitlab.example.com:<GROUP>/project-sample.git
rm -rf project-sample/

Настройка переменных GitLab CI/CD

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

  • .envDOT_ENV
  • ProcfilePROCFILE
  • config/database.ymlDATABASE_YML

Создание файла .gitlab-ci.yml

Чтобы настроить CI/CD для проекта, необходимо создать в корневом каталоге файл .gitlab-ci.yml. Файл должен присутствовать в ветке master. Переключитесь в неё:

git checkout master
  • Выполнение bundle install, чтобы запустить Capistrano.
  • Настройка подключения по SSH.
  • Копирование файлов из переменных GitLab CI/CD в нужную для Capistrano папку.
  • Создание файла с переменными окружения для Capistrano на основе переменных GitLab CI/CD.
  • Запуск Capistrano.
  • В виде якорей через связку &*. Аналог определения и вызова функций в языках программирования.
  • В виде ключа extends — Аналог наследования в языках программирования.
  • image — Снимок Docker, на основе которого будет создан Docker-контейнер для выполнения CI/CD. Замените версию ruby на ту, которая используется в вашем проекте.
  • stages — описывает последовательность шагов, которые нужно выполнить. В данном случае производится только автоматическое разворачивание, поэтому шаг всего один — deploy. Названия для шагов можно выдавать любые, они не фиксированы. Далее в файле будет описана реализация шагов.
  • cache — настраивает кэш Runner’а. По умолчанию при каждом новом запуске CI/CD вы получаете чистый Docker-контейнер, а значит, bundle install будет заново устанавливать все Gem’ы. Кэш позволяет сохранить их между запусками CI/CD. С помощью ключа key настроено, чтобы каждая ветка репозитория имела свой собственный кэш.
  • before_script — скрипт, который нужно выполнить перед каждым шагом. Может быть объявлен глобально, а может для каждого шага в отдельности. В данном случае настроено, чтобы перед каждым шагом выполнялся bundle install.
  • .init-ssh-script — вспомогательный блок кода для настройки SSH-подключения по открытому ключу.
  • .init-shared-script — вспомогательный блок кода для копирования файлов из переменных CI/CD в папку с проектом, где они будут видны скрипту Capistrano.
  • .init-capistrano-env-script — вспомогательный блок кода для создания файла с переменными окружения для подключения к серверу.
  • .run-capistrano-script — вспомогательный блок кода для запуска Capistrano.
  • .capistrano — вспомогательный блок кода для общего описания шага deploy. В нём с помощью ключа stage указан шаг CI/CD. Ключ tags указывает, на каком Runner’е запустить CI/CD. Ключ only.variables указывает, какие переменные должны быть настроены в CI/CD, иначе шаг не запустится. Ключ script, это основной код шага, где и запускается Capistrano.
  • capistrano:<ENVIRONMENT> — конкретная реализация шага deploy для конкретного окружения. В данном примере реализация написана для Production и Staging окружений. Ключ extends указывает, на основе какого блока создан этот шаг. Ключ only.refs ограничивает запуск CI/CD для конкретных веток. Ветка, для которой выполняется скрипт, доступна в нём под переменной $CI_COMMIT_REF_SLUG. Ключ environment указывает имя окружения, которое доступно в скрипте через специальную переменную $CI_ENVIRONMENT_NAME.
git add -A
git commit -m "Added file .gitlab-ci.yml"
git push origin master

Настройка уведомлений в Slack

В GitLab’е можно включить различные уведомления в Slack, но без возможности настройки текста сообщений. Обойти это ограничение можно, если вручную вызвать API-запрос на отправку сообщения в Slack.

  • SLACK_CHANNEL_NAME — имя канала, в который необходимо присылать уведомления по проекту. Если будете отправлять личные сообщения, то имя нужно начинать с символа @.
  • SLACK_WEBHOOK — полученный URL вебхука.

Используемые источники

--

--

Software Engineer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store