BitbucketとCircle CIでLatexする

前回からだいぶ空いてしまったが,小ネタを投下する. 以前に,

Jenkins+Bitbucket(Git)でLaTeX - めもちょー

という記事を書いた. ここでは,CIを用いてlatexdiffによる差分Latexの生成, コンパイル,Downloadsへのアップロード を行うようなものを作ってみた.

Bitbucketは現在,PiplinesというCIのサービスを提供しているが, Circle CIと比較して,一ヶ月あたりの無料枠が小さいため, ここではCircle CIを利用する. なお,Circle CI 2.0を対象とする.

TL;DR

config.yml for Latex on Circle CI 2.0

既存のDockerイメージの利用

Latex環境構築,特に日本語文書を扱う場合,やや手続きが煩雑となるが, Circle CIでは任意のDockerイメージが利用できる. ここでは, paperist/alpine-texlive-ja[1] を使わせてもらった.

準備

先のDockerイメージは小さくて良いのだが,いくつかこの後必要となる ものがないので,それらをインストールする.

apk add --update git patch curl
apk add --update ca-certificates openssl && update-ca-certificates
tlmgr install ulem latexdiff

latexmkを利用するために,.latexmkrcを置いておく. あまり良いやり方ではないが, リポジトリに元となるファイルを含ませておく.

cp .latexmkrc ~/.latexmkrc

Latexファイルのコンパイル

普通にやる.後でartifactsをアップロードするため, /tmp/artifactsにまとめておく.

latexmk main.tex;
mkdir /tmp/artifacts;
cp main.pdf /tmp/artifacts/

diffの作成とコンパイル

これも普通にやる.日本語だと[2] にあるような問題があるため, パッチを当てる必要があったりする. また,BibTeX周りもちゃんとやらなければならないのだが, ここではやらない.

latexdiff-vc -e utf8 --git -r HEAD^ -r HEAD main.tex;
latexmk main-diffHEAD^-HEAD.tex;
cp main-diffHEAD^-HEAD.pdf /tmp/artifacts/

BitbucketのDownloadsへのアップロード

基本的には[3] の通り行う.Bitbucketで作成したApp Passwordを Circle CI側にEnvironment Variableとして与えてやる. 以下のようにartifactsをcurlを使ってアップロードする.

curl -X POST "https://${BB_AUTH_STRING}@api.bitbucket.org/2.0/repositories/${CIRCLE_PR    OJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/downloads" --form files=@"/tmp/artifacts/main.pdf";
 curl -X POST "https://${BB_AUTH_STRING}@api.bitbucket.org/2.0/repositories/${CIRCLE_PR    OJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/downloads" --form files=@"/tmp/artifacts/main-diffHEAD^-HEAD.pdf";

まとめ

ざっくり説明をしてみた. Circle CI 2.0向けの資料は公式ドキュメントが揃っているとはいえ まだそんなに多くない印象. App Passwordだけは外に漏らさないようにしたい.

[1] http://3846masa.hatenablog.jp/entry/2017/02/08/215920

[2] http://quickhack.net/nom/blog/2013-06-16-latexdiff-for-japanese-documents.html

[3] https://confluence.atlassian.com/bitbucket/deploy-build-artifacts-to-bitbucket-downloads-872124574.html