rpm-buildとrpmlintをマスターする:自作スクリプトをFedora標準のパッケージへ

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

課題:手動デプロイ — システム管理者の時間を奪う「ブラックホール」

考えてみてください。Pythonで非常に便利なログバックアップツールを書き上げたばかりだとします。上司から、社内インフラの50台のFedoraサーバーに即座にデプロイするよう指示されました。あなたならどうしますか?

最も手っ取り早い方法は、scpでファイルを転送し、各マシンにsshでログインしてchmod +xを実行し、/usr/binにシンボリックリンクを作成することでしょう。一見問題なさそうですが、現実は過酷です。数台のマシンでライブラリ(依存関係)が不足していたり、新しいバージョンへの更新が必要になったりしただけで、各サーバーを一つずつ調査して修正するのは悪夢となります。

私はFedoraをメインマシンとして2年間使用しています。社内ツールの配布という課題に直面したとき、Ansibleでファイルをコピーするか、より「標準的」な方法を探すか迷いました。その結果、RPMパッケージ化こそがメンテナンス時間を80%節約してくれる答えでした。

なぜファイルの手動コピーは疲弊を招くのか?

「コピー&ペースト」でソフトウェアをインストールすると、パッケージマネージャーであるDNFはその存在を全く認識できません。これにより、4つの大きな問題が発生します。

  • バージョンの混乱: どのサーバーがv1.0を実行していて、どのサーバーがv1.2に更新済みかを把握するのが非常に困難です。
  • 依存関係のエラー: ツールにcurljqが必要な場合、単なるコピー用スクリプトではそれらを自動的にインストールできません。
  • アンインストールの苦労: 手動で削除するために、配置したすべてのファイルの正確な場所を覚えておく必要があります。
  • 完全性の欠欠如: チェックサムもデジタル署名もありません。サーバー上のファイルが改ざんされていないと誰が保証できるでしょうか?

代替案は本当に優れているか?

RPMを選択する前に、いくつかの方法を検討しました:

  1. Tar形式(.tar.gz): シンプルですが、依存関係の管理という課題が残り、トラブル発生時のロールバックも非常に困難です。
  2. Flatpak: デスクトップアプリには最適ですが、システムへの深い干渉が必要なCLIツールには肥大化しすぎています。
  3. コンテナ(Podman/Docker): 環境を隔離するには良い選択肢です。しかし、軽量なスクリプトの場合、コンテナを使うのは「鶏を割くに焉んぞ牛刀を用いん(牛刀をもって鶏を割く)」のような過剰な対応になりがちです。

rpm-buildとrpmlintによるプロフェッショナルなパッケージ化

Fedora/RHELのエコシステムにおいて、RPMは「ネイティブ言語」です。.rpmパッケージを作成することで、依存関係の自動インストール、バージョン管理、社内リポジトリ経由の一括デプロイといったdnfの強力な機能を、コマンド一つで活用できるようになります。

ステップ1:環境のセットアップ

まず、パッケージのビルドとチェックに必要なツールセットをインストールします。ターミナルを開き、以下のコマンドを実行してください。

sudo dnf install -y rpm-build rpmlint rpmdevtools

次に、RPMのビルド用ディレクトリ構造を初期化します。

rpmdev-setuptree

このコマンドにより、~/rpmbuildディレクトリが作成され、その中にSOURCES(ソースコード)、SPECS(ビルド設定ファイル)、RPMS(完成したパッケージ)などの専用フォルダが用意されます。

ステップ2:ソースコードの準備

ここでは、itfromzero-hello.shというスクリプトがあると仮定します。これをバージョン1.0の標準に従って圧縮します。

# ディレクトリ構造の作成
mkdir -p itfromzero-hello-1.0
cat <<EOF > itfromzero-hello-1.0/itfromzero-hello.sh
#!/bin/bash
echo "itfromzero.comへようこそ!"
EOF

# tarballの作成
tar -czvf itfromzero-hello-1.0.tar.gz itfromzero-hello-1.0/
mv itfromzero-hello-1.0.tar.gz ~/rpmbuild/SOURCES/

ステップ3:SPECファイルの作成 — RPMパッケージの魂

~/rpmbuild/SPECSに移動し、itfromzero-hello.specファイルを作成します。ここでソフトウェアの「身分証明書」を定義します。

Name:           itfromzero-hello
Version:        1.0
Release:        1%{?dist}
Summary:        itfromzeroからの挨拶スクリプト

License:        MIT
URL:            https://itfromzero.com
Source0:        %{name}-%{version}.tar.gz

BuildArch:      noarch
Requires:       bash, curl

%description
システム管理者や開発者のための、標準的なRPMパッケージ化の例です。

%prep
%setup -q

%install
mkdir -p %{buildroot}/usr/bin
install -m 0755 itfromzero-hello.sh %{buildroot}/usr/bin/itfromzero-hello

%files
/usr/bin/itfromzero-hello

%changelog
* Sun May 17 2026 Admin <[email protected]> - 1.0-1
- 初期パッケージ

重要な注意点: Requiresセクションには依存関係をリストアップします。インストール先のマシンにcurlがない場合、DNFはツールをインストールする前に自動的にダウンロードします。

ステップ4:rpmlintによるチェック

すぐにビルドしてはいけません。rpmlintを使って構文エラーをチェックしましょう。これはプロのパッケージメンテナーにとっての習慣です。

rpmlint ~/rpmbuild/SPECS/itfromzero-hello.spec

エラー(Error)が表示された場合は修正が必須です。警告(Warning)については、状況に応じて無視しても構いません。

ステップ5:RPMパッケージの生成

いよいよ待ちに待った瞬間です。rpmbuildコマンドを使ってインストールファイルを生成します。

rpmbuild -ba ~/rpmbuild/SPECS/itfromzero-hello.spec

数秒後、RPMファイルが~/rpmbuild/RPMS/noarch/ディレクトリに作成され、配布可能な状態になります。

ステップ6:成果の確認

作成したパッケージを、本物のソフトウェアと同じようにインストールしてみましょう。

sudo dnf install ~/rpmbuild/RPMS/noarch/itfromzero-hello-1.0-1.fc40.noarch.rpm

itfromzero-helloと入力して実行結果を確認してください。非常にプロフェッショナルな仕上がりではないでしょうか?

最後に

最初は.specファイル内の構文が多く、rpm-buildに少し圧倒されるかもしれません。しかし、信じてください。数十台のサーバーを管理する場合、社内RPMリポジトリを持つことで、枕を高くして眠れるようになります。2時間かけて手動でコマンドを打つ代わりに、システム全体でdnf updateを実行するだけで、わずか2分で終わります。失敗を恐れずに挑戦してください。それがLinuxスキルを向上させる最短の道です!

Share: