Jenkins Violations PluginのPyflakes対応(PEP8の動作確認も)

ローカルで一応動いたので報告を。

使い方は、Jobの設定でPyflakesの項目が増えてるので、そこにPyflakesの出力結果ファイルを指定してください。
PyflakesはPylintみたいなアラートの種類や段階がないため、全部HIGHT(赤)にしています。


まだコミットできてはないですが、いち早く使ってみたい方はどうぞ。
http://dl.dropbox.com/u/191349/0.7.11-SNAPSHOT/violations.hpi
正式版については気長にお待ちください。


ちなみに、だいぶ前のPEP8対応もちゃんと動いています。
ただし、Django-Jenkins使う場合は、PEP8(とPyflakes)を全部Pylint形式に変換するみたいで、そこがはまりポイントかと。

Jenkins Mercurial Pluginで、毎回リポジトリがクローンされる問題

表題とおり、特にリポジトリを初期化するような設定をしていないのに、毎回リポジトリがクローンされることがあります。
その結果、いちからフルビルドして遅い、ということになるため、できれば解決したい問題です。
自分のところで発生した条件として、file://を使ってる場合でした。
他にも、似たような事例があるようです。
http://jenkins.361315.n4.nabble.com/Global-properties-and-SCM-td1153304.html
http://d.hatena.ne.jp/junkimu/20120222/1329998187


原因はローカルリポジトリが指し示しているリモートリポジトリが、そもそも違うものになっているかどうかをチェックするために行っている処理でした。
具体的には、'hg paths.default'コマンドを実行し、その出力結果をワークスペースにあるローカルリポジトリのパスと比較することをやっています。
リポジトリが違うと判定されると、毎回リポジトリがクローンされます。


とりあえず、自分のところで発生した条件(file://)の場合については、JIRAに起票済みで、pull requestも出してます。
修正したプラグインは、以下においてます。
http://dl.dropbox.com/u/191349/1.39-SNAPSHOT/mercurial.hpi
1.459で確認しましたが、1.421以上のバージョンなら、問題ないはずです。


他の条件については、再現をさせないと確認しようがないので、自分の環境で起きたらそのつど対応しようと思っています。
どこを直せばいいかについては、ここのcanReuseWorkspaceメソッドを見てもらえればいいとおもいます。

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のリンクを記述
    • ブックマーク代わり

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

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

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

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

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

清水川さんのブログですでに紹介されていますので、目次などはそちらで読んでください。
ちなみに自分も関わっていまして、第9章:Jenkinsで継続的インテグレーションを担当*1しました。
PythonでJenkinsを使いたいけど何をしたらいいかわかないという方なら、参考になる内容だと思います。


全体的にPythonプログラミングテクニック的なものではなく、Pythonという言語と開発環境を使う上でビープラウドではどういうノウハウでやっているか、ということがメインになっています。
なので、エキスパートPythonプログラミングとはアプローチが違った本になっていると思います。


余談ですが、この本はSphinx+Mercurial+Jenkinsという組み合わせで執筆していました。
今回のように多人数(10人以上)で執筆する上では、この組み合わせは大変良かったです。
何が良かったかなどは、後日ブログにてまとめようと思っています。

*1:自分以外にもoyakataも

Jenkinsのプラグインをアップデートすると、アップデートがされない場合の対処

実際プラグインをアップデートするとアップデートがされないということ起きましたが、id:ssogabeTweet通りにするとうまくいきました。

家サーバでのJenkinsの環境について

ohtaketやid:ssogabeTwitterでやり取りしていて、意外とみんなどうしているのか気になるんじゃないかと思いましたので、自分の場合をご紹介しよう思いました。


家のWebサーバの構成は、Apache(+mod_jk)↔Tomcat6の構成になります。
全部一つのサーバに入っています。
Tomcat6については別に7のほうがいいと思うのですが、バージョンアップをサボってるだけです。
で、なんでこういう構成になっているかというと

  • Jenkins以外のアプリも一緒のサーバで動かしたい。
  • リバースプロキシ(Apache)をかますことで、運用を柔軟にしたい。

ということぐらいです。
なのでJenkinsのみの専用サーバがあるのなら、TomcatじゃなくてaptやyumでインストールしたJenkins(Winstone)でインストールする方が楽なのでそっちをお勧めします。
あと、個人で使う分にはいいんですが、仕事となると沢山のURLを覚えるのは面倒なので、社内サービスの窓口はリバースプロキシでまとめておくほうが楽だと思います。


認証はJenkins自体に認証をかけて勝手にJobの実行はできないようにはしてますが、見る分には制限をかけなくていいと思っています。
見る制限をかけるのなら、リバースプロキシ側で制限をかければいいかなと考えていますし、そういうのがしやすくするためにもリバースプロキシを入れておくのが無難だと思っています。


具体的にどう設定すればいいの?というのは要望があれば書きます。

Jenkins ユーザー・カンファレンス 2012 東京について

日本Jenkinsユーザー会のページに記載がありますが、日本でJenkinsユーザカンファレンスを企画中です。
まだ大枠しか決まっていないですが、今年の6月末の土曜日予定しています*1
以下、告知ーページになります。
http://build-shokunin.org/juc2012/


詳細が決まりましたら、告知ページやこのブログでもご連絡するつもりです。


告知ページでも記載がありますが、以下の件を随時募集しています。

  • セッション及びLTの発表者を募集します。
  • スポンサーを募集します。
  • 当日のイベント運営のお手伝いをしていただけるボランティアを募集します。



興味のある方は、自分宛でもかまいませんし、jenkins-staff at googlegroups dot com までご連絡いただければと思います。

*1:変更になる可能性はあります