第一回 OSS Gateオンボーディング debパッケージのメンテナンスやそれを支えるシステムの開発 関連資料
OSS Gateオンボーディング題材
- slack-termのパッケージング
環境構築
VPSのセットアップ方法 for Debian unstable on ConoHa
以下はConoHaのVPSインスタンスでunstableの環境を用意する手順を説明します。
題材がgoのパッケージングなので、作業環境のスペックとしてはメモリ2GB CPU 3コア,SSD 100GBのプランであれば事足ります。 よりディスクやメモリが必要な題材を選ぶ場合、スペックをあげることを検討してください。 初期選択可能なのがDebian 10.7(2021/8月時点)なのでいったん最新にしてからunstableに更新する手順です。
(追記: bullseyeがリリースされたので、busterからbullseye、bullseyeからunstableへとあげたほうが安全かもしれない。未検証。)
$ sudo apt update
$ sudo apt upgrade -y
これで、最新のDebian 10.10になっているはずです。
次に、/etc/apt/sources.listの内容をunstableに変更します。
deb http://deb.debian.org/debian/ unstable main
deb-src http://deb.debian.org/debian/ unstable main
あとはunstableのパッケージへと更新します。
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt dist-upgrade -y
$ sudo apt autoremove -y
パッケージング関連で必要なものをインストールしておきます。
$ sudo apt install devscripts pbuilder git-buildpackage dh-make-golang dh-golang piuparts
ConoHaを使う場合、VPSをイメージとして保存することができるので、作業環境を常に起動しておく必要はありません。 必要なときに、保存したイメージからVPSインスタンスを再構築することができます。
VPSを起動しっぱなしだとコストがかかりますが、イメージの保存には50GBまでは追加の費用がかからないので、 OSS Gateオンボーディングのように週一回一緒に作業するような場合にはおすすめです。
パッケージをビルドする環境のセットアップ方法
DebianではSalsaにパッケージのソースをたいていは置きます。 また、パッケージのビルドにはgit-buildpackage(1)がよく使われています。
クリーンな環境でビルドできることが必要なので、その環境の整え方を説明します。 なお、今回はpbuilderと組合わせて使う前提とします。
~/.gbpを設定する
https://wiki.debian.org/PackagingWithGit#Packaging_with_Git を参考に ~/.gbp.conf
を設定します。
ほぼ https://wiki.debian.org/PackagingWithGit#An_example_gbp.conf そのままですが、
以下のように builder
に BUILDER=pbuilder
の指定が必須です。(pbuilderを使うため)
[DEFAULT]
builder = BUILDER=pbuilder git-pbuilder
cleaner = fakeroot debian/rules clean
# Create pristine-tar on import
pristine-tar = True
# Run lintian to check package after build
postbuild = lintian -iIE --pedantic $GBP_CHANGES_FILE && echo "Lintian OK"""
[buildpackage]
export-dir = ../build-area/
[import-orig]
# Filter out unwanted files/dirs from upstream
filter = [
'*egg.info',
'.bzr',
'.hg',
'.hgtags',
'.svn',
'CVS',
'*/debian/*',
'debian/*'
]
# filter the files out of the tarball passed to pristine-tar
filter-pristine-tar = True
[import-dsc]
filter = [
'CVS',
'.cvsignore',
'.hg',
'.hgignore',
'.bzr',
'.bzrignore',
'.gitignore'
]
[dch]
# ignore merge commit messages
git-log = --no-merges
~/.devscriptsを設定する
パッケージに対してGPGで署名するときに必要な設定は以下のとおりです。 ~/.devscriptsにあなたのGPG鍵のIDを設定します。
gpg --list-secret-keysで鍵のIDがわかります。
DEBSIGN_KEYID=Your_GPG_keyID
参考: https://www.debian.org/doc/manuals/maint-guide/build.ja.html
~/.bashrcなどへのEmailアドレスの設定
環境変数DEBEMAILとDEBFULLNAMEを設定します。 これはdchでdebian/changelogエントリを更新する際に使われます。
DEBEMAIL="your.email.address@example.org"
DEBFULLNAME="Firstname Lastname"
export DEBEMAIL DEBFULLNAME
pbuilderの初期イメージを作成する
https://wiki.debian.org/PbuilderTricks を参考にして、クリーンなビルド環境イメージを作成します。
$ sudo pbuilder create
すると、/var/cache/pbuilder/base.tgz
が作成されます。
これで gbp buildpackage
を実行したときに、pbuilderを使ってビルドできるようになります。
Linuxのターミナルの共有方法
owner
ユーザーが guest
ユーザーとターミナルを共有するセットアップ方法は以下のとおり。
owner
は guest
アカウントを作成し、guest
と共有できるようにします。
$ sudo apt install screen
$ sudo chmod u+s /usr/bin/screen
$ sudo chmod 755 /var/run/screen
$ cp /etc/screenrc ~/.screenrc
$ cat <<EOF >> ~/.screenrc
escape ^Tt
bind windowlist -b
multiuser on
acladd guest
EOF
$ sed -i -e 's/^#hardstatus lastline/hardstatus alwayslastline/' .screenrc
owner$ screen -S ossgate
owner
はossgateセッションを共有します。
guest$ screen -x owner/ossgate
guest
はossgateセッションに接続します。これでターミナルを共有して作業することができます。
もし、共有がうまくできないときは、~/.screenrc
の acladd
の対象ユーザー名が共有対象の
ユーザー名になっているかを確認してください。
作業場所
リポジトリ
依存しているモジュールがいくつかあったので追加で作業しました。
- https://salsa.debian.org/go-team/packages/golang-github-lithammer-fuzzysearch
- https://salsa.debian.org/go-team/packages/termui
- https://salsa.debian.org/go-team/packages/golang-github-slack-go-slack
- https://salsa.debian.org/go-team/packages/golang-github-0xax-notificator
パッケージのアップロード先はmentors.debian.netを利用しました。
lintianメッセージへの対処の仕方について
source-ships-excluded-file debian/copyright
E: golang-github-slack-go-slack source: source-ships-excluded-file debian/copyright vendor/github.com/davecgh/go-spew/spew/bypass.go
N:
vendor/以下にdebian/copyrightで含めるべきでないと明記したファイルが含まれています。
Files-Excluded:
vendor
Debianパッケージでは、依存するライブラリーはそれぞれわけてパッケージングすることになっています。 システムで複数の同じライブラリーがあちこちに含まれてしまうと、メンテナンスのコストがかかるためです。
この場合、含めるべきでないファイルを除外してパッケージングする必要があります。 これを行うためには、除外済みのアーカイブを作成し、インポートするのが簡単です。 uscanを使うと、アーカイブを作成できます。
% cd golang-github-slack-go-slack/
% uscan --download-current-version
uscan: Newest version of golang-github-slack-go-slack on remote site is 0.9.4, specified download version is 0.9.4
Successfully repacked ../golang-github-slack-go-slack-0.9.4.tar.gz as ../golang-github-slack-go-slack_0.9.4+ds1.orig.tar.xz, deleting 78 files from it.
アーカイブが作成できたら、インポートしなおします。
% git checkout debian/sid
% gbp import-orig ../golang-github-slack-go-slack_0.9.4+ds1.orig.tar.xz
インポートできたら、debian/changelog
のバージョンを変更します。
たとえば、上記のように0.9.4+ds1-1
とします。+ds
はソースコードの一部を削除した場合に付与します。
+ds1
だとアーカイブを1度再生成しなおしたことを意味します。
(このバージョンのつけかたにはいくつか流派があります。)
参考資料
Debianでのパッケージングの流れを把握するための記事
-
Debianでパッケージをリリースできるようにしたい - WNPPへのバグ登録
- パッケージ化する宣言をするやりかたを説明している記事です
-
Debianでパッケージをリリースできるようにしたい - よりDebianらしく
- lintianを使ってパッケージの直したほうがよいところを見つけるための記事です
-
Debianでパッケージをリリースできるようにしたい - mentors.debian.netの使いかた
- パッケージの体裁が整って、スポンサーを探すときには作業中のパッケージを公開します。そのパッケージ置き場に使われるmentors.debian.netの使い方の記事です
-
Debianでパッケージをリリースできるようにしたい - そしてDebianへ
- スポンサーにアップロードしてもらったあとDebianに入るまでの流れを説明した記事です
-
- Debianにパッケージがあるとどう嬉しいのかを具体的な例をもとに説明した記事です
-
- パッケージのインストールテストを行う
piuparts
について知る記事です
- パッケージのインストールテストを行う
-
Ubuntuでdebパッケージのお手軽クリーンルーム(chroot)ビルド環境を構築するには
pbuilder
以外にも、いくつか代替のbuilderがあります。これはcowbuilder
について知る記事です いまはpbuilder+tmpfsで十分な気もします
Goのパッケージングに関連したドキュメント
-
https://go-team.pages.debian.net/packaging.html
- DebianプロジェクトでのGoのパッケージング方法について説明した記事です
-
https://tokyodebian-team.pages.debian.net/pdf2021/debianmeetingresume202105.pdf
- Debian勉強会でDebianにおけるGoについて発表されたがありました。そのときの発表資料です。主にGoの使い方ですが、
dh-make-golang
にも少し言及があります。
- Debian勉強会でDebianにおけるGoについて発表されたがありました。そのときの発表資料です。主にGoの使い方ですが、
-
https://people.debian.org/~stapelberg/2015/07/27/dh-make-golang.html
- dh-make-golangの使い方を知るのによい
パッケージングのお作法に関するドキュメント
-
- lintianでエラーになったときなどに参照する
- https://www.debian.org/doc/debian-policy/upgrading-checklist.html は最新のポリシーに準拠できているか確認するのに便利
-
Machine-readable debian/copyright file
- debian/copyright の書き方に困ったら参照する
-
- Debian開発者リファレンス。6章のパッケージ化のベストプラクティスが参考になるはず。
相談先としておすすめのメーリングリスト
-
https://lists.debian.org/debian-mentors/ (英語)
- パッケージング一般に関する相談をするときはここ
-
https://lists.debian.org/debian-go/ (英語)
- go teamに相談したいことがあるときはここ
-
https://lists.debian.or.jp/mailman/listinfo/debian-devel/
- 日本語でパッケージに限らず相談したいときはここ