GitLab CIでreveal-ckをビルドする時のTips

More than 1 year has passed since last update.

GitLab Meetup Tokyo #1 で発表した ここがすごいよGitLab CI はreveal-ckを使ってたのですが、GitLab CIでビルドするにあたって幾つか工夫した点があるので紹介します。

たぶん他のツールを使う場合にも応用できると思います


スライドのリポジトリ

https://gitlab.com/sue445/gitlab-meetup-tokyo-1

今回紹介しているTipsは全部このリポジトリからの引用です


reveal-ckとは?

https://github.com/jedcn/reveal-ck

reveal.js をちょっと便利にしたラッパツールのようなものです。

詳しくは下記で紹介しています

reveal.js + markdownでスライドを作る時は reveal-ck が便利だった - くりにっき


GitLab CIでreveal-ckをビルドする時のTips


reveal-ckはbundlerで依存管理する

下記内容で Gemfile を作成。


Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

gem "reveal-ck"


bundle install を実行。作成された Gemfile.lock をコミット。

.gitlab-ci.yml を下記のように設定


.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を追加して


Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

gem "rake"
gem "reveal-ck"


Rakefileを作成


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 => :generateserve の前に明示的に generate を実行しています。

task default: :serverake にタスク名が渡されなかった場合に実行したいタスクを設定。

今回の場合だと bundle exec rakeserve が実行されます。

bundle exec ~ なんてtypeしたくない人は ~/.bashrc 辺りにalias設定推奨


~/.bashrc

alias be='bundle exec'


あと、ローカルで作ったpublicディレクトリがコミットされないように .gitignore に下記を書いておくといいでしょう。


.gitignore

public/


GitLab CIでのデプロイ時にもRakefileで作ったコマンドを使うように設定


.gitlab-ci.yml

pages:

stage: deploy
script:
- bundle exec rake generate
artifacts:
paths:
- public
only:
- master





  1. https://github.com/jedcn/reveal-ck/issues/58 



  2. まあローカル実行時にslidesディレクトリを使ってもいいんですが、本番とローカルの状態は合わせておいた方が何かと健全なのでローカル実行時もpublicディレクトリ使うようにしています