社内 apt リポジトリの運用と deb パッケージビルドの話

id:sora_h です。今回はクックパッドの社内 apt リポジトリ管理・deb パッケージビルド・リリースフローについて紹介します。

クックパッドではいままで CentOS 6 を利用していましたが、最近は Ubuntu への移行を進めています。現在は CentOS / Ubuntu 両方が共存したインフラになっています。

CentOS では社内に yum リポジトリを置き、本家リポジトリから消えてしまったパッケージや、独自でビルドしたパッケージのホストを行っていました。Ubuntu 導入以降も同様に、社内 apt リポジトリを設置し、必要があれば独自でパッケージをビルドすることにしました。具体的には、わたしは ruby2.1 パッケージや ruby2.2 パッケージをメンテナンスしています。

(なお、わたしは rpmspec および ebuild の方が慣れていて、未だ deb パッケージビルドでよくハマっているので間違いやより便利な方法があればフィードバックいただけると助かります...)

管理

deb パッケージは rpmspec や ebuild と違い、展開されたソースの上に debian ディレクトリを作成、その下へパッケージの情報やビルド処理を記述していきます。

CentOS 向けの rpmspec は単一の git リポジトリへ全てチェックインしていましたが、deb パッケージ作成において 1 リポジトリに全部入れるのはファイル数・サイズ的にも難しいという話になりました。また、git-buildpackage のワークフローを採用するためには git リポジトリを分割しておく必要があります。 そのため、deb パッケージにおいては、パッケージごとに 1 つ git リポジトリを持つポリシーになりました。

クックパッドでは deb パッケージのリポジトリをまとめるための organization を 1 つ GitHub Enterprise (GHE) へ作成し、そこへ deb パッケージのソースリポジトリをまとめています。

ビルド

パッケージビルド用 vagrant 環境の用意

クックパッドでは開発環境として全員 Mac を利用しているので、ビルドに必要な物をインストールした Ubuntu の環境を作成する Vagrantfile を用意してあります。 なお、vagrant の box は実際に AWS 上で動作しているインスタンスに近い、共通のものがあるのでそれを利用しています。

https://github.com/sorah/sandbox/blob/master/misc/deb-build/Vagrantfile

git-buildpackage (gbp)

git リポジトリで管理する事にしたため、git-buildpackage のフローに則っています。

  1. 新規パッケージの場合は gbp import-dscgbp import-orig, git clone + dh_make でパッケージの体裁を整える
  2. gbp buildpackage でビルド
  3. 更新分を git push --all && git push --tags で push
  4. 後述する方法でリポジトリへアップロード

また、ビルド回りのコマンドに関しては社内でチートシートのようなものを置いてあります。 (抜粋したものがこちら: https://github.com/sorah/sandbox/blob/master/misc/deb-build/README.md )

パッケージのリリース

aptly

apt リポジトリの管理には aptly を利用しています。既存リポジトリのミラーや、Amazon S3 へのアップロードが簡単にできるのが特長です。

リリースコマンド

パッケージがビルドできた後は aptly へ aptly repo add, aptly publish update を実行してリポジトリへ公開します。 また、GHE の Releases 機能を利用して、gbp が作成した git tag から release を作成、成果ファイルを添付する、という事もしています。

つい最近まで、これは手動でやっていたのですが、アップロードする成果ファイル数は 1 つではありません (.dsc, .deb, .changes, .orig.tar.{gz,xz} ファイル)。 ファイル名規則も物によって異なる (orig ファイルの命名規則は deb などとは別) ので、バージョンを重ねる事に増えていくファイルから、どのファイルをアップロードするかを調べて人間が選択するのは億劫でした。

そのため、ビルド用 vagrant 環境に GHE, aptly へのアップロードを自動化するコマンドを追加して心の平穏を保ちました。それを公開可能な状態に改変したものがこちらです。参考になると幸いです。

https://github.com/sorah/sandbox/blob/master/misc/deb-build/bin/deb-release

まとめ

本記事ではクックパッドでの deb パッケージビルドや apt リポジトリの管理について解説しました。

参考文献

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/