LOVOT の基盤となるシステムをつくってるチームのひとり id:atotto です。
debian パッケージ をさくっと作るツールの紹介です。 個人的にも Raspberry Pi や、ツールの管理のために活用しています。
背景
debian パッケージ 作り、というと、controlファイルを書いて、changelogを書いて、必要なディレクトリを切って、、、といったことを一通りこなす必要があります。コマンドひとつ社内に配布したいだけだとするとちょっと腰が重いです。 また、CMake, CPackで一元的に作ることもできますが、CMakeと戦うにはそれなりの覚悟(Mastering CMake ←同僚の愛読書)が必要です。
LOVOT のシステムのベースとなるサービスの多くは Go言語を使って開発しています。
参考: PyConJP 2019 らぼっと開発におけるPythonとGo より抜粋
Go言語で書いた成果物(実行ファイル)は依存関係が非常にクリーンで、実行ファイルを各アーキテクチャ(amd64,arm64,armhf, etc...) 毎に配布すればよい、となり、デプロイがとても簡単です。
参考: PyConJP 2019 Yet Another Isolation - Debian Packageと紐づく環境分離 より抜粋(2022/12 現在はUbuntuベース)
そのため、 debianパッケージ をつくるときに考慮することといえば、実行バイナリをどこに配置するのか、サービスであれば、systemdのサービスファイルや、インストールにまつわる処理をどうするか、といったところに絞ることができます。
その目的にあったツールとして、私達は go-bin-deb を使っています。開発元からforkし、いくつか修正を施したものを公開、リリースしています。
使ってみよう!
今回つくる debianパッケージ は、 簡単なスクリプトを /usr/local/bin へ配置するものを作ります。
簡単なスクリプト:
#!/bin/sh echo "LOVOT!!"
セットアップ
まずはセットアップです。 go-bin-deb は、アーキテクチャ毎にリリースが別れています。ここでは、amd64 アーキテクチャの Ubuntu or Debian Linux上で利用することにします。
1. go-bin-deb パッケージをダウンロードします:
curl -sLO https://github.com/groove-x/go-bin-deb/releases/download/$(curl -s https://api.github.com/repos/groove-x/go-bin-deb/releases/latest | jq '.tag_name' -r)/go-bin-deb-amd64.deb
2. go-bin-deb パッケージをインストールします:
sudo dpkg --install go-bin-deb-amd64.deb
deb.json をつくる
次に、debianパッケージ のメタ情報や、ファイル配置を定めるために、deb.json
をつくります。
{ "name": "example-package", "version": "0.0.1", "arch": "all", "description": "short desc of the program", "description-extended": "long desc of the program with multiline", "maintainer": "GROOVE X", "homepage": "https://tech.groove-x.com/", "files": [ { "from": "example-script", "to": "/usr/local/bin", "fperm": "0755" } ], "copyrights": [ { "files": "*", "copyright": "Copyright (c) 2022, GROOVE X, Inc. All rights reserved.", "license": "MIT" } ] }
その他の項目はこちらのリファレンスを参考にしてみてください: https://github.com/groove-x/go-bin-deb#json-file
補足:
arch
をall
としているのは、今回アーキテクチャに影響しないスクリプトだからです- systemd のサービスにする場合は
systemd-file
やpreinst
,postinst
,prerm
,postrm
など活用します
パッケージを作る
go-bin-deb generate
すると、 example-package_0.0.1_all.deb
が作られているはずです。
もちろん、このパッケージはインストールできますので、試してみましょう:
sudo dpkg --install example-package_0.0.1_all.deb
アンインストールも簡単です:
sudo dpkg --remove example-package
リポジトリへアップロードしてつかう
せっかく debianパッケージ を作ったので、 debianパッケージ のリポジトリへ登録してみましょう。debianパッケージリポジトリのサービスは多々ありますが、今回は Google Artifact Registry と packagecloud について簡単に紹介します。
Google Artifact Registry
社内向けや、インスタンス向けに運用するときに活躍するのが Artifact Registry です。以下のドキュメントに沿ってセットアップすると、自分のマシンからでもdebianパッケージを利用できるようになります。
参考ドキュメント:
- Artifact Registry > リポジトリの作成
- Artifact Registry > Debian パッケージを管理する
- Artifact Registry > Debian パッケージをインストールするように構成する
packagecloud
個人的にオススメなのが packagecloud です。公開リポジトリで良ければ無料でリポジトリを持て、利用者のセットアップも簡単にできるので、 debianパッケージ を気軽に配布できるのではないでしょうか?
参考ドキュメント:
packagecloudでの配布例:
次のステップ
もうすこし実用的な例として、Goのバイナリを debianパッケージ にする例を置いておきますので、参考にしてみてください。アーキテクチャ毎へのリリースのヒントがあります。: https://github.com/atotto/kssh
また、 go-bin-deb をバンドルした dockerコンテナ を準備しているので、よかったら使ってみてください: https://hub.docker.com/repository/docker/atotto/debian-builder
最後に
go-bin-deb を使って debianパッケージ を作ってみました。jsonで構成管理しつつ、手軽にビルドできるので多少敷居は低いのではないでしょうか? Debian公式リポジトリへ登録できるレベルにはならないですが、社内ツールの配布などで活用してみてください!