I made debsign of Python libary that can be run without a TTY

この辺の話の続きです。

諸事情で、ローカル環境でDebianパッケージをbackportsしたり、 オリジナルのパッケージを諸事情で公式パッケージではなく、非公開パッケージとして、 それらをローカルアーカイブに突っ込むのに、Jenkinsで全て完結させたいなと思い、 [1] いろいろ試行錯誤したところ、どう頑張っても debsing で署名することだけはできないことが分かりました。

debsign コマンド自体がつぎのように標準入力からパスフレーズを受け取ってプロンプトで代入する、ということができません。

$ echo -e "passphrase\npassphrase\n" | debsign some.changes

同じように試行錯誤している人はいるみたいですが、解決している人はいなさそうでした。 一方、 gpg コマンドは、 –batch および –no-tty というオプションがあります。 で、GnuPGのPythonバインディングである python_gnupg はこの機能を使えることが分かりました。

debsign コマンドの挙動としては、まず.dscファイルを署名し、署名後のファイルサイズとmd5, sha1, sha256のチェックサムを取得し、.changesのエントリを書き換え、.changesファイルを署名します。 で.changesファイルを sed コマンドなどで書き換えるのはちょいと面倒だなと思っていたら、.changesファイルを扱う、deb822というモジュールがありました。これは、python-debianパッケージとして提供されています。 [2] これを使うと、.changesファイルの情報をDictに似たデータとして扱えます。

で、これらを使って、pydebsignというPythonライブラリを作りました。

このライブラリで debsign と同等の処理を、JenkinsなどのCIで実行させることができます。 そのサンプルが、 これ です。

このコードでJenkinsでパッケージビルド&署名&reprepro管理のローカルアーカイブへの登録まで全部自動で行えるようになりましたよ、 というお話でした。 [3]

footnote

[1]一からソースパッケージを作るところの自動化は除く。
[2]PyPI でも公開されています。 https://pypi.python.org/pypi/python-debian
[3]リンク先のGistのコードを使うために、JenkinsおよびRepreproにも設定が必要なのですが、それはまた別の話。