我如何使用GitOps进行测试&使用GitLab CI将我的应用程序部署到Heroku

时间:2018-05-04 23:28:15

标签: ruby-on-rails heroku gitlab devops gitlab-ci

我有一个使用git push heroku master && heroku run rails db:migrate部署的Heroku应用程序。

我使用GitLab来存储我的代码,但我希望能够:

  • 测试每个推送和合并请求
  • 部署到临时环境
  • 部署到生产

所有这一切都没有离开我的命令行。

此外,虽然我的堆栈使用Ruby on Rails,但答案并不一定要使用Rails。它应该很容易适应任何堆栈。

1 个答案:

答案 0 :(得分:0)

我刚刚发布了a blog post所有这些以及插图和完整的公开示例应用程序。然而,它的要点是:

第1步:设置您的Heroku应用

为舞台和制作创建两个Heroku应用程序。我打电话给我的toptal-pipelinetoptal-pipeline-staging,前者是制作应用。

使用heroku auth:token注意您的身份验证令牌。

第2步:设置GitLab CI

将其粘贴到项目根目录的.gitlab-ci.yml,将APPNAME_PRODUCTIONAPPNAME_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_stagingdeploy_to_production部分&#39;如果您不使用Ruby on Rails,script会阻止您的部署步骤。

另外,对test块执行相同操作。目前这个运行Rspec和Rubocop。

第3步:配置GitLab设置

  1. 将两个秘密变量添加到GitLab CI设置中
    • HEROKU_EMAIL:您的Heroku登录电子邮件
    • HEROKU_AUTH_TOKEN:来自第1步的令牌。
  2. v*标记添加到GitLab存储库设置中的受保护标记。
  3. 步骤4:创建NPM脚本以简化语义版本化

    使用standard-versiondevDependencies添加到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 to run tests
    3. Git推送到master以部署到暂存
    4. 使用semantic versioning标记版本并推送以部署到生产
    5. 此外,要使用新的语义版本号进行标记,请运行:

      • yarn patch增加补丁号码。例如。 x.x.1 =&gt; x.x.2
      • yarn minor增加次要号码。例如。 x.1.x =&gt; x.2.x
      • yarn major增加主要数字。例如。 1.x.x =&gt; 2.x.x

      前进,建立一些很棒的东西。