Dockerを使ってCircle CIでLatexをビルドできるようにしてみた


Latexを使って文章を書いている際に，Githubにpushしたら自動的に最新版のpdfがreleaseブランチにあるといいなーと思いやってみました．

# 概要
* LatexをビルドできるDockerImageを作った
	* https://github.com/Oga-Jun/docker-latex
	* DockerHubに公開してます(https://hub.docker.com/r/ogajun/latex/)
* このDockerImageを使ってCircleCIでLatexファイルからpdfを生成する
* CircleCIからリポジトリのreleaseブランチへ生成されたpdfファイルをpushする

# 手順
Latex文書を管理しているリポジトリがあることを前提とします．

## CircleCIのプロジェクトにリポジトリを追加する
Circle CIの画面左の「ADD PROJECTS」から，対象リポジトリを追加しておいてください．

## ビルドするためのスクリプトをリポジトリに追加
https://github.com/Oga-Jun/docker-latex/blob/master/latex_build.sh

先のDocker ImageのDockerfileを置いてあるリポジトリ内にスクリプトを置いているので，これビルド対象のリポジトリにおいてください．

中身は`docker run`をする単純なものです．

置くのが嫌な場合は，後に述べる`circle.yml`の`latex_build.sh`の部分を中身のコマンドのように書き換えてください

## CircleCIにpush用の鍵を追加
CircleCIがデフォルトで用意する鍵はread-onlyなので，リポジトリにpushすることができません．
そこで，自分でwrite/read権限をもった鍵をリポジトリに登録しなくてはなりません．

まず，今回のプロジェクトのCircle CI専用の鍵を作成します

`ssh-keygen -f ./circle_ci_push_key`

パスフレーズは設定しないようにしてください．

次に，CircleCIの「BUILDS」から，対象リポジトリをクリックすると下の画面に行くので，「Project Settings」をクリックします．
![Screen_Shot_2016-07-22_at_16_33_16.png](https://qiita-image-store.s3.amazonaws.com/0/51353/4046ac9e-5435-216e-3e93-aeff35b39ce7.png "Screen_Shot_2016-07-22_at_16_33_16.png")

Project Settingsの画面で`SSH Permissions`というメニューがあるので開きます．

下のように`Hostname`には`github.com`を，`Private Key`には先程生成した鍵ペアの秘密鍵(`circle_ci_push_key`)の内容を貼り付け，submitします．
![Screen_Shot_2016-07-22_at_16_41_00.png](https://qiita-image-store.s3.amazonaws.com/0/51353/84a1cc38-5e41-0fe9-8d0e-642c061926d3.png "Screen_Shot_2016-07-22_at_16_41_00.png")

これで，githubへのpush時にこの鍵を使ってくれるようになりました．

## CircleCIに追加した鍵ペアの公開鍵をGithubのリポジトリへ登録
Githubの対象リポジトリの[Settings]>[Deploy keys]>[Add deploy key]にて先ほどの公開鍵を登録します．

![Screen_Shot_2016-07-22_at_16_47_21.png](https://qiita-image-store.s3.amazonaws.com/0/51353/e080e591-ab3b-8988-3b7f-ef43e2872e04.png "Screen_Shot_2016-07-22_at_16_47_21.png")


## `circle.yml`の追加
適宜リポジトリ名や対象ファイル名，メールアドレスやユーザネームは置き換えてください．

```circle.yml
general:
  branches:
    only:
      - master

machine:
  timezone:
    Asia/Tokyo
  services:
    - docker

dependencies:
  pre:
    - docker pull ogajun/latex
    - git config --global user.email 'email address'
    - git config --global user.name 'user name'
    
test:
  override:
    - cd <リポジトリ名> && ./latex_build.sh <ビルド対象のtexファイル名>

deployment:
  release:
    branch: master
    commands:
      - cd <リポジトリ名>
      - git checkout -b release
      - git add --all :/
      - git commit -m "[ci skip] build pdf"
      - git push -f origin release
```

## ビルド
あとは`master`に`push`されれば毎回最新のPDFが`release`ブランチに！！！

私の場合は`README.md`に`release`ブランチのPDFファイルへのリンクを掲載しております．

# Dockerfileについて

Latexビルドのための`Dockerfile`は次のようになっています．
(https://github.com/Oga-Jun/docker-latex)

```Dockerfile
FROM ubuntu:xenial
MAINTAINER Junya Ogasawara <like.bump.oga@gmail.com>

RUN set -x && \
      sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list && \
      apt update && apt -y upgrade && \
      apt -y install git wget software-properties-common && \
      apt-add-repository -y ppa:texlive-backports/ppa && \
      apt -y install texlive-lang-cjk latexmk && \
      wget http://mirrors.ctan.org/macros/latex/contrib/docmute.zip && \
      unzip docmute.zip && \
      mv docmute /usr/share/texmf/tex/latex/ && \
      mktexlsr && \
      kanji-config-updmap-sys auto

WORKDIR /data
VOLUME ["/data"]
```

## やっていること
1. ミラーをjaistに変更 (ローカル開発用)
2. `apt`の更新
3. `git`, `wget`, `software-properties-common`をインストール
	* `software-properties-common`は`apt-add-repository`コマンドを追加するためです
4. texliveインストールのためのリポジトリ追加
5. texliveのインストール及び，latexmkのインストール
6. docmuteのダウンロードとインストール
	* docmuteについてはこちらを参照のこと
		* http://d.hatena.ne.jp/zrbabbler/20150906/1441509908
	* 僕が個人的に利用しているためインストールしています．
7. `mktexlsr`でdocmuteの有効化
8. 最後に，PDFへのフォント埋め込みを有効化

しています．

# 何が良くなったのか？
特にこれが幸せになったと感じられるのが無かったのが正直なところです...

が，masterでpdf管理をしなくて良くなったので，コミットごとに一々差分が生じなくなったのがハッピーです．

加えて，このDockerImageを使うことでローカルを汚さずにlatexをビルドできますね！