はじめに
卒論の執筆にあたり、私はMac, Windows, Linux系のどれもよく使うのでそれぞれでのLaTeXの環境構築がネックでした。
また、いちいち指導教員に見せるのもすら面倒だったのでそれならGithHubにLaTeXのソースをpushすればtravis-ciでpdfをビルドし、Dropboxにアップロードしてそれを指導教員にメールで通知とするところまで自動化すれば私は執筆に集中できる!と考えました。
この記事ではdockerとかtravis-ciなどの細かい説明はしません。
dockerを選んだ理由
手元のマシンにいちいちMacTexとかTexLiveとか入れるのめんどい。。。
ということでdockerであらかじめLaTeXのビルド環境を構築しておいて各ローカルマシンでそれを走らせればローカル環境の差をなくせるし、travis-ciでもいちいちaptでtexliveをインストールするよりdocker pullするだけで環境構築できるので楽だということです。
dockerのイメージについて
ベースはdebian-stable-slimとしてaptでtexliveを構築します。
alpineでインストーラをダウンロードしてインストールすることも考えましたが、後々何かを追加したい時にaptがあると便利なのでdebianをベースイメージとして採用しました。
不要な言語環境やドキュメントは削除することでイメージサイズを削減します。
最終的にイメージサイズは405MBになりました。
色々工夫すればもう少しダイエットできそうですがこのくらいにしておきます。
FROM debian:stable-slim
RUN apt update && \
apt upgrade -y && \
apt install fonts-ipafont fonts-ipaexfont texlive texlive-formats-extra texlive-science texlive-lang-japanese -y && \
apt purge *-doc* *chinese* *korean* *thai* -y && \
apt clean -y && \
apt autoremove -y && \
apt autoclean -y && \
mkdir /workdir
WORKDIR /workdir
VOLUME ["/workdir"]
CMD ["bash"]
このイメージはDockerHubに公開しているので以下のコマンドで取得可能です。
$ docker pull johejo/debian-latex-jp
ビルド
作成したイメージをデーモンとして走らせます。
デーモンにする理由は単に私の好みです。
基本的に私はdockerを使うときはデーモンで起動して入力はdocker execでするようにしています。
$ docker run --name latex-env -itd -v $PWD:/workdir johejo/debian-latex-jp
$ docker exec latex-env bash -c "SOME LATEX COMMAND"
Dropboxへのアップロード
curlを用いたDropboxへのアップロードツールを用います。
andreafabrizi/Dropbox-Uploader
通常はこのスクリプトを初めて実行した時にトークンの設定ができるのですが、今回は自動化が目的ですのでトークンを環境変数から読み込みます。
homeディレクトリに.dropbox_uploaderという名前でトークンを書き込んでおくとそれを使ってくれます
アップロードスクリプトはこんな感じです
#!/bin/bash
readonly BUILD_DIR=build
readonly DROPBOX_UPLOADER_URL=https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh
curl $DROPBOX_UPLOADER_URL -o dropbox_uploader.sh
chmod +x dropbox_uploader.sh
echo "OAUTH_ACCESS_TOKEN=($DROPBOX_TOKEN)" > ~/.dropbox_uploader
./dropbox_uploader.sh upload $BUILD_DIR/hoge.pdf .
rm -f ~/.dropbox_uploader
travis-ci
GitHubのリポジトリと連携してCIするサービスですが、スクリプトを設置することで色々な自動化に使えます。
今回はtravis-ciの通知機能でビルド完了時にメールを送るようにしています。
ここら辺はslackに置き換えるのも良いでしょう。
あらかじめtravis-ciの設定でDropboxのトークンを環境変数としてセットしておく必要があります。
service: docker
language: bash
notifications:
email:
- foo@bar.com
on_success: always
on_failure: never
addons:
apt:
packages:
- curl
before_install:
- docker run --name latex -itd -v $PWD:/workdir johejo/debian-latex-jp:latest
script:
- docker exec latex bash build.sh
- ./upload.sh
最後に
快適で手軽な執筆のためでしたが私はこの環境を作り上げるまでに割と時間がかかって執筆がおろそかになりました。