はじめに
最近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の時間が少しだけ長いことです。高速化をするいい方法を模索しています。