PDF事前配布資料 - 東京エリアDebian勉強会

第 115 回 東京エリア Debian 勉強会資料
.Deb
銀河系唯一のDebian専門誌
2014 年 07 月 19 日
ケ
化
動
自
ージ
の
で
s
n
i
Jenk
特集:
ッ
パ
n
a
i
Deb
デビアン勉強会
目次
2
Debian Trivia Quiz
3
最近の Debian 関連のミーテ
ィング報告
事前課題
1
2
1.1
koedoyoshida
. . . . . . .
1.2
dictoss(杉本 典充)
1.3
工藤寿晴
. . . .
2
. . . . . . . . . .
2
1.4
吉野 (yy y ja jp) . . . . . .
2
1.5
zinrai . . . . . . . . . . . .
2
1.6
wbcchsyn
. . . . . . . . .
2
1.7
鈴木崇文
. . . . . . . . . .
2
1.8
野島 貴英
. . . . . . . . .
2
1.9
岩松 信洋 . . . . . . . . . .
2
1.10
まえだこうへい . . . . . . .
2
1
3.1
2
4
東 京 エ リ ア Debian 勉 強 会
114 回目報告 . . . . . . . . .
4
Jenkins での Debian パッケー
4
ジ自動化
5
4.1
背景 . . . . . . . . . . . . .
5
4.2
自動化するプロセス . . . . .
5
4.3
Jenkins 及び reprepro 環境の
4.4
5
3
構築 . . . . . . . . . . . . .
7
まとめ . . . . . . . . . . . .
8
索引
9
第 115 回 東京エリア Debian 勉強会 2014 年 07 月
1 事前課題
野島 貴英
今回の事前課題は以下です:
1. 本日、何の作業をやるかを宣言ください。
この課題に対して提出いただいた内容は以下です。
1.1
1.6
koedoyoshida
wbcchsyn
GitHub で公開中の自作プログラムをパッケージする予定
(先月の勉強会で発表した物です。)
https://github.com/wbcchsyn/dVault
未定
時間があまったら、プログラムの機能実装を行います。
1.2
dictoss(杉本 典充)
鈴木崇文
1.7
パッケ ー ジ 作 成 に 関 す る 作 業 は 、http://wnpp.debian.
net/ に報告が出ているパッケージ化、またはパッチつくりを
やろうと思います。具体的には munin、pygtkplot、pylzma、
wx3.0-doc、hex2bin が候補です。
Cocot のパッケージングをやります。
野島 貴英
1.8
1.3
パッケージング道場参加します。
工藤寿晴
• xmris のパッケージング
• kanatest のバグつぶし
• Softether のパッケージ化ヒントが得られるまで
自分が Vine で管理しているパッケージから、何か Debian
用のパッケージを作ります。(フォントか CUI のソフトウェア
となってます。
を検討中)
岩松 信洋
1.9
1.4
吉野 (yy y ja jp)
パッケージアップロードします。
manpages-ja
1.10
1.5
まえだこうへい
• ToDo 潰し
http://d.palmtb.net/pages/about.html#
todo-from-maintainer-dashboard
• pending のままの Serf 関連のパッケージ化
zinrai
パッケージ作成
pulledpork
https://code.google.com/p/pulledpork/
を行う予定。
2
第 115 回 東京エリア Debian 勉強会 2014 年 07 月
2 Debian Trivia Quiz
野島 貴英
ところで、みなさん Debian 関連の話題においついていますか?Debian 関連の話題はメーリングリストをよんで
いると追跡できます。ただよんでいるだけでははりあいがないので、理解度のテストをします。特に一人だけでは意
味がわからないところもあるかも知れません。みんなで一緒に読んでみましょう。
今回の出題範囲は debian-devel-announce@lists.debian.org や debian-devel@lists.debian.org に投稿
された内容などからです。
問題 1. libc が変更になりました。変更前と変更後の組
み合わせで正しいのはどれ?
問題 4. jessie のデフォルトの gcc のバージョンは何に
□ A eglibc から glibc へ変更
なった?
□ B glibc から eglibc へ変更
□ A 4.9
□ C uClibc から glibc へ変更
□ B 4.6
問題 2. ネットワークは Tor を使い、ファイル/メール/
メッセンジャーソフトは暗号化対応という特徴を持つ
debian ベースの Live OS の名前は何でしょう?
□ C 2.6
問題 5. jessie の freeze は 11 月 5 日です(注:リリース
じゃないよ。)ここで、スケジュールで新規の transition
□ A Plan9
が出来なくなる日はいつでしょう?
□ B Tails
□ A 10 月 5 日
□ C GNU/Hurd
□ B 9月5日
問題 3. Debian 6 LTS 開発の為の寄付を受け付ける会
社名は?
□ A Canonical
□ B SquareEnix
□ C Freexian
3
□ C 8月5日
第 115 回 東京エリア Debian 勉強会 2014 年 07 月
3 最近の Debian 関連のミーティング報告
野島 貴英
3.1 東京エリア Debian 勉強会 114 回目報告
東京エリア Debian 勉強会 114 回目は (株) スクウェア・エニックスさんで開催されました。
9 人の参加者がありました。また、wbcchsyn さんにて、GPG の秘密鍵を堅牢にかつセキュアに管理する事を検討
した成果についての発表がありました。今回は、その成果の1つとして、堅牢化についてフォーカスし、RAID の考
え方を用いて複数の記憶メディアにデータを分散配置して復元するソフトウェアを python で実装した事についての
発表でした。また、こちらについて様々に意見交換が参加者の間で行われました。
発表者自身のアイデアに基づく Debian に関係した成果物の発表は勉強会としても大変価値があると考えており
ます。引き続き、発表者の方々によるユニークなアイデアと成果の発表が期待されます。
4
第 115 回 東京エリア Debian 勉強会 2014 年 07 月
4 Jenkins での Debian パッケージ自動化
前田耕平
昨年の大統一 Debian 勉強会 2013 で、「とある企業での Debian システムの使い方。」というセッション*1 の中で、
社内向けの Debian パッケージの作成と、reprepro を使ったパッケージの配布方法についての話をしました。今回は
その続編です。
4.1 背景
管理するパッケージが少ない場合は、手作業でのビルドでも間に合っていましたが、管理するパッケージ数が増え、
対象ディストリビューションが増え (Precise, Wheezy, Trusty)、一方メンテナンスする人を増やすのは時間が掛か
る、という状況でした。
そこで、別件*2 で Jenkins を用意したこともあったので、ソースパッケージを作成するプロセス以外は、全て
Jenkins で実行して自動化することにしました。
4.2 自動化するプロセス
パッケージのビルドからローカルアーカイブへの登録までに行うプロセスは図 1 のようになります。1a は公式パッ
ケージのソースパッケージを dget などで取得する場合、1b は独自にソースパッケージを作成する場合です。ビルド
する対象のソースパッケージによって実際の手段自体は異なってきますが、実行するプロセス自体は図の通り変わり
ません。
1a. ソースパッケージ取得
1b. ソースパッケージ作成
2. パッケージビルド
3. パッケージチェック
4. インストールテスト
5. ソースパッケージへの署名
6. ローカルアーカイブへの登録
図1
*1
*2
パッケージビルド∼ローカルアーカイブへの登録までのプロセス
http://gum.debian.or.jp/2013/session/437.html
Java や Python のプロジェクトのビルドやテストの実行目的。
5
各プロセスの実行内容は下記のようになります。
1a. dget で公式アーカイブから取得
1b. git-buildpackage で Git で管理
2a. cowbuilder/pbuilder でビルド
2b. git buildpackage でビルド
3. ビルド時の hook script として lintian でチェック
4. piuparts でインストール&アンインストールテスト
5. debsign で署名
6-1. dput で incoming ディレクトリに push
6-2. dput の post upload command として reprepro processincomming を実行
図2
各プロセスの実行内容
これらを Jenkins でジョブとして実行するためには、対話形式の処理をなくし、リモートホスト上の処理も実行可
能な状態で、一連の処理を Jenkins のジョブスクリプトを作成する必要があります。
4.2.1 Jenkins で実行する上での課題
Jenkins で実行する上で問題となるのは、GPG と SSH 公開鍵のパスフレーズの入力と、reprepro でのアーカイブ
の登録です。
reprepro でのアーカイブ登録は reprepro processincoming コマンドで行います。Jenkins と別ホストで reprepro を実行する場合、dput.cf の post upload command を使えば解決できます。例えば、Ubuntu Trusty 用のロー
カルアーカイブに dput する場合は、下記のような設定を dput.cf にしておきます。
[trusty]
fqdn
method
incoming
login
post_upload_command
--keepunreferencedfiles
= repo.example.org
= scp
= /var/lib/debpkg-custom/ubuntu/incoming/
= repoadm
= ssh repoadm@repo.example.org /usr/bin/reprepro -b /var/lib/debpkg-custom/ubuntu \
processincoming trusty #実際は一行
公開鍵の入力は、次の 3 箇所で必要になります。*3
• GPG
5. debsign での署名
6-2. dput の post upload command として reprepro processincomming を実行
• SSH
6-1. dput で incoming ディレクトリに push
一方、GPG については既存環境で使っている鍵をそのまま利用する関係上、避けて通れません。Jenkins のジョブ
スクリプトで
$ echo -e ’passphrase\npassphrase\n’ | debsign some.changes
$ echo -e ’passphrase\npassphrase\n’ | dput some.changes
と実行しても標準入力からはパスフレーズは渡せません。しかし、gpg コマンド自体には--no-tty --batch オプ
ションを使って、対話形式でなくてもパスフレーズを入力することができます。そのため、方法としては、
*3
Jenkins と reprepro を同じホストで実行する場合 (つまり一台で完結させる場合) には SSH 公開鍵のパスフレーズ入力は特に考慮するこ
とはありません。
6
• debsign, reprepro processincomming を TTY なしで対話形式でなくても GPG パスフレーズを入力できるよ
うにする
• expect を使ってプロンプトで判断してパスフレーズを入力させる
の 2 つの方法が考えられます。で、先に着手した debsign については、expect で処理するのは負けだと思ったの
で、別途 pydebsign という Python ライブラリを実装しました*4 。しかし、reprepro については時間の都合上、結局
Python 版の expect の pexpect を使いました。下記のようになります。*5
def upload_files(codename, changes_path, reprepro_passphrase):
""" uploading to local archive incoming directory of reprepro """
os.environ[’LANG’] = ’C’
command = "dput %s %s" % (codename, changes_path)
exp = pexpect.spawn(command, maxread=4000)
exp.logfile_read = sys.stdout
exp.expect(’Please enter passphrase:’)
exp.sendline(reprepro_passphrase)
exp.expect(’Please enter passphrase:’)
exp.sendline(reprepro_passphrase)
exp.expect(pexpect.EOF)
exp.close()
return exp.status
4.2.2 Jenkins で必要なプラグイン
パスフレーズは渡せるようになりましたが、Jenkins のジョブを実行するとパスフレーズが丸見えです。そのた
め、”Mask Passwords Plugin”*6 というプラグインを使います。他に必要なプラグインは下記の通りです。また、
Jenkins のジョブスクリプト管理用と、git-buildpackage 用と複数の Git リポジトリを扱えるようにするため、”Git
Plugin”*7 と”Multiple SCMs Plugin”*8 も必要です。これらのプラグインは後述の Jenkins 環境構築後に、Jenkins
の管理画面からインストールします。
4.2.3 その他の考慮点
• Jenkins で自動ビルド&ローカルアーカイブへ登録したパッケージに依存するパッケージを作成することもあ
ります。そのため、後述の pbuilder と cowbuilder のイメージの APT line には、ローカルアーカイブの URL
を登録し、ローカルアーカイブの公開鍵を apt-key で登録しておく必要があります。
• バックポートする場合、orig.tar.gz,xz が.changes ファイルのリストにはデフォルトでは登録されず、reprepro
で登録する際にエラーになります。そのため、debbuildopts=’-sa’ を指定する必要もあります。
• pbuilder や cowbuilder でパッケージをビルドすると、デフォルトでは/var/cache/pbuilder/results ディレク
トリ以下に作成されます。このままでは、Jenkins のジョブごとに処理するには不都合です。pbuilderrc で
BUILDRESULT に、Jenkins の workspace 以下のパスを指定するようにします。
以上の点を考慮し、Python で Jenkins ジョブ用のスクリプトを作成しました。*9 都合により、Golang 版も作成し
ました。*10 これらは、前述の hook script で行う lintian でのテストを、dput の-l オプションで実行できるようにし
ています。*11
4.3 Jenkins 及び reprepro 環境の構築
Jenkins で自動実行するための環境として、下記の準備が必要になります。
*4
*8
Git: https://github.com/mkouhei/pydebsign, PyPI: https://pypi.python.org/pypi/pydebsign
debsign のこれで良かったですね。。。
https://wiki.jenkins-ci.org/display/JENKINS/Mask+Passwords+Plugin
https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
https://wiki.jenkins-ci.org/display/JENKINS/Multiple+SCMs+Plugin
*9
デモのみ。
*5
*6
*7
*10
*11
https://github.com/mkouhei/godebbuild
backport などの場合、lintian の Warning, Error を修正するためのパッケージの変更せず、許容してしまいたいこともあるため。
7
• Jenkins のインストール&設定
• Jenkins 用ユーザへの sudo 設定
– /usr/sbin/pbuilder
– /usr/sbin/cowbuilder
– /usr/bin/git-buildpackage
– /usr/bin/piuparts
– /bin/chown
• pbuilder and cowbuilder イメージの作成
– ビルド対象のディストリビューションの数分だけ作成
• debsign および reprepro 用の GPG 鍵の作成
• reprepro への upload 用の SSH 公開鍵の作成*12
• dput.cf の設定
• rererpro のインストール&設定
• reprepro 管理 pool の公開設定
• ローカルアーカイブ用の GPG 公開鍵の export
このうち、pbuilder と cowbuilder イメージの作成の一部と、GPG 鍵の作成、SSH 公開鍵の作成については、手
動で行う必要がありますが、他は Ansible で自動化しました。*13
4.4 まとめ
ソースパッケージの作成と Jenkins のジョブの作成以外は自動化できました。これにより、Debian パッケージの
作成をやったことが無い人でもバックポートなどはできるようになりました。しかし、実際にはジョブを実行すると
パッケージの依存関係や、lintian、piuparts などのエラーが発生します。そのため、Debian パッケージ作成につい
て知らなければ、それらのエラーに対応できないことが予想されます。
また、ソースパッケージの作成は相変わらず、属人化しています。*14 なので、今回の Debian パッケージング道場で
パッケージ作成ができる人が増えるとイイですね。*15
*12
*13
*14
*15
Jenkins と reprepro が別ホストの場合
デモ参照。Playbook は、https://github.com/mkouhei/playbook-tokyodebian115 に用意してあります。
つまり、職場では自分しか作成できない。
原稿作成時点では職場の同僚の参加者は未定。
8
第 115 回 東京エリア Debian 勉強会 2014 年 07 月
5 索引
building-packages-automatically-on-jenkins, 5
9
10
Debian 勉強会資料
2014 年 07 月 19 日
初版第 1 刷発行
東京エリア Debian 勉強会 (編集・印刷・発行)
11