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 そのままですが、 以下のように builderBUILDER=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 ユーザーとターミナルを共有するセットアップ方法は以下のとおり。 ownerguest アカウントを作成し、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セッションに接続します。これでターミナルを共有して作業することができます。

もし、共有がうまくできないときは、~/.screenrcacladd の対象ユーザー名が共有対象の ユーザー名になっているかを確認してください。

作業場所

リポジトリ

依存しているモジュールがいくつかあったので追加で作業しました。

パッケージのアップロード先は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でのパッケージングの流れを把握するための記事

Goのパッケージングに関連したドキュメント

パッケージングのお作法に関するドキュメント

相談先としておすすめのメーリングリスト

Debian開発者をめざすための記事