Gitlab-runnerでpdfをデプロイ

Shuji Narazaki
text-is-saved
Published in
5 min readJun 15, 2018

emacs(magit) -> git push -> gitlab-runner -> make -> nextcloud

gitlabを最近使い始めた。手元の環境でCI/CDができるのは面白い。

ほぼ365日texでpdfを作っている者として、この機能を使った作業の自動化をしてみた。仕様要件は以下の通り。

  • 一つのプロジェクトは複数のサブディレクトリを持ち、その中に複数個ずつtexファイルがある。ただし自前のクラウド(nextcloud)にはサブディレクトリなしでpdf ファイルだけを置きたい。
  • gitのcommit idをそれぞれのpdfのページのフッターに置きたい。(これはgitのフックなどを使ってgitからignoreされるtexファイルを自動生成することで実現。)
  • 各OSでクラウドと自動同期するデーモンが動いているので、あるディレクトリにファイルを置くだけで自動でアップロードされる。

Makefileを準備

これまで個別にtexファイルを修正して、手動でできたpdfをコピーしていたので自動化のためにmakeを使うことにした。サブディレクトリに分散したtexファイルおよびpdfファイルをどうやって集約するかに悩んだ(ルールとしてはターゲット名からソース名を構成しないといけない。逆方向は一意なのだが。)。結局 VPATH を使って勝手に探索させることにした。

VPATH = $(wildcard 0*)
.SUFFIXES: .tex .pdf
sources = $(wildcard 0*/*.tex)
targets = $(sources:.tex=.pdf)
cloud = ${HOME}/nextCloud/PDF
onclouds = $(addprefix $(cloud)/, $(notdir $(targets)))
.PHONY: deploydefault: cid.tex $(targets)deploy: cid.tex $(onclouds)cid.tex:
git log -1 format="format:\gdef\\GITCommitID{%h}%n" > cid.tex
.tex.pdf:
cd $(dir $<); latexmk $(notdir $<)
$(onclouds): $(cloud)/%.pdf: %.pdf

※ cid.texが本体のtexからincludeされ、フッターとして使われる。

runnerを準備

このmakeを実行するために自前のPCと言うか普段使っているデスクトップPCにgitlab-runnerをインストール。

わざわざインストールしなくてもgitlab.comが提供する共有ランナーが月2000分まで無料で使えるのだが、

  1. コンパイルに時間が掛かるlualatexを使用している
  2. フォント、クラスファイルが自分の環境に徹底的に依存している

と言うことでrunnerを自分のマシン、自分のアカウントで実行することにする。まあ、なんと言うか、作業用とbuild用に全く同じ内容のワーキングツリーを二つ同じマシンに展開していて、その間の連携のためにインターネットにパケットを飛ばすと言う富豪状態ではあるのだが。。。

.gitlab-ci.ymlを準備

Makefileができたら自動で呼び出すだけ。毎回全てのpdfを生成しないように生成したpdfをキャッシュとして残すことで、makeが新規生成したpdfだけが「デプロイ」されるようにした。デプロイと言ってもステージは一つだけ。

cache:
paths: 0*/*.pdf
make deploy:
stage: build
script: make deploy

これでほぼ設定終了。コミットするとGitlab CI/CDによって自動でnextcloudに配置され、ノートPCでそのフォルダーを開くとpdfがプレゼンを待っているという状況が作れた。

gitlab-runnerを設定

最後にgitlab-runnerを常に走らせておくため、systemdに登録しておく。~/.config/systemd/user/gitlab-runner.service を以下の内容で作成して enable & start。

「Unit]
Description=deamonize a user level gitlab-runner
[Service]
Type=simple
ExecStart=/usr/bin/gitlab-runner run
[Install]
WantedBy=default.target

githubを使っている時はこんな利用は想定していなかったので、gitlabに乗り換えたおかげで思わぬ省力化が実現できました。

--

--

Shuji Narazaki
text-is-saved

Studying SAT solvers and symbolic computation (type and logic). Being into 円城塔, Greg Egan, Stephen Colbert, 酒見賢一, say a Sci. Fi. person.