Как использовать GitOps для тестирования и развертывания моего приложения в Heroku с помощью GitLab CI - PullRequest
0 голосов
/ 05 мая 2018

У меня есть приложение Heroku, которое я развертываю с git push heroku master && heroku run rails db:migrate.

Я использую GitLab для хранения своего кода, но я хочу иметь возможность:

  • Проверка каждого запроса на добавление и объединение
  • Развертывание в промежуточной среде
  • Развертывание на производстве

Все, не выходя из командной строки.

Кроме того, хотя мой стек использует Ruby on Rails, для ответа не обязательно использовать Rails. Он должен легко адаптироваться к любому стеку.

1 Ответ

0 голосов
/ 05 мая 2018

Я только что опубликовал пост в блоге со всеми этими плюсами иллюстраций и полным и общедоступным примером приложения. Однако суть этого такова:

Шаг 1. Настройка приложений Heroku

Создание двух приложений Heroku для постановки и производства. Я собираюсь назвать мои toptal-pipeline и toptal-pipeline-staging, первое - производственное приложение.

Запишите ваш токен авторизации, используя heroku auth:token.

Шаг 2: Настройка GitLab CI

Вставьте это в .gitlab-ci.yml в корне вашего проекта, заменив значения для APPNAME_PRODUCTION и APPNAME_STAGING именами приложений Heroku соответственно:

image: ruby:2.4

before_script:
  - >
   : "${HEROKU_EMAIL:?Please set HEROKU_EMAIL in your CI/CD config vars}"
  - >
   : "${HEROKU_AUTH_TOKEN:?Please set HEROKU_AUTH_TOKEN in your CI/CD config vars}"
  - curl https://cli-assets.heroku.com/install-standalone.sh | sh
  - |
    cat >~/.netrc <<EOF
    machine api.heroku.com
      login $HEROKU_EMAIL
      password $HEROKU_AUTH_TOKEN
    machine git.heroku.com
      login $HEROKU_EMAIL
      password $HEROKU_AUTH_TOKEN
    EOF
  - chmod 600 ~/.netrc
  - git config --global user.email "ci@example.com"
  - git config --global user.name "CI/CD"

stages:
  - test
  - deploy

variables:
  APPNAME_PRODUCTION: toptal-pipeline
  APPNAME_STAGING: toptal-pipeline-staging

test:
  stage: test
  variables:
    POSTGRES_USER: test
    POSTGRES_PASSSWORD: test-password
    POSTGRES_DB: test
    DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSSWORD}@postgres/${POSTGRES_DB}
    RAILS_ENV: test
  services:
    - postgres:alpine
  before_script:
    - curl -sL https://deb.nodesource.com/setup_8.x | bash
    - apt-get update -qq && apt-get install -yqq nodejs libpq-dev
    - curl -o- -L https://yarnpkg.com/install.sh | bash
    - source ~/.bashrc
    - yarn
    - gem install bundler  --no-ri --no-rdoc
    - bundle install -j $(nproc) --path vendor
    - bundle exec rake db:setup RAILS_ENV=test
  script:
    - bundle exec rake spec
    - bundle exec rubocop


deploy_to_staging:
  stage: deploy
  environment:
    name: staging
    url: https://$APPNAME_STAGING.herokuapp.com/
  script:
    - git remote add heroku https://git.heroku.com/$APPNAME_STAGING.git
    - git push heroku master
    - heroku pg:backups:capture --app $APPNAME_PRODUCTION
    - heroku pg:backups:restore `heroku pg:backups:url --app $APPNAME_PRODUCTION` --app $APPNAME_STAGING --confirm $APPNAME_STAGING
    - heroku run rails db:migrate --app $APPNAME_STAGING
  only:
    - master
    - tags

deploy_to_production:
  stage: deploy
  environment:
    name: production
    url: https://$APPNAME_PRODUCTION.herokuapp.com/
  script:
    - git remote add heroku https://git.heroku.com/$APPNAME_PRODUCTION.git
    - git push heroku master
    - heroku pg:backups:capture --app $APPNAME_PRODUCTION
    - heroku run rails db:migrate --app $APPNAME_PRODUCTION
  only:
    - /^v(?'MAJOR'(?:0|(?:[1-9]\d*)))\.(?'MINOR'(?:0|(?:[1-9]\d*)))\.(?'PATCH'(?:0|(?:[1-9]\d*)))(?:-(?'prerelease'[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(?:\+(?'build'[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$/
    # semver pattern above is adapted from https://github.com/semver/semver.org/issues/59#issuecomment-57884619

Обязательно адаптируйте блоки deploy_to_staging *1026* и deploy_to_production разделов для соответствия шагам развертывания, если вы не используете Ruby on Rails.

Также сделайте то же самое для вашего test блока. Этот текущий работает Rspec и Rubocop.

Шаг 3. Конфигурирование настроек GitLab

  1. Добавьте две секретные переменные в настройки GitLab CI
    • HEROKU_EMAIL: адрес электронной почты для входа в Heroku
    • HEROKU_AUTH_TOKEN: ваш токен из шага 1.
  2. Добавьте v* теги к защищенным тегам в настройках GitLab Repository.

Шаг 4. Создание сценариев NPM для упрощения семантического контроля версий

Добавьте standard-version к вашему devDependencies с помощью yarn add --dev standard-version и добавьте следующие сценарии к package.json:

"scripts": {
  "release": "standard-version",
  "major": "yarn release --release-as major",
  "minor": "yarn release --release-as minor",
  "patch": "yarn release --release-as patch"
}

Кроме того, добавьте номер версии в файл package.json:

"version": "0.0.7"

Шаг 5: Введите свой код

Каким будет ваш новый рабочий процесс кодирования:

  1. Введите код
  2. Git push для запуска тестов
  3. Git push для master для развертывания в
  4. Пометьте выпуск, используя семантическое управление версиями и нажмите для развертывания в производство

Также, чтобы пометить новый номер семантической версии, запустите:

  • yarn patch для увеличения номера патча. Например. x.x.1 => x.x.2
  • yarn minor для увеличения младшего номера. Например. x.1.x => x.2.x
  • yarn major для увеличения старшего номера. Например. 1.x.x => 2.x.x

Выйди и сделай что-нибудь потрясающее.

...