CircleCIを使用してLaTeX文書を自動コンパイルし、PDFファイルをDropboxに自動アップロードする方法
概要
CircleCIを使用して、GitHubにpushするたびにLaTeX文書を自動コンパイルし、生成されたPDFファイルを自動でDropboxにアップロードする方法のメモ。
なぜDropboxに上げるのか? --- 普段はVisual Studio Code + LaTeX Workshopを使って文章を書いているんだけど、PDFのチェックはKindle Fireでやりたい&Kindle Fireで手軽にPDFを閲覧する方法の一つがDropboxだったので。
CircleCIもDockerも初めて使うので何かおかしなところがあるかも知れません。
以下、Gitリポジトリ内のファイル構造は以下のようになっていると仮定する:
- src/ - thesis/ # 論文のファイルを格納しているディレクトリ - main.tex # 論文のメインファイル - slides/ # スライドのファイルを格納しているディレクトリ - main.tex # スライドのメインファイル
このときに、
- thesis.pdf - slides.pdf
のようなファイルがDropbox内に生成されるようにしたい。
解説
以下の3つのファイルを作成する:
.circleci/config.yml
: CircleCI用の設定ファイルcompile.sh
: LaTeX文書をコンパイルするためのShell Scriptupload.sh
: コンパイル後のPDFをDropboxにアップロードするためのShell Script
このとき、ファイル構成は以下のようになる:
- .circleci/ - config.yml - src/ - thesis/ # 論文のファイルを格納しているディレクトリ - main.tex # 論文のメインファイル - slides/ # スライドのファイルを格納しているディレクトリ - main.tex # スライドのメインファイル - compile.sh - upload.sh
.circleci/config.yml
には以下のような記述をする:
version: 2 jobs: build: docker: - image: texlive/texlive-full steps: - checkout - run: name: Install dependencies command: | apt update apt install -y curl - run: name: Build PDF command: ./compile.sh - run: name: Upload to Dropbox command: ./upload.sh
upload.sh
でcurl
を使用するのでcurlをインストールしていますが、texliveとcurlの入ったDockerイメージを作成してそれを使用するのが正攻法なのかも知れません(筆者はDocker初心者なのでその辺がよく分かっていません)が、面倒なので上のような方法を取っています。
compile.sh
には以下のような記述をする:
#!/bin/sh for infile in src/*/main.tex; do outdir=$(dirname "${infile}") latexmk $infile -pdf -outdir=$outdir -halt-on-error done
upload.sh
には以下のような記述をする:
#!/bin/sh for infile in src/*/main.pdf; do tail="${infile#*/}" outfile="$(dirname "${tail}").pdf" echo "Upload $infile to $outfile" curl --fail -X POST https://content.dropboxapi.com/2/files/upload \ --header "Authorization: Bearer ${DROPBOX_TOKEN}" \ --header "Dropbox-API-Arg: {\"path\": \"/$outfile\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}" \ --header "Content-Type: application/octet-stream" \ --data-binary @$infile \ || exit 1 echo done echo echo "Success!"
compile.sh
とupload.sh
についてはchmod 755
を行っておく必要がある(でないと、command: ./compile.sh
などの実行の際にpermissionのエラーが出る)。
CircleCIでAdd Projectsから上記のリポジトリを追加する。
HTTP - Developers - Dropboxの<get access token>
をクリックしてAccess Tokenを取得し、CircleCIの設定画面(歯車のアイコンをクリック)してEnvironment Variablesの画面へ行き、Name
をDROPBOX_TOKEN
、Value
を先ほど取得したAccess Tokenにして入力を行う。