Ubuntu Weekly Recipe

第485回 aptlyで本格的なパッケージリポジトリを作る

この記事を読むのに必要な時間:およそ 11 分

リポジトリのスナップショットを作成する

aptly mirror updateはミラー元のリポジトリの内容と同期します。つまりリポジトリ内部のパッケージが更新される可能性があるわけです。aptlyにはミラーリポジトリを更新したかどうかに関わらず特定のタイミングの状態を保持するスナップショットリポジトリを作成する機能があります。

先ほど作ったangeとange-updatesのスナップショット(ange-20170817)をそれぞれ作成してみましょう。

$ aptly snapshot create ange-20170817 from mirror ange

Snapshot ange-20170817 successfully created.
You can run 'aptly publish snapshot ange-20170817' to publish snapshot as Debian repository.

$ aptly snapshot create ange-updates-20170817 from mirror ange-updates

Snapshot ange-updates-20170817 successfully created.
You can run 'aptly publish snapshot ange-updates-20170817' to publish snapshot as Debian repository.

これでangeやange-updatesが更新されたとしても,スナップショットをとったタイミングのリポジトリの状態を参照できます。

複数のスナップショットをマージして,ひとつのリポジトリにすることも可能です。先程作ったスナップショット「ange-20170817」「ange-updates-20170817」をひとつにまとめた新しいスナップショット「princess-20170817」を作るには次のようなコマンドを実行します。-latestオプションを付けると,重複するパッケージのうちバージョンが新しいパッケージのみを取り込みます。

$ aptly snapshot merge -latest princess-20170817 ange-20170817 ange-updates-20170817

Snapshot princess-20170817 successfully created.
You can run 'aptly publish snapshot princess-20170817' to publish snapshot as Debian repository.

ちなみにスナップショット間での差分も表示できます。

$ aptly snapshot diff ange-20170817  princess-20170817
  Arch   | Package                                  | Version in A                             | Version in B
! all    | fcitx                                    | 1:4.2.9.1-1ubuntu1                       | 1:4.2.9.1-1ubuntu1.16.04.2
! all    | fcitx-data                               | 1:4.2.9.1-1ubuntu1                       | 1:4.2.9.1-1ubuntu1.16.04.2
! all    | fontconfig-config                        | 2.11.94-0ubuntu1                         | 2.11.94-0ubuntu1.1
! all    | libgdk-pixbuf2.0-common                  | 2.32.2-1ubuntu1                          | 2.32.2-1ubuntu1.2
! all    | libgtk2.0-common                         | 2.24.30-1ubuntu1                         | 2.24.30-1ubuntu1.16.04.2
! all    | mozc-data                                | 2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1  | 2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1
! amd64  | emacs-mozc                               | 2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1  | 2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1
(以下略)

リポジトリを公開する

作成したスナップショットはパッケージリポジトリとして公開できます。

$ aptly publish snapshot -distribution=princess princess-20170817
Loading packages...
Generating metadata files and linking package files...
Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"aptly <aptly@example.com>"
2048ビットRSA鍵, ID C6D7028B作成日付は2017-08-17

Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"aptly <aptly@example.com>"
2048ビットRSA鍵, ID C6D7028B作成日付は2017-08-17

Snapshot princess-20170817 has been successfully published.
Please setup your webserver to serve directory '/home/aptly/.aptly/public' with autoindexing.
Now you can add following line to apt sources:
  deb http://your-server/ princess main
Don't forget to add your GPG key to apt with apt-key.

You can also use `aptly serve` to publish your repositories over HTTP quickly.

リポジトリのメタデータに署名を行うため,最初に作成したGPG鍵のパスフレーズの入力が必要になります。

-distributionに指定する値(上記のケースなら「princess」⁠は公開時のディストリビューション名であり,Ubuntuのリポジトリでいうところの「xenial」「zesty」です。省略するとスナップショット名がそのまま使われます。将来的に同じディストリビューション名でより新しいスナップショットにスイッチする可能性があることを考えると,スナップショット名よりは汎用的な名前にしておくべきでしょう。

パッケージリポジトリは~/.aptly/public/以下に作られます。いわゆる一般的なパッケージリポジトリの構成になっています。個々のパッケージはダウンロードしたパッケージファイルへのハードリンクとなっています。ちなみに~/.aptly.confを設定すれば,ファイルシステム上の別のディレクトリはもとより,Amazon S3OpenStack Swiftといったストレージサービス上にリポジトリを構築できます。またUbuntuで言うところのmain・universeのようにマルチコンポーネントなリポジトリも構築できます。

aptly publishによる「公開」は,実際は「リポジトリとして公開するためのディレクトリ構成を作る」ところまでしか行いません。外部からネットワーク越しにリポジトリとして使うためには,このディレクトリにアクセスし,ファイルを取得できるような何か別のサービスを立ち上げる必要があります。端的に言うとHTTPサーバーが必要です。手っ取り早いのは,~/.aptly/plubic/ディレクトリが外部から見えるようにHTTPサーバーの設定を行うことでしょう。

実験的にHTTPサーバーを立てたければ,aptly serveコマンドが使えます。

$ aptly serve

Serving published repositories, recommended apt sources list:

# ./princess [amd64] publishes {main: [princess-20170817]: Merged from sources: 'ange-20170817', 'ange-updates-20170817'}
deb http://aptly:8080/ princess main

Starting web server at: :8080 (press Ctrl+C to quit)...

aptly serveコマンドを実行するとaptlyに組み込まれたHTTPサーバーが起動して,公開済みのリポジトリへ8080番ポート経由でアクセスできるようになります。あとはこのリポジトリを利用したいクライアント側で,リポジトリの設定を行うだけです。

クライアント側の操作に移る前に,まずaptly側の公開鍵をエクスポートしておきましょう。

$ gpg --export --armor > princess.pub

あとはこのリポジトリ鍵を登録し,sources.listを設定します。ここでaptlyが動いているマシンのアドレスをaptly.example.comだとしています。

$ sudo apt-key add princess.pub
$ echo "deb http://aptly.example.com:8080/ princess main" | sudo tee /etc/apt/sources.list.d/princess.list
$ sudo apt update
$ sudo apt policy fcitx

最後のコマンドでfcitxの候補としてaptlyで作ったリポジトリのパッケージが表示されたら成功です。

もちろんaptly serveは簡易的な機能しかもっていないので,プロダクション用途であれば一般的なHTTPサーバーを用意したほうがよいでしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入