Inside of LOVOT

GROOVE X 技術ブログ

debianパッケージを作ろう(go-bin-debのススメ)

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

補足:

  • archall としているのは、今回アーキテクチャに影響しないスクリプトだからです
  • systemd のサービスにする場合は systemd-filepreinst,postinst,prerm,postrm など活用します

パッケージを作る

deb.json があるディレクトリで

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パッケージを利用できるようになります。

参考ドキュメント:

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公式リポジトリへ登録できるレベルにはならないですが、社内ツールの配布などで活用してみてください!