Pythonプロフェッショナルプログラミングを執筆する上で、継続的インテグレーション的なことをやったことについて

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング

PythonプロフェッショナルプログラミングはSphinx+Mercurial+Jenkins+Redmine+SkypeBotの組み合わせで執筆をしていました。
編集のほうで原稿にデザインをあててPDFにするため、最終成果物はその前段階の原稿になります。
それぞれの役割は以下になります

Mercurial, Redmine, SkypeBotについてはすでに会社に環境があるので、それをそのまま使っています。
Mercurialは「Pythonプロフェッショナルプログラミング」に書いてるようなフローでやってました。
また、章ごとにファイルを分割していたので、マージで問題になりにくい構造になっていました。
Redmineは主に情報共有用のWikiとタスク管理、進捗管理に使っていました。
Redmineのチケットはどの程度進んでいるのかを%で入力可能なため、また、親チケットは子チケットの割合を合計して出してくれるので、進捗管理としては便利でした。
SkypeBotはコミット時やRedmineのチケットの変更時に、執筆用のSkype部屋に通知がされるようになっています。
本当はJenkinsでビルドした結果も通知したかったのですが、その辺設定をするのに時間を使いたくなかったので、今回は行っていません。
Sphinxについては清水川さんがbuildoutでインストールできるようにレシピを用意していただきました。
出力はHTMLとPDF、最終成果物用のテキストになります。
ただ、PDFは最終成果物でないのですが、やっぱり本らしくなるとみんなのモチベーションがあがってたため、やっててよかったと思います。
Jenkinsでは、自分が設定していましたが、常時ビルドとTODOの集計をやっていました。
意外とビルドできないということはあったので、これから複数人で本を執筆される方は確実にやったほうがいいです。
あと、TODOの集計は進捗管理的によかったです。
特に今回のように10人以上もかかわると、このような仕組みがなければ全体の把握がしにくい状況でした。
TODOの残り件数や、どこに多く残っているのか逆にどこがTODOがないのか、というのを見るだけでも、誰の進捗が悪くなってるのか、誰が進んでいるのかを把握できます。
また、JenkinsのワークスペースにビルドしたHTMLとPDFがあるため、JenkinsのトップページやJobの画面の説明に、ドキュメントのリンク先を記述していました。
成果物が今どうなのかが手軽に確認ができて好評でした。
特に社内レビュー時に最新のものがどこにあるのか一目にわかるため、このやり方はよかったと思います。

以降、今回用にJenkinsやサーバに何をしたのかを書いておきます。
Jenkinsのインストールは、Debian6であったため、Jenkins公式のdebインストール方法で行いました。
Jenkinsサーバには、以下のものをインストールしてます。

  • Python
    • easy_install
    • pip
    • virtualenv
    • virtualenvwrapper
    • mercurial
  • texlive
    • SphinxでPDFを出力させるため

サーバの設定として、文字化け対策として/etc/environmentに LANG="ja_JP.UTF-8", LC_ALL="ja_JP.UTF-8"追加してます。

Jenkinsプラグインには以下のものをインストールしてます。

  • Mercurial plugin
  • Task Scanner Plug-in
    • TODOの集計
  • disk-usage plugin
    • 使用ディスク容量の確認用(JenkinsはDiskをかなり消費するため)

あと、JobConfigHistory Plugin は今回インストールしてないですが、インストールしたほうがいいものなので、お勧めします。

Jenkins自体の設定としては以下になります。

  • 「システム設定」の「Global properties」の「環境変数」のチェックボックスをOnにし、キーにPATH、バリューに/usr/local/texlive/2011/bin/i386-linux:/usr/local/bin:/usr/bin:/bin:$PATHを指定
    • SphinxでPDFに出力させるため
  • 「システム設定」の「アクセス制御」で、Jenkinsに認証を設定
    • 社外からもアクセスするため、認証は設定したが認可は設定せず
  • MercurialSSHでパスワードなしでPullできるように設定
    • リポジトリが別サーバなため、リポジトリサーバにSSHあたりの設定も必要
    • Jenkins側のSSH鍵は/var/lib/jenkins/.ssh
    • HTTPSでの認証だと、IDとパスワードが必要だったので、Jenkinsで使うには不向き(URLにIDとパスワードで可能だが、セキュリティ的にアウト)
  • リポジトリを5分に1回ポーリング
    • フックスクリプトは設定してもいいですが、こっちのほうが手軽なので
  • Jobの設定で、「ビルド後の処理」の「未解決タスクの集計」のチェックボックスをOnにし、「集計対象」を**/*.rst、「集計対象外」をsphinx/**/*.*、「タスクタグ」にTODOを追加
    • 「集計対象外」を指定しないと、要らないものまで集計してしまうため
  • Jobの設定で、「シェルの実行」では初回だけvirtualenvをactivateし、buildoutを実行。あとはHTMLとPDFを出力するように設定
  • Jenkinsのトップページと、Jobのページの「説明」にワークスペース内のHTMLとPDFのリンクを記述
    • ブックマーク代わり

設定はこんな感じで意外と多そうに見えますが、やってみるとそんなに難しくないはずです。
わからないところがありましたら、個別に聞いてください。

最後に、こういうことをしていても、執筆作業というのは不慣れということもあり、やはり大変でした。
逆に、やっていないともっと大変だったと思います。
この記事が皆さんの参考になれば幸いです。