В предыдущей статье мы рассмотрели, как автоматизировать развертывание на Heroku с использованием GitLab CI/CD. Этот набор развертывал приложение в его производственной среде каждый раз, когда мы pushed код в ветку main
.
В этой статье мы рассмотрим немного более тонкий подход: Что если у нас есть несколько сред? Большинство инженерных организаций используют по крайней мере три среды: локальную среду разработки, тестовую среду и производственную среду.
Additionally, некоторые инженерные команды следуют стратегии ветвления Gitflow, где у них есть ветка dev
и ветка main
. Эта стратегия уже вышла из моды и была заменена trunk-based development, но не редки случаи, когда организации все еще следуют этой практике.
Сегодня мы рассмотрим, как настроить GitLab CI/CD для deployment нашего приложения в тестовую среду при pushing на ветку dev
и deployment нашего приложения в производственную среду при pushing на ветку main
.
Начало работы
Before we begin, we’ll need two things: a Heroku account and a GitLab account.
Heroku – отличное место для размещения и deployment ваших приложений. Как платформа как сервис (PaaS), Heroku позволяет вам сосредоточиться на создании классных вещей,abstracting away much of the infrastructure complexity. You can create a Heroku account here.
GitLab – отличное место для хранения вашего кода. Помимо того, что это просто инструмент управления исходным кодом, GitLab также предлагает natives CI/CD capabilities, чтобы вы могли настроить pipelines для тестирования и deployment вашего кода без необходимости использования другого стороннего инструмента. You can create a GitLab account here.
Демонстрационное приложение, показанное в этой статье, использует как GitLab, так и Heroku. You can find all the code in the GitLab repo here.
Запуск нашего приложения локально
Вы можете запустить приложение локально,克隆ировав репозиторий, установив зависимости и запустив команду запуска. В вашем терминале выполните следующее:
$ git clone https://gitlab.com/tylerhawkins1/heroku-gitflow-staging-production-gitlab-cicd-demo.git $ cd heroku-gitflow-staging-production-gitlab-cicd-demo $ npm install $ npm start
После запуска приложения перейдите на этот локальный хост в вашем браузере, и вы увидите, что приложение запущено локально:
Демонстрационное приложение Heroku
Развертывание нашего приложения на Heroku
Теперь, когда приложение запущено локально, давайте развернем его на Heroku, чтобы вы могли получить к нему доступ из любого места, а не только на вашем компьютере.
помните, что мы собираемся развернуть ваше приложение как в среде бета-тестирования, так и в производственной среде. Это означает, что у нас будет два приложения Heroku, основанных на одном репозитории GitLab.
Если у вас еще не установлен CLI Heroku на вашем компьютере, вам нужно установить его перед продолжением.
После установки CLI Heroku выполните следующие команды из вашего терминала, чтобы切换 на ветку main
, создать новое производственное приложение Heroku, развернуть его в вашей производственной среде и открыть его в браузере:
$ git checkout main $ heroku create heroku-gitlab-ci-cd-production --remote heroku-production $ git push heroku-production main $ heroku open --remote heroku-production
С этим вы должны увидеть то же приложение, но на этот раз работающее по URL Heroku вместо localhost. Молодец — вы развернули свое приложение Heroku в production!
Но мы еще не закончили. Нам также нужно настроить и развернуть ваше бета-тестинговое приложение. Для этого выполните следующий аналогичный набор команд, показанный ниже:
$ git checkout dev $ heroku create heroku-gitlab-ci-cd-staging --remote heroku-staging $ git push heroku-staging main $ heroku open --remote heroku-staging
Теперь у вас снова будет развернуто то же приложение, но на этот раз по другому URL, который будет служить вашей тестовой средой. Теперь у вас настроены обе среды!
Обратите внимание на различия и сходства между командами для производственного приложения и тестового приложения:
- Производственное приложение использует ветку
main
, а тестовое приложение использует веткуdev
. - Производственное приложение называется
heroku-gitlab-ci-cd-production
, а тестовое приложение называетсяheroku-gitlab-ci-cd-staging
. - Git-удаленный репозиторий производственного приложения называется
heroku-production
, а git-удаленный репозиторий тестового приложения называетсяheroku-staging
. - Both the production app and the staging app’s git remotes use a
main
branch, since Heroku only deploys the app when code is pushed to its main branch.
Keep in mind that this main
branch is different from your set of main
and dev
branches. The main
branch that you’re pushing to here is the main
branch on your git remote — in this case, Heroku.
Когда вы находитесь на местной ветке main
и выполняете команду git push heroku-production main
, вы pushes’ите вашу ветку main
в ветку main
производственного приложения Heroku. А когда вы находитесь на местной ветке dev
и выполняете команду git push heroku-staging main
, вы pushes’ите вашу ветку dev
в ветку main
стейджингового приложения Heroku.
Внесение изменений в наше приложение
Теперь, когда наше приложение Heroku работает, что если мы хотим внести какие-то изменения? Следуя примернойapproximation стратегии ветвления Gitflow, мы можем сделать следующее:
- Перейти на ветку
dev
- Внести изменения в код
- Добавить,.commit’ить и pushes’ить эти изменения в ветку
dev
- Развернуть эти изменения на стейджинговом приложении Heroku, выполнив команду
git push heroku-staging main
- Перейти на ветку
main
- Объединить ветку
dev
с веткойmain
- Развернуть эти изменения на производственном приложении Heroku, выполнив команду
git push heroku-production main
(Если бы мы действительно следовали Gitflow, мы создали бы ветку функции для объединения с dev
, и ветку релиза для объединения с main
, но мы пропустили эти шаги, чтобы упростить事情.)
Теперь, не было бы замечательно, если бы мы могли автоматизировать развертывание в любую из наших сред, вместо того чтобы вручную развертывать их все время?
Вот где в игру вступает GitLab CI/CD.
Непрерывная интеграция/Непрерывное развертывание
Непрерывная интеграция (CI) заключается в частом коммити и постоянном поддержании билда в хорошем состоянии. Обычно вы проверяете, что билд находится в хорошем состоянии, запуская проверки в конвейере CI. Эти проверки могут включать линтеры, юнит-тесты и/или интеграционные тесты.
Непрерывное развертывание (CD) подразумевает частое развертывание. Если проверки в конвейере CI пройдены, то билд развертывается. Если проверки в конвейере CI не пройдены, то билд не развертывается.
С помощью GitLab CI/CD мы можем настроить наш конвейер CI для выполнения именно этого — запуска наших тестов, а затем развертывания нашего приложения на Heroku, если все тесты пройдены. Самое главное для нашей конфигурации — мы можем настроить правила в нашем конвейере CI, чтобы указать, куда должно быть развернуто приложение.
Настройка GitLab CI/CD
Мы можем создать конвейер CI в GitLab программно с помощью файла .gitlab-ci.yml
. Наш файл выглядит следующим образом:
image: node:20.10.0
cache:
paths:
- node_modules/
before_script:
- node -v
- npm install
stages:
- test
- deploy
unit-test-job:
stage: test
script:
- npm test
deploy-job:
stage: deploy
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_PRODUCTION
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_PRODUCTION
- if: $CI_COMMIT_REF_NAME =~ /dev/
variables:
HEROKU_APP_NAME: $HEROKU_APP_NAME_STAGING
script:
- apt-get update -yq
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY
Конвейеры GitLab CI состоят из этапов и задач. Каждый этап может содержать одну или несколько задач. В нашем конвейере у нас есть два этапа: test
и deploy
. На этапе test
мы запускаем наши юнит-тесты в задаче unit-test-job
. На этапе deploy
мы развертываем наше приложение на Heroku в задаче deploy-job
.
Мы можем перейти к следующему этапу только если все задачи в предыдущем этапе пройдены. Это означает, что если юнит-тесты не пройдены, то приложение не будет развернуто, что является хорошей вещью! Мы бы не хотели развертывать наше приложение, если бы оно находилось в плохом состоянии.
Вы заметите, что стадия deploy
имеет раздел rules
с некоторой условной логикой. Это место, где мы указываем, в какое окружение должна быть развернута наша aplikacja. Если мы на ветке main
, то мы развертываем нашу производственную aplikację. Если мы на ветке dev
, то мы развертываем нашу тестовую aplikację.
Вы также заметите, что стадия deploy
ссылается на несколько переменных, называемых $HEROKU_APP_NAME_PRODUCTION
, $HEROKU_APP_NAME_STAGING
и $HEROKU_API_KEY
. Они хранятся как CI/CD переменные в GitLab.
Если вы настраиваете это в своем собственном аккаунте GitLab, вам нужно сначала найти свой API ключ в вашем аккаунте Heroku. В настройках вашего аккаунта Heroku вы должны увидеть раздел для вашего API ключа. Если вы еще не сгенерировали API ключ, сгенерируйте его сейчас.

Затем, в вашем проекте GitLab, нажмите на Настройки > CI/CD > Переменные. Разверните этот раздел и добавьте три новые переменные:
- Значение для
$HEROKU_API_KEY
будет API ключом из вашего аккаунта Heroku. - Значение для
$HEROKU_APP_NAME_PRODUCTION
будет названием вашей производственной aplikacji Heroku. Название моей производственной aplikacjiheroku-gitlab-ci-cd-production
, но так как имена aplikacji Heroku уникальны, ваше будет有别ным. - Значение для
$HEROKU_APP_NAME_STAGING
будет названием вашей тестовой Heroku-приложения. Название моей тестовой aplicaciones —heroku-gitlab-ci-cd-staging
. Опять же,since Heroku app names are universally unique, yours будет что-то другое.

С этим ваш GitLab CI pipeline готов к использованию! Давайте проверим его.
Развертывание нашей Heroku-приложения в тестовую среду
Давайте перейдем к ветке dev
и внесем изменения в код нашей программы. Я сделал простое изменение в тексте заголовка и добавил несколько новых строк в текст в интерфейсе пользователя. Вы можете сделать аналогичное изменение в вашем коде.
Теперь добавьте, зафиксируйте и отправьте это изменение в ветку dev
. Это запустит GitLab CI pipeline. Вы можете viewed pipeline в GitLab и видеть прогресс в реальном времени.

Если все прошло хорошо, вы должны увидеть, что как test
, так и deploy
stagespassed. Теперь перейдите к вашей宿主ной Heroku-приложения по URL тестовой среды. GitLab CI pipeline позаботился о развертывании приложения для вас, поэтому вы теперь увидите ваши изменения в жизни в тестовой среде!

С настроенной тестовой средой у вас теперь есть отличное место для的手动 тестирования кода в宿主ной среде. Это также perfectspot для того, чтобы тестировщики или менеджеры по продукту проверяли изменения перед их выпуском в production.
Теперь перейдите по URL вашей производственной программы. Вы заметите, что он все еще показывает старый интерфейс без последних изменений. Это потому, что GitLab CI pipeline развернул изменения только в тестовую среду, а не в производственную.
Мы проверили, что код looks خوب в нашей тестовой среде, так что давайте перенесем его в нашу производственную среду.
Развертывание нашего приложения Heroku в производственной среде
Давайте посмотрим на ветку main
и затем сольем ветку dev
в вашу ветку main
. Вы можете сделать это через pull request или запустив git merge dev
и затем git push
.
Это запуститGitLab CI pipeline снова, но на этот раз он будет готовить развертывание вашего производственного приложения.

Вы также можете просмотреть все запуски管道 на странице Pipelines в GitLab, чтобы увидеть различные сборки для ваших веток dev
и main
:

После того как管道 закончится, перейдите по URL вашего производственного приложения Heroku. Вы должны теперь увидеть ваши изменения, также развернутые в production. Отличная работа!
Заключение
A good CI pipeline allows you to ship new features quickly and confidently without manually managing the deployment process. Having multiple environments configured for local development, staging, and production gives you more control over where and when code is released.
Heroku и GitLab CI/CD позволяют автоматизировать все это, чтобы сделать ваши процессы DevOps легким делом!
Source:
https://dzone.com/articles/deploying-heroku-apps-to-staging-and-production