LoginSignup
7
2

More than 1 year has passed since last update.

GitLab CIでRails + yarnのビルド & herokuへデプロイをしよう

Last updated at Posted at 2018-06-19

はじめに

最近GitLabで開発を行うプロダクトがあり、GitLab CIを用いてビルドとherokuへのデプロイ環境を作りました。
Rails + yarnのビルド環境を作る情報が少なくてちょっとだけ苦労したので、記事にまとめておこうと思います。

環境

ruby: 2.5.1
db: postgresql

書いた .gitlab-ci.yml

初めに書いた.gitlab-ci.ymlを載せて解説をしていきたいと思います。

image: "ruby:2.5.1"

services:
  - postgres:latest

stages:
  - build
  - deploy

build:
  stage: build
  variables:
    BUNDLE_CACHE: "vendor/bundle/"
    RAILS_ENV: "test"
    CI: "true"
  script:
    # Install node and some other deps
    - curl -sL https://deb.nodesource.com/setup_8.x | bash -
    - apt-get update -yq
    - apt-get install -yq apt-transport-https build-essential nodejs postgresql postgresql-contrib


    # Install yarn
    - wget -q -O - https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
    - echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
    - apt-get update -yq
    - apt-get install -yq yarn

    # Install packages
    - bundle install --jobs=16 --path $BUNDLE_CACHE
    - yarn install

    - yarn run lint
    - bundle exec rubocop
    - cp config/database.yml.gitlabci config/database.yml
    - RAILS_ENV=$RAILS_ENV bundle exec rails db:create db:schema:load
    - bundle exec rspec
  cache:
    untracked: true
    key: "$CI_BUILD_NAME"
    paths:
      # variables.BUNDLE_CACHEと同じものを指定する
      - vendor/bundle/

staging:
  stage: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=hoge-staging --api-key=$HEROKU_STAGING_API_KEY
  only:
  - master

production:
  stage: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=hoge-production --api-key=$HEROKU_PRODUCTION_API_KEY
  only:
  - production

解説

構成

構成としては
- build
- deploy
の2構造のみです。
buildのscript内に書いてあるライブラリをダウンロードする手続きは、初めはbefore_scripts内に書いていたのですが、deploy時には必要がなく、deployのタイムロスになってしまっていたためbuildのscript内に入れるようにしました。

buildの内容

buildの内容は、大まかに以下の流れになっています
1. nodeのインストール
2. postgresqlのクライアントのインストール
3. yarnのインストール
4. gemとnode_modulesのインストール
5. lintチェック
6. Railsのテスト

postgresqlはservicesで指定を行いimageを利用しています。
そのため、imageのpostgresqlに対応した設定ファイルを用意しなければいけないため、

cp config/database.yml.gitlabci config/database.yml

というコマンドを実行しています。
database.yml.gitlabciの内容は以下の通りになっています。

test:
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  host: postgres
  username: 'postgres'
  password: ""
  database: test_db

また、variablesで渡しているBUNDLE_CACHEというのは、buildに成功した時にbundle installで入れたライブラリをキャッシュさせるために指定しています。この値をcacheのpathsで指定してあげることでキャッシュができ、次回からライブラリのインストールを高速化できます。

deployの内容

deployは至極シンプルで、dplというデプロイを簡単に行えるgemを用いてデプロイを行なっている感じです。(ローカル環境でも同じようにできます)
--api-keyには、herokuのアカウントのAPIキーを指定します。
ここでは、GitLab CIの環境変数にAPIキーを保存しています。
また、masterのbuildが成功した時はstaging環境へdeployし、
productionのbuildが成功した時はproduction環境へdeployを行うようにしています。
ここで少し苦戦したのが、初めmasterはdeployできたのに、productionのdeployは

invalid option "--api-key="

と出て失敗してしまうエラーです。
初め原因がわからなかったのですが、原因はGitLabの環境変数を設定するところで
ProtectedオプションをOnにしていたことでした。(Offにしたら無事deployできました)

まとめ

GitLab CIを初めて触ったのでわからないことが多く苦戦もしましたが、慣れてくると結構便利で重宝しています。
課題としては、buildの時間が少しだけ長いことです。高速化をするいい方法を模索しています。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2