メモ帳

備忘録

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 Script
  • upload.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.shcurlを使用するので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.shupload.shについてはchmod 755を行っておく必要がある(でないと、command: ./compile.shなどの実行の際にpermissionのエラーが出る)。

CircleCIでAdd Projectsから上記のリポジトリを追加する。

HTTP - Developers - Dropbox<get access token>をクリックしてAccess Tokenを取得し、CircleCIの設定画面(歯車のアイコンをクリック)してEnvironment Variablesの画面へ行き、NameDROPBOX_TOKENValueを先ほど取得したAccess Tokenにして入力を行う。

参考にしたサイト

qiita.com