GitLab Meetup Tokyo #1 で発表した ここがすごいよGitLab CI はreveal-ckを使ってたのですが、GitLab CIでビルドするにあたって幾つか工夫した点があるので紹介します。
たぶん他のツールを使う場合にも応用できると思います
スライドのリポジトリ
今回紹介しているTipsは全部このリポジトリからの引用です
reveal-ckとは?
reveal.js をちょっと便利にしたラッパツールのようなものです。
詳しくは下記で紹介しています
reveal.js + markdownでスライドを作る時は reveal-ck が便利だった - くりにっき
GitLab CIでreveal-ckをビルドする時のTips
reveal-ckはbundlerで依存管理する
下記内容で Gemfile
を作成。
# frozen_string_literal: true
source "https://rubygems.org"
gem "reveal-ck"
bundle install
を実行。作成された Gemfile.lock
をコミット。
.gitlab-ci.yml
を下記のように設定
variables:
BUNDLE_CACHE: "vendor/bundle/"
cache:
untracked: true
key: "$CI_BUILD_NAME"
paths:
# variables.BUNDLE_CACHEと同じものを指定する
- vendor/bundle/
before_script:
- bundle check --path=${BUNDLE_CACHE} || bundle install --path=${BUNDLE_CACHE} --jobs=2 --retry=3
理由
- インストールしたgemをGitLab CIのキャッシュに載せるため
- 毎回
gem install reveal-ck
すると遅い - 上記のような設定にしておくとビルドが正常終了にした時にRunnerにキャッシュが保存されるので、次に同じRunnerでビルドされた時にキャッシュからgemが読まれてビルドが早くなる
- 毎回
- 依存してるgemのバージョンをロックするため
- reveal-ckに限ったことではないですが、最新になった時に急に動かなくなることがあるので依存しているgemも含めてバージョンは固定しておいた方が安全
- 以前reveal-ckの中で使ってるcelluloidのバージョンが上がった時にreveal-ckが動かなくなるという事象があり、
Gemfile
でcelluloidを古いバージョンで固定する必要があった 1
Rakefileでコマンドを短縮する
普通に reveal-ck generate
するとslidesディレクトリにスライド一式が作られるのですが、GitLab Pagesに公開するためにはpublicディレクトリに静的ファイルを作る必要があります
.gitlab-ci.yml
くらいなら reveal-ck generate --dir=public
って書いてもいいと思うんですが、ローカルで毎回 --dir=public
って書いて実行するのも大変なので自分は Rakefile
でラップしています。2
さっき作った Gemfile
にrakeを追加して
# frozen_string_literal: true
source "https://rubygems.org"
gem "rake"
gem "reveal-ck"
Rakefileを作成
DIST_DIR = "public"
desc "generate slide to #{DIST_DIR}/"
task :generate do
sh "reveal-ck generate --dir=#{DIST_DIR}"
end
desc "serve slide"
task :serve => :generate do
sh "reveal-ck serve --dir=#{DIST_DIR}"
end
task default: :serve
bundle exec rake generate
でpublicディレクトリにスライドを作って、bundle exec rake serve
でローカルでサーバを実行してスライドを表示
publicディレクトリが存在しない場合に serve
を実行するとサーバは実行できるけどスライドが表示できないため、:serve => :generate
で serve
の前に明示的に generate
を実行しています。
task default: :serve
は rake
にタスク名が渡されなかった場合に実行したいタスクを設定。
今回の場合だと bundle exec rake
で serve
が実行されます。
bundle exec ~
なんてtypeしたくない人は ~/.bashrc
辺りにalias設定推奨
alias be='bundle exec'
あと、ローカルで作ったpublicディレクトリがコミットされないように .gitignore
に下記を書いておくといいでしょう。
public/
GitLab CIでのデプロイ時にもRakefileで作ったコマンドを使うように設定
pages:
stage: deploy
script:
- bundle exec rake generate
artifacts:
paths:
- public
only:
- master
-
まあローカル実行時にslidesディレクトリを使ってもいいんですが、本番とローカルの状態は合わせておいた方が何かと健全なのでローカル実行時もpublicディレクトリ使うようにしています ↩