Ubuntu Weekly Recipe

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

Ubuntuのパッケージリポジトリのスナップショットを作成したり、独自パッケージリポジトリを作成したいならaptlyが便利です。今回はこのaptlyの使い方について紹介します。

パッケージリポジトリの管理ツールである「aptly」

aptly「パッケージリポジトリの管理ツール」と題した、独自パッケージのリポジトリや部分的なミラーリポジトリを作成・管理するためのCLIツールです。具体的には次のような機能を提供します。

  • 公式パッケージリポジトリのパッケージすべてもしくは一部のミラーリング
  • パッケージリポジトリのスナップショットの作成
  • ローカルパッケージリポジトリの作成
  • リポジトリ間のマージ・更新
  • HTTP経由で作成したリポジトリを公開
  • REST APIを使ったリポジトリの操作

フルミラーも可能ではありますが、リポジトリのメタデータを署名するために使用するGPG鍵は公式リポジトリと異なる鍵を生成・利用します。このため「jp.archive.ubuntu.com」のような公式のミラーリポジトリとは異なり、作成したリポジトリを利用する場合は、PPAのような非公式リポジトリのようにGPG鍵をapt-keyコマンドで取り込まなければならないことに注意が必要です。

リポジトリのスナップショット機能は、多数のマシンに構成管理ツールなどを用いて環境を構築する際に真価を発揮するでしょう。一般的に通常のUbuntuリポジトリは、ディストリビューション側(リポジトリ側)の都合にあわせて任意のタイミングでパッケージが更新されます。つまり同じようにインストールしたとしてもタイミングによってインストールされるパッケージのバージョンが異なってしまう可能性が存在します。構成管理ツールを用いてバージョン指定でパッケージをインストールする方法もありますが、そのバージョンのパッケージファイルがいつまでリポジトリに存在するかはリポジトリのポリシー次第です。よって複数台のマシンの環境を完全に合わせるのであれば、ローカルにパッケージのスナップショットを作成する必要があります。aptlyを使えば、これを簡単に実現できるのです。

ローカルパッケージリポジトリの作成は、独自にDebianパッケージを作成しそれを特定のネットワーク環境内部にのみ公開したい場合に便利です。Ubuntuの場合はPPAを使うという手が存在するものの、アーキテクチャに縛りがあったり、非公開リポジトリを作る場合は有料だったりと、いくつかの制約が存在します。マシン内で閉じた簡易的なリポジトリでよければdpkgコマンドやapt-ftparchiveコマンドを使って構築することも可能ではありますが、提供するパッケージ数が増えてきたり、ネットワーク越しに公開したい場合に手間がかかります。aptlyを使えば、ミラーやスナップショットと同じ要領でローカルパッケージの提供が行えますし、部分的に公式リポジトリの内容をマージすることも可能です。

まだ実験的ではありますが、REST APIを用いてリポジトリの操作を行えます。CIツールと組み合わせてテストが通ったパッケージを自動的にリポジトリに追加する際に役に立つことでしょう。

単に公式パッケージのミラーサイトを作りたいだけであれば、第47回の後半で紹介しているapt-mirrorが存在します。こちらはフルミラーですのでストレージのリソースをそれなりに使用するものの、リポジトリのメタデータやパッケージの署名は公式の状態をそのまま維持するため、apt-keyによる鍵の追加は不要になるというメリットがあります。また、実際にインストールするパッケージのみキャッシュしたいということであれば、第315回で紹介したapt-cacher-ngが便利です。こちらはsources.listを変更する必要すらなく、プロキシサーバーを指定する要領で構築したキャッシュを利用できます。

どちらのツールもaptlyほど柔軟な管理は行えませんが、設定や環境構築がシンプルというメリットがあります。目的・用途に応じて使い分けるとよいでしょう。

aptlyのインストール

aptlyのパッケージは公式リポジトリにも存在しますが、Ubuntu 16.04 LTSで0.9.6、開発中の17.10で1.0.1と最新の1.1.1に比べると若干古いです。特に16.04上で運用するとなると、1.x系にあげておきたいところでしょう。そこで今回は公式サイトのリポジトリからインストールすることにします。

$ wget -qO - https://www.aptly.info/pubkey.txt | sudo apt-key add -
$ echo "deb http://repo.aptly.info/ squeeze main" | sudo tee /etc/apt/sources.list.d/aptly.list
$ sudo apt update
$ sudo apt install aptly

DebianとUbuntuで同じパッケージなので、リポジトリのURL部分はUbuntuであってもsqueezeのままでかまいません。

aptlyを運用するためにはリポジトリ用のGPG鍵が必要になります。普段使っているGPG鍵でも実装上は問題ありませんが、リポジトリ用に別の鍵を作るほうが無難です。またリポジトリ用のデータベースはaptlyを実行したユーザーのホームディレクトリに作られるため、aptly専用のユーザーを作ることも考えたほうがいいでしょう[1]⁠。可能であればLXDのようにコンテナの中に閉じ込めてしまいましょう。今回はaptlyユーザーを作って、その中で作業を行います。

$ sudo adduser aptly
ユーザー `aptly' を追加しています...
新しいグループ `aptly' (1001) を追加しています...
新しいユーザー `aptly' (1001) をグループ `aptly' に追加しています...
ホームディレクトリ `/home/aptly' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
Changing the user information for aptly
Enter the new value, or press ENTER for the default
        Full Name []: aptly
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
以上で正しいですか? [Y/n]

aptlyユーザーに切り替えて、GPG鍵を生成します。標準的な選択肢をそのまま選んでいけば問題ありません。

$ sudo -iu aptly
$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: ディレクトリ「/home/aptly/.gnupg」ができました
gpg: 新しい構成ファイル「/home/aptly/.gnupg/gpg.conf」ができました
gpg: *警告*: 「/home/aptly/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵リング「/home/aptly/.gnupg/secring.gpg」ができました
gpg: 鍵リング「/home/aptly/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
選択は?
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
(null)は無期限です
これで正しいですか? (y/N) y

あなたの鍵を同定するためにユーザIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザIDを構成します:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

本名: aptly
電子メール・アドレス: aptly@example.com
コメント:
次のユーザIDを選択しました:
    "aptly <aptly@example.com>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。
(中略)
gpg: /home/aptly/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵C6D7028Bを究極的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/C6D7028B 2017-08-17
      フィンガー・プリント = A6D2 FEF3 B835 CA7E 809F  35A9 2F19 39DF C6D7 028B
uid                  aptly <aptly@example.com>
sub   2048R/B36DF2F0 2017-08-17

これでaptlyを使う準備が整いました。

特定パッケージのミラーリポジトリを作る

例としてUbuntu 16.04 LTSのfcitxパッケージとmozc関連のパッケージのミラーリポジトリを作ってみましょう。aptlyはaptコマンドを経由せず、自分自身の信頼する鍵のリストからリポジトリのメタデータを検証します。これはシステムのリポジトリ公開鍵リストとは独立して管理できるようにするためです。

そこであらかじめUbuntu公式リポジトリの公開鍵を信頼する鍵として取り込んでおきます。公式リポジトリの公開鍵リストはubuntu-keyringパッケージとして提供されています。一般的なインストール方法なら最初からインストールされているはずです。Debianのリポジトリの公開鍵が必要なら、debian-archive-keyringパッケージやdebian-keyringパッケージをインストールしてください。

$ sudo apt install ubuntu-keyring
$ gpg --no-default-keyring \
  --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg \
  --export | gpg --no-default-keyring --keyring trustedkeys.gpg --import
gpg: 鍵437D05B5: 公開鍵"Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>"をインポートしました
gpg: 鍵FBB75451: 公開鍵"Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>"をインポートしました
gpg: 鍵C0B21F32: 公開鍵"Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>"をインポートしました
gpg: 鍵EFE21092: 公開鍵"Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>"をインポートしました
gpg: 処理数の合計: 4
gpg:               インポート: 4  (RSA: 2)
gpg: 究極的に信用する鍵C6D7028Bの公開鍵が見つかりません
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u

では適当なミラーリポジトリを作成してみましょう。-architecutresでミラーするアーキテクチャを制限します。-filterオプションはミラーするパッケージを制限します。いずれも指定しない場合は、フルミラー相当になりますので、かなりのパッケージをダウンロードすることになります。今回の場合、パッケージ名が「fcitx」のパッケージもしくは「mozc-」で始まるパッケージを指定しています。他にも-filterでは、Debianパッケージのフィールドを使ったフィルタリングもできます。たとえば特定のソースパッケージから生成されるバイナリパッケージをミラーしたい場合は$Source (foo)と指定します。詳細は公式ドキュメントのPACKAGE QUERIESを参照してください。

-filter-with-depsは依存するパッケージも一緒にインストールするオプションです。一通りオプションを指定した後ろに任意のリポジトリ名(今回は「ange⁠⁠)を指定した上で、ミラー元のURLやコンポーネント/etc/apt/sources.listに記載している内容)を記述します。今回はxenialコンポーネントのみを指定しています。

$ aptly mirror create -architectures=amd64 -filter='fcitx | Name (~ mozc-*)' \
  -filter-with-deps ange http://jp.archive.ubuntu.com/ubuntu/ \
  xenial main restricted universe multiverse
Config file not found, creating default config at /home/aptly/.aptly.conf

Downloading http://jp.archive.ubuntu.com/ubuntu/dists/xenial/InRelease...
gpgv: 2016年04月22日 08時25分09秒 JSTにDSA鍵ID 437D05B5で施された署名
gpgv: "Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>"からの正しい署名
gpgv: 2016年04月22日 08時25分09秒 JSTにRSA鍵ID C0B21F32で施された署名
gpgv: "Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>"からの正しい署名

Mirror [ange]: http://jp.archive.ubuntu.com/ubuntu/ xenial successfully added.
You can run 'aptly mirror update ange' to download repository contents.

ミラーリポジトリを作成したら、aptly mirror updateコマンドで最新のパッケージをダウンロードしましょう。

$ aptly mirror update ange
gpgv: 2016年04月22日 08時25分09秒 JSTにDSA鍵ID 437D05B5で施された署名
gpgv: "Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>"からの正しい署名
gpgv: 2016年04月22日 08時25分09秒 JSTにRSA鍵ID C0B21F32で施された署名
gpgv: "Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>"からの正しい署名
Downloading & parsing package files...
Downloading http://jp.archive.ubuntu.com/ubuntu/dists/xenial/main/binary-amd64/Packages.gz...
Downloading http://jp.archive.ubuntu.com/ubuntu/dists/xenial/restricted/binary-amd64/Packages.gz...
Downloading http://jp.archive.ubuntu.com/ubuntu/dists/xenial/universe/binary-amd64/Packages.gz...
Downloading http://jp.archive.ubuntu.com/ubuntu/dists/xenial/multiverse/binary-amd64/Packages.gz...
Applying filter...
Packages filtered: 53837 -> 271.
Building download queue...
Download queue: 271 items (149.93 MiB)
Downloading http://jp.archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm2_2.4.67-1_amd64.deb...
Downloading http://jp.archive.ubuntu.com/ubuntu/pool/main/u/ucf/ucf_3.0036_all.deb...
(中略)
Downloading http://jp.archive.ubuntu.com/ubuntu/pool/universe/m/mozc/emacs-mozc_2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1_amd64.deb...
Downloading http://jp.archive.ubuntu.com/ubuntu/pool/main/libx/libxcb/libxcb-render0_1.11.1-1ubuntu1_amd64.deb...

Mirror `ange` has been successfully updated.

xenial以外にもリリース後のアップデートパッケージが格納されるxenial-updatesや、より新しいリリースからのバックポートパッケージが格納されるxenial-backportsのパッケージもミラーしたい場合は、個別にaptly mirror createを実行する必要があります。後ほど説明するスナップショット機能を用いて、作成した複数のミラーリポジトリをひとつのリポジトリに統合する機能もあります。

$ aptly mirror create -architectures=amd64 -filter='fcitx | Name (~ mozc-*)' \
  -filter-with-deps ange-updates http://jp.archive.ubuntu.com/ubuntu/ \
  xenial-updates main restricted universe multiverse
$ aptly mirror update ange-updates

取得したパッケージは~/.aptly/pool/以下にハッシュを元にした接頭辞付きで保存されます。これでリポジトリのミラーが完了しました。なお、このままだとパッケージリポジトリとしては使えません。後述の「リポジトリを公開する」の手順を行う必要があります。

リポジトリの状態を確認する

リポジトリの状態はaptly mirror showで確認できます。

$ aptly mirror show ange
Name: ange
Archive Root URL: http://jp.archive.ubuntu.com/ubuntu/
Distribution: xenial
Components: main, restricted, universe, multiverse
Architectures: amd64
Download Sources: no
Download .udebs: no
Filter: fcitx | Name (~ mozc-*)
Filter With Deps: yes
Last update: 2017-08-17 20:44:26 JST
Number of packages: 271

Information from release file:
Acquire-By-Hash: yes
Architectures: amd64 arm64 armhf i386 powerpc ppc64el s390x
Codename: xenial
Components: main restricted universe multiverse
Date: Thu, 21 Apr 2016 23:23:46 UTC
Description:  Ubuntu Xenial 16.04

Label: Ubuntu
Origin: Ubuntu
Suite: xenial
Version: 16.04

また各リポジトリに格納されているパッケージはaptly mirror searchで検索できます。作成したすべてのリポジトリを検索する場合はaptly package searchです。

$ aptly mirror search ange fcitx
fcitx_1:4.2.9.1-1ubuntu1_all
$ aptly package search fcitx
fcitx_1:4.2.9.1-1ubuntu1.16.04.2_all
fcitx_1:4.2.9.1-1ubuntu1_all

aptly package showを使うと、一致するパッケージの詳細を表示できます。

$ aptly package show fcitx
Package: fcitx
Priority: optional
Section: utils
Installed-Size: 36
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: IME Packaging Team <pkg-ime-devel@lists.alioth.debian.org>
Architecture: all
Version: 1:4.2.9.1-1ubuntu1
Depends: fcitx-bin, fcitx-data, fcitx-modules
Recommends: fcitx-config-gtk | kde-config-fcitx, fcitx-frontend-all | fcitx-frontend-fbterm, fcitx-ui-classic | fcitx-ui-light, im-config (>= 0.5) | im-switch
Suggests: fcitx-m17n, fcitx-tools
Filename: fcitx_4.2.9.1-1ubuntu1_all.deb
Size: 5564
MD5sum: bcb1e9863263b3278aeb5d118f01f478
SHA1: 1ffac1fa939bb95e6a8cb6d61ebdbcafc0eba851
SHA256: 207e18c52efe00471c62923e9ad7e4e5e0421a25321ff27298f373e965f773a7
SHA512: 4a87c92492c42e3181faf21f724d94b8433281d970b6b4645f38b694096432a77ea2c561505c9b23a9138c5899420f2ba0f937aa982c24158c0d5d883e0ff19d
Description: Flexible Input Method Framework
Homepage: https://github.com/fcitx/fcitx
Supported: 5y
Description-Md5: bb21ec6d5296fba56418f43e299b26e5
Task: ubuntu-live, kubuntu-live, lubuntu-desktop, ubuntukylin-desktop
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu

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

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サーバーを用意したほうがよいでしょう。

ローカルパッケージのリポジトリを作る

ここまではすでに存在するリポジトリからパッケージを取得していました。aptlyでは単なるミラーだけでなく、独自のリポジトリを作ることも可能です。

$ aptly repo create -distribution=dorothy -component=main chise-repo

Local repo [chise-repo] successfully added.
You can run 'aptly repo add chise-repo ...' to add packages to repository.

-distribution「リポジトリを公開する」の項でも指定した公開時のディストリビューション名であり、Ubuntuのリポジトリで言うところの「xenial」「zesty」です。-componentはUbuntuで言うところのmain・universeのようにパッケージの種別ごとに別のディレクトリにしたいときに使用します。最後の「chise-repo」が内部的なリポジトリの名前になります。

さて、作ったリポジトリにパッケージファイルを追加しましょう。

$ aptly repo add chise-repo beatrice/
Loading packages...
[+] libkkc-common_0.3.5-1ubuntu1~1.gbp99dbf9_all added
[+] libkkc-dev_0.3.5-1ubuntu1~1.gbp99dbf9_amd64 added
[+] libkkc-utils-dbg_0.3.5-1ubuntu1~1.gbp99dbf9_amd64 added
[+] libkkc-utils_0.3.5-1ubuntu1~1.gbp99dbf9_amd64 added
[+] libkkc2-dbg_0.3.5-1ubuntu1~1.gbp99dbf9_amd64 added
[+] libkkc2_0.3.5-1ubuntu1~1.gbp99dbf9_amd64 added
[+] libkkc_0.3.5-1ubuntu1~1.gbp99dbf9_source added

$ aptly repo show chise-repo
Name: chise-repo
Comment:
Default Distribution: dorothy
Default Component: main
Number of packages: 7

$ aptly repo search chise-repo libkkc
libkkc_0.3.5-1ubuntu1~1.gbp99dbf9_source

beatrice/の部分にはいくつかの指定方法が存在します。まず拡張子が.deb.udeb.dscのファイルを指定すると、そのパッケージファイルをリポジトリに追加します。ソースパッケージである.dscの場合は、その中で指定されている他のソースアーカイブも一緒に追加してくれます。今回の例のようにディレクトリを指定した場合は、再帰的に拡張子が.deb.udeb.dscのファイルを探しすべて追加します。pbuilderやcowbuilderのようにビルドしたパッケージを一定の場所に集めている場合に便利です。-remove-filesオプションを付けると、取り込みが成功したら元のファイルを削除してくれます。

dputコマンドのように.changesファイルベースで取り込みたい場合は、aptly repo includeを使います。こちらは原則としてGPG鍵で署名済みである必要があります。詳しい使い方はmanページを参照してください。

aptly repo copyaptly repo moveコマンドを使うと、複数のローカルリポジトリ間でパッケージの移動を行えます。テストリポジトリから本番リポジトリに移動したい場合に使えるでしょう。ミラーリポジトリからパッケージを取得したい場合はaptly repo importコマンドを使います。

ローカルリポジトリはミラーリポジトリと異なり、aptly repo publichコマンドを使って直接リポジトリを公開することが可能です。もちろん一度スナップショットを取ってから公開する方法も使えます。スナップショット化しておけば、他のミラーリポジトリの依存パッケージ群をマージした独自のリポジトリを作れるため便利です。

社内開発リポジトリにaptlyはいかが?

ここまで紹介したように、aptlyを使えば独自のDebianパッケージリポジトリをとても簡単に運用できます。社内インフラ用に独自にパッチを当てたパッケージを配布したい、Ubuntu公式リポジトリの一部のパッケージのスナップショットを取りたいなどの用途に最適です。また、パッケージの作成・ビルド・テストリポジトリへのアップロード・各種CIツールによるテスト・本番リポジトリへの移動までのサイクルを機械的に行えるというメリットもあります。

社内開発用にパッケージリポジトリが欲しいと考えているのであれば、aptlyを試してみるのはいかがでしょうか?

おすすめ記事

記事・ニュース一覧