GitLab CI/CD を使って、GitLab.com 上で管理しているリポジトリから Jekyll を使って静的なサイトを構築し、
ドラフト版(master以外)は GitLab Pages で、
本番(master)は外部のサイト (FTPS接続を受け付けている) で公開するという運用をしています。
この場合に注意することをメモします。
ポイント
- GitLab Pages で公開される URL はプロジェクト名から自動生成されるため、本番サイトとルートの場所が違う構成になる場合がある。その場合はbaseurl 設定をコマンドライン引数(例:
--baseurl "/")により変更してビルドを分ければ良い。コマンドライン引数による設定は、_config.ymlによる設定よりも優先される。 - とりあえず、Docker Image としては、Ruby 公式を使えば良さそう。この Docker Image では
aptが使えるので、必要なライブラリなどはapt-getでインストールできる。 - 本番サイトへのアップロード手段としてFTP, FTPS, SFTPなどが使えるのであれば、lftp を使うのが比較的簡単。このパッケージはデフォルトでは入っていないので、CIのレシピ中でインストールする。
- 毎回、Bundler を再構成していると無駄が多いので、キャッシュを使うと良い
参考: Create a GitLab Pages website from scratch -
.gitlab-ci.ymlに直接FTPパスワードを書くのはセキュリティ上推奨できないので、環境変数を使うと良さそう。
参考: GitLab CI: Deploy to FTP / SFTP with lftp
TODO: インクリメンタルビルドを使ってJekyllのサイト構築の時間を減らせる可能性があるが、キャッシュを使っても今の所想定通りの動作にならない。
使っている .gitlab-ci.yml の内容
image: ruby:latest
variables:
JEKYLL_ENV: production
LC_ALL: C.UTF-8
# DST_DIR is used to set root directory for HTTP(S) service.
DST_ROOT: www/jk
# DST_DIR is used as base-url, it might be '/'.
DST_DIR: /
cache:
paths:
- vendor/
- dist/
- .jekyll-metadata
before_script:
- bundle install --path vendor
- apt-get update -qy
- apt-get install -y git-restore-mtime
pages:
stage: deploy
script:
- /usr/lib/git-core/git-restore-mtime
- bundle exec jekyll build -I -d public
artifacts:
paths:
- public
except:
- master
build_pages:
stage: build
script:
#- ls -l dist/
- /usr/lib/git-core/git-restore-mtime
- bundle exec jekyll build -V -I -d dist --baseurl "$DST_DIR"
#- ls -l dist/
only:
- master
upload:
stage: deploy
script:
- date
#- ls -l dist/
- apt-get install -y lftp
- lftp -e "set ftp:ssl-allow yes; open $FTP_SERVER; user $FTP_USERNAME $FTP_PASSWORD; mirror -X .* -X .*/ --reverse --only-newer --verbose dist/ $DST_ROOT$DST_DIR; bye"
only:
- master
-
master以外のブランチでは Jobpagesで GitLab Pages 向けのデータをビルドします。 -
masterブランチでは Jobbuild_pagesでデータの生成を行い、uploadで本番環境にアップロードしています。 - 対象のサーバが FTPS に対応していない場合は、
set ftp:ssl-allow noに変更してご利用下さい。