経緯
これと同様.
AURにHEADをビルドできるPKGBUILDがあるが,これがまたtreesitterのparserをデフォで抱き合わせていない.
(抱き合わせがなくても動くようなconfigにしろよって話でもある)
また複数のArch環境があるから,それぞれで毎日ビルドするのも非常に面倒くさい.
なんで毎日HEADをビルドしてパッケージ化し,ホストするリポジトリを作った.
作り方
PKGBUILDを作る
ArchWikiのPKGBUILDを見るのが早い.実体としてはただのbash構文のスクリプト.
パッケージ名やら依存関係やらをゴリゴリと書いていくだけなのでそこまで難しくない.
今回はAURのneovim-git
をベースにビルド方法を一部変えただけなのでもっと楽.
作ったのはこれ↓
パッケージアーカイブを作る
PKGBUILDからパッケージアーカイブ *.pkg.tar.zst
を作る.
PKGBUILDと同一のディレクトリで以下を実行すればよい.
完了するとカレントディレクトリにパッケージが生成される.設定によってはデバッグパッケージも生成される.
[nanami@arch-pkgbuilder neovim-head]$ ls -la neovim-*
-rw-r--r-- 1 nanami nanami 7562254 Feb 26 20:14 neovim-head-0.10.0.r2452.gad5a155b1f-1-x86_64.pkg.tar.zst
リポジトリを作成
pacmanのリポジトリはデータベースとパッケージ本体で構成される.
データベースの生成はpacman
に含まれるrepo-add
で可能.
ArchWikiの説明はこれ.
リポジトリのディレクトリ構成は,データベースファイルのreponame.db
, reponame.files
とパッケージ本体が同一ディレクトリであれば特段問題はない.そのディレクトリに対してXferCommandで指定されてるアプリケーション(デフォルトはcurl
だった気がする…?)がアクセス可能であればよい.
ただ他のディストリビューションやアーキテクチャで併用することを考慮して,適当に決めたルート(ここではreporoot
にしておく)からarchlinux/x86_64
の位置に配置することにした.
あとは配置するディレクトリにパッケージをコピーして,repo-add
を実行すればよい.
データベースが存在すれば既存のものが更新され,存在しなければ新たにデータベースが作成される.
reponame
で指定した名前がリポジトリの名称になる.これを後でpacman.conf
に記載することになる.
適当にホストする
ローカルで使うだけなら特段何もしなくてもよし.
HTTP経由で引っ張りたいのであれば,reporoot
に対してnginxとかapacheでHTTPアクセス可能にすれば良いだろう.
自分は自宅のNFS上に置いたので,これを自宅k8sで走らせたnginxコンテナからマウントしてホストした.
特に隠す物もないのでPublicにしている.https://pkg.myuu.dev
pacmanの設定に加える
pacman.conf
を編集し,以下のエントリを追加する.
$arch
にはマシンのアーキテクチャが勝手に入る.
正しく設定出来ていれば,pacman -Sy
で自作リポジトリのデータベースが落ちてくるはず.
[nanami@arch-pkgbuilder ~]$ sudo pacman -Sy
:: Synchronizing package databases...
core 129.9 KiB 565 KiB/s 00:00 [##################################################################] 100%
extra 8.3 MiB 39.0 MiB/s 00:00 [##################################################################] 100%
myuurepo 728.0 B 2.63 KiB/s 00:00 [##################################################################] 100%
こんな感じでmyuurepo
ってのが追加されている.
補足
パッケージ署名
正当なパッケージであることを保証するために,パッケージ署名をを付与するとよい.
今回は自動でビルドさせたりをしたかったので面倒だから付けていない(そもそもパッケージ作成を自動化ワークフローでやらせるのが推奨されてない.まあそれはそう.)
GPG Keyを作る
gpg --gen-key
ここでは書かないがバックアップと失効証明書はちゃんとエクスポートした方が良い.
作成すると鍵のfingerprintが出力されるので覚えておく.以下のコマンドで後から確認も出来る.
gpg --list-keys
自身の公開鍵を鍵サーバーへアップロード
他者が検証するときに使うため.
gpg --send-key <key fingerprint>
makepkgの署名設定
/etc/makepkg.conf
or ~/.config/pacman/makepkg.conf
の以下をコメントアウト・編集
PACKAGER
はgpg鍵の生成時に入力した実名とメールアドレス,GPGKEY
は鍵のfingerprint.
署名付きでパッケージ生成
makepkg -s --sign
makepkg.conf
やPKGBUILD
側でも署名するよう指示できる.
するとパッケージと*.pkg.tar.zst.sig
という署名ファイルも生成される.
これをパッケージと同じディレクトリに配置して,同じくrepo-add
をすると勝手に認識してくれる.
もし使いたければ…
自分で使う物だけなので大したもの置いてないです.
pacman-key --recv-key 8F2CA5A0068E9627