Gitlab-runnerでpdfをデプロイ
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分まで無料で使えるのだが、
- コンパイルに時間が掛かるlualatexを使用している
- フォント、クラスファイルが自分の環境に徹底的に依存している
と言うことでrunnerを自分のマシン、自分のアカウントで実行することにする。まあ、なんと言うか、作業用とbuild用に全く同じ内容のワーキングツリーを二つ同じマシンに展開していて、その間の連携のためにインターネットにパケットを飛ばすと言う富豪状態ではあるのだが。。。
.gitlab-ci.ymlを準備
Makefileができたら自動で呼び出すだけ。毎回全てのpdfを生成しないように生成したpdfをキャッシュとして残すことで、makeが新規生成したpdfだけが「デプロイ」されるようにした。デプロイと言ってもステージは一つだけ。
cache:
paths: 0*/*.pdfmake 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に乗り換えたおかげで思わぬ省力化が実現できました。