golang 1.9rc1のUbuntu 16.04用debパッケージをビルドした

はじめに

Ubuntu · golang/go Wiki で紹介されている Golang Backports : Simon Eisenmann を改変してgo 1.9rc1のUbuntu 16.04用debパッケージをビルドしたのでメモです。

golang 1.9 : Hiroaki Nakamura というPPAで配布しています。

この記事の手順は git-buildpackageでdebパッケージをビルドしてPPAにアップロードする手順 で書いたセットアップが済んでいることが前提です。

今回ビルドしたdebのインストール手順

今回ビルドしたdebパッケージのインストール手順は以下の通りです。

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:hnakamur/golang-1.9
sudo apt update
sudo apt install golang-go

LXDのコンテナを新規に作って試す場合の手順も書いておきます。以下ではコンテナ名を go19 としていますが適宜変更してください。

lxc launch images:ubuntu/xenial go19
lxc exec go19 bash
apt update
apt install software-properties-common
add-apt-repository ppa:hnakamur/golang-1.9
apt update
apt install golang-go

goのdebパッケージの作成手順メモ

作成と言っても一からではなくて、 Simon Eisenmann (LaunchPadのアカウントID: longsleep) さんのdebパッケージのソースを取って来て、オリジンのソースを入れ替えて適宜書き換えるだけです。

Simon さんのdebパッケージのソースをダウンロード

Packages in “Golang Backports” : Golang Backports : Simon Eisenmann でパッケージ名のリストを確認すると、以下の3つのパッケージがあります。

  • golang-1.8
  • golang-1.8-race-detector-runtime
  • golang-defaults

golang-1.8 のリンクをクリックして展開すると複数のパッケージファイルが並んでいますが、そのうち golang-1.8-go というパッケージファイルをインストールすると /usr/lib/go-1.8/ 以下に /usr/lib/go-1.8/bin/go のように配置されるようになっています。

同様に golang-defaults のリンクをクリックして展開すると、 golang-go というパッケージファイルがあり、これをインストールすると /usr/bin/go -> ../lib/go-1.8/bin/go というシンボリックリンクなどが作られるようになっています。

golang-1.8-race-detector-runtime はよくわかってないので今回はスキップします。

以下のコマンドを実行して golang-1.8 と golang-defaults のソースパッケージをダウンロードします。 ここでは ~/longsleep-go-deb という作業ディレクトリを作成していますが、適宜変更してください。

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
mkdir ~/longsleep-go-deb
cd !$
apt source golang-1.8-go golang-defaults

golang-1.8のパッケージを改変してgolang-1.9のパッケージを作成

最終結果は https://github.com/hnakamur/golang-deb で公開しています。 以下の手順は何回か試行錯誤した結果なのですが、上記のレポジトリと多少ずれているかもしれません。もう一度一からやり直して確認するの面倒なので、そのまま書いてしまいます。

以下ではレポジトリの作業ディレクトリを ~/.ghq/github.com/hnakamur/golang-deb として説明します。適宜変更してください。

まず、 .dsc ファイルをインポートして、レポジトリを新規作成します。 ディレクトリ名を golang から golang-deb に変更して、そこに移動します。

cd ~/.ghq/github.com/hnakamur
gbp import-dsc --pristine-tar \
        --debian-branch=ubuntu-1.8 --upstream-branch=upstream-1.8 \
        ~/longsleep-go-deb/golang-1.8/golang-1.8_1.8.3-2ubuntu1~longsleep1-xenial.dsc
mv golang golang-deb
cd !$

ブランチを確認します。

$ git branch
* master
  pristine-tar
  ubuntu-1.8
  upstream-1.8

タグを確認します。

$ git tag
debian/1.8.3-2ubuntu1_longsleep1-xenial
upstream/1.8.3-2ubuntu1_longsleep1

このレポジトリには debian/gbp.conf.in というファイルがあって、gbp (git-buildpackage) 用のブランチやタグの形式が記載されています。

アップストリームのブランチは upstream-X.Y で、debパッケージのブランチは ubuntu-X.Y だということがわかります。 X.Y の部分は debian/changelog ファイルからバージョンを読み取って展開されるようになっています。

$ cat debian/gbp.conf.in
[DEFAULT]
debian-branch = ubuntu-X.Y
debian-tag = debian/%(version)s
upstream-branch = upstream-X.Y
upstream-tag = upstream/%(version)s
pristine-tar = True

[git-dch]
meta = 1

試行錯誤していた時に、 [git-dch] というセクション名は古いので [dch] にせよという主旨の警告が出ました。そこで以下のコマンドを実行して変更しました。

sed -i -e 's/^\[git-dch\]/[dch]/' debian/gbp.conf.in

さらに以下のコマンドを実行して debian/gbp.conf.in から debian/gbp.conf を生成して上書きします。

debian/rules gencontrol

変更した debian/gbp.conf.indebian/gbp.conf をコミットします。

git commit -m 'Rename git-dch to dch in debian.gbp.conf.in' debian/gbp.conf.in debian/gbp.conf

ubuntu-1.8 ブランチにも上記の変更をマージします。

git checkout ubuntu-1.8
git merge --ff master

upstream-1.8 ブランチから upstream-1.9 ブランチを、 ubuntu-1.8 ブランチから ubuntu-1.9 ブランチを作成し、 ubuntu-1.9 ブランチに切り替えます。

git branch upstream-1.9 upstream-1.8
git checkout -b ubuntu-1.9 ubuntu-1.8

以下のコマンドを実行して debian/changelog にエントリを追加します。

gbp dch -R --debian-branch ubuntu-1.9

エディタ (私の場合は vim) が起動しますので、先頭に追加されたエントリを以下のように編集します。

golang-1.9 (1.9~rc1-1ubuntu1~hnakamur1-xenial) xenial; urgency=medium

  * New upstream release.

 -- Hiroaki Nakamura <hnakamur@gmail.com>  Sat, 29 Jul 2017 00:38:32 +0900

以下のコマンドを実行して、ソースパッケージ内のgoのバージョンに依存したファイルを再生成します。

debian/rules gencontrol

更新したファイルをコミットします。

git add .
git commit -m 'Change control file to golang-1.9'

次に go 1.9rc1 のアップストリームのソースをインポートします。

$ gbp import-orig --no-merge --no-interactive \
   --debian-branch=ubuntu-1.9 --upstream-branch=upstream-1.9 \
   --upstream-version=1.9~rc1 ~/go1.9rc1.src.tar.gz
gbp:info: Importing '/home/hnakamur/go1.9rc1.src.tar.gz' to branch 'upstream-1.9'...
gbp:info: Source package is golang-1.9
gbp:info: Upstream version is 1.9~rc1
gbp:info: Successfully imported version 1.9~rc1 of /home/hnakamur/go1.9rc1.src.tar.gz

ubuntu-1.9 ブランチに切り替えて upstream-1.9 ブランチの変更をマージします。

git checkout ubuntu-1.9
git merge --no-ff upstream-1.9

今回作成するdebパッケージのバージョン 1.9~rc1-1ubuntu1~hnakamur1-xenial~_ に置き換えたタグを打っておきます。

git tag upstream/1.9_rc1-1ubuntu1_hnakamur1 upstream-1.9

さらに master ブランチに upstream-1.9 ブランチの内容をマージしておきました。

git checkout master
git merge ubuntu-1.9

以下のコマンドでソースパッケージをビルドします。

gbp buildpackage --git-pristine-tar-commit --git-export-dir=../build-area --git-debian-branch=ubuntu-1.9 -S -sa

以下のコマンドでバイナリパッケージをビルドします。

sudo pbuilder build ../build-area/golang-1.9_1.9~rc1-1ubuntu1~hnakamur1-xenial.dsc

/var/cache/pbuilder/result/ に生成されたdebファイルを、LXDの新規コンテナにコピー、インストールし、動作確認しました。動作確認と言っても /usr/lib/go-1.9/bin/go version を実行して出力を確認しただけです。

golang-1.9のPPAを作成してソースパッケージをアップロード

Launchpad にログインして自分のページに移動して golang-1.9 というPPAを作成しました。

すると Uploading packages to this PPA というところに dput ppa:hnakamur/golang-1.9 <source.changes> と書かれていますので、以下のコマンドを実行してソースパッケージをアップロードしました。

dput ppa:hnakamur/golang-1.9 ../build-area/golang-1.9_1.9~rc1-1ubuntu1~hnakamur1-xenial_source.changes

しばらく待ってビルド結果を見ると amd64 は通ったのですが i386 はビルドエラーになっていました。 自分で使うのは amd64 だけなので nginx+luaのカスタムdebパッケージを作ってみた の「PPAでビルドするアーキテクチャの変更」の手順で i386 は以降のビルド対象から外しました。

go 1.8用のgolang-defaultsパッケージgo 1.9用に改変

まず、 .dsc ファイルをインポートして自分のレポジトリを作ります。

cd ~/.ghq/github.com/hnakamur
gbp import-dsc --pristine-tar ~/longsleep-go-deb/golang-defaults_1.8~1ubuntu2~xenial.dsc
mv golang-defaults golang-defaults-deb
cd !$

新しいリリースを gbp dch -R で作ろうとしたらタグが無くてエラーになったので、直接 dch を使うようにしました。

dch -R

前のエントリ

golang-defaults (2:1.8~1ubuntu2~xenial) xenial; urgency=medium

  * Backport to 16.04.
  * Use Golang 1.8.

 -- Simon Eisenmann <simon@longsleep.org>  Tue, 03 Jan 2017 16:49:41 +0100

を参考にして、先頭に追加されたエントリを以下のように編集しました。

golang-defaults (2:1.9~1ubuntu1~hnakamur1) xenial; urgency=medium

  * Use Golang 1.9.

 -- Hiroaki Nakamura <hnakamur@gmail.com>  Sat, 05 Aug 2017 09:38:34 +0900

バージョンに対応したタグを打ちます。

git tag debian/1.9_1ubuntu1_hnakamur1

ソースパッケージをビルドします。

gbp buildpackage --git-export-dir=../build-area -S -sa

バイナリパッケージをビルドします。

sudo pbuilder build ../build-area/golang-defaults_1.9~1ubuntu1~hnakamur1.dsc

生成されたバイナリパッケージの中身を確認します。

$ dpkg -c /var/cache/pbuilder/result/golang-go_1.9~1ubuntu1~hnakamur1_amd64.deb
drwxr-xr-x root/root         0 2017-08-05 09:43 ./
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/lib/
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/share/
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/share/doc/
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/share/doc/golang-go/
-rw-r--r-- root/root       870 2017-08-05 09:39 ./usr/share/doc/golang-go/changelog.gz
-rw-r--r-- root/root      2890 2017-08-05 09:39 ./usr/share/doc/golang-go/copyright
drwxr-xr-x root/root         0 2017-08-05 09:43 ./usr/bin/
lrwxrwxrwx root/root         0 2017-08-05 09:43 ./usr/lib/go -> go-1.9
lrwxrwxrwx root/root         0 2017-08-05 09:43 ./usr/bin/gofmt -> ../lib/go-1.9/bin/gofmt
lrwxrwxrwx root/root         0 2017-08-05 09:43 ./usr/bin/go -> ../lib/go-1.9/bin/go

LXDコンテナにパッケージをコピーして動作確認した後、 PPAにソースパッケージをアップロードしてビルドしました。

dput ppa:hnakamur/golang-1.9 ../build-area/golang-defaults_1.9~1ubuntu1~hnakamur1_source.changes

おわりに

使い方は先頭の「今回ビルドしたdebのインストール手順」の項に書いた通りです。 今後、go 1.9.xの新しいリリース候補や正式版が出たら、debパッケージもすぐ更新するつもりです。

一方で dh-make-golang パッケージなどは Simon さんのパッケージに依存していますので、 正式版が出たら Simon さんにも更新をお願いしようと思います。 以前 1.8.3 を Simon さんにメールでお願いしたら数日で作ってくれました。

さらに、goで書かれたコマンドやサーバのうち自分で使うものはdebパッケージを作っていきたいと 考えています。というより、それがしたいからgoのパッケージを作ったわけなので。