Haskell アプリを RPM SPEC ファイル経由でビルドするか、CI パイプラインから (再現可能な) バイナリを使用するか

Haskell アプリを RPM SPEC ファイル経由でビルドするか、CI パイプラインから (再現可能な) バイナリを使用するか

私はここ 20 年間、RPM をゼロから構築したことがありません。つまり、事実上「一度も」ないと言えます。

[編集] RPM の要件は、ロールバック、バージョン管理などを提供することです。これは交渉の余地がありません。

インストールする必要があるバイナリと構成ファイルは 1 つだけです。ユーザー アカウントとディレクトリの設定が必要ですが、簡単にできると思います。

RPM ビルド プロセスでテスト済みの再現可能なビルドが必要な場合は、CI パイプラインの手順を複製する必要があります。これは簡単ではありません。理想的には、必要なファイルを他の場所から取り込むだけです。

%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:

これは可能ですか? それとも、明らかな解決策を見逃しているのでしょうか。

ありがとう。

答え1

私の観点からすると、正確に何をターゲットにしているかによって多少異なります。

Fedora などの Linux ディストリビューションでは、実際にディストリビューション ビルドでは、ソフトウェアが spec ファイル (ビルドに使用されるパッケージ/コンポーネントも文書化されている密閉されたビルドシステム内) を使用してソースからビルドされることを期待しており、これを可能な限り再現性を高めるための良い方法と見なしています。

ただし、実際には、事前にビルドされたバイナリを取得し、それを spec ファイル内で使用して RPM パッケージをビルドすることができます。シナリオの短縮例を以下に示します。

# […]
Source0: <binary file>
Source1: <config file>

# […]

%prep
%setup -q -c -T

%build

%install
install -D -p -m 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}
install -D -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.conf

# […]

これはうまくいくかもしれませんが、結果として得られる RPM パッケージの依存関係が適切かどうか ( ) rpm -qp --requires <…>.rpm、または実行時の依存関係が欠落していないかどうかを明示的に確認する必要があります。多くの場合、RPM パッケージのビルド中に、ディストリビューション固有のものを追加したり、実行時の依存関係を抽出したりするコンパイル時のオプションやパラメーター (例:CFLAGSまたはLDFLAGSC で書かれたソフトウェア) や後処理スクリプト (例: /usr/lib/rpm/(redhat/)brp-*) があります。これは、あなたにとって関係がある場合も、ない場合もあります (また、一部の後処理スクリプトはビルド済みのバイナリでも機能するかもしれませんが、コンパイラ オプションが不足しているために機能しないものもあります)。私は多くのソフトウェアをパッケージ化していますが、Haskell の経験はありませんが、一部の Fedora パッケージを見ると、実行時の依存関係を持つ RPM パッケージがあります (実行時の依存関係がある場合、これらは RPM パッケージによって満たされる必要があります。それが RPM の動作方法だからです。また、一致するライブラリがファイルシステムのどこかにあるだけでは十分ではありません。RPM は、RPM パッケージによって提供されない限り、それを認識できないためです)。したがって、事前にビルドされたバイナリから RPM パッケージをビルドすると、適切な依存関係のない RPM パッケージが作成され、後で実行時エラーとして現れる可能性があります。

上記の例に関して: SourceX:URL を指定できますが、RPM パッケージをビルドするときには、rpmbuildこれらのファイルがディレクトリ内のディスク上にあることが期待されます(したがって、これらのファイルがディレクトリにどのように配置されるかは、ユーザー次第です)。SOURCESSOURCES

どのLinuxディストリビューションをターゲットにしているか言及していないので、FedoraのHaskell パッケージングガイドライン ここで、さらなるインスピレーションが得られるかどうかはわかりません。また、RPM パッケージはクロスディストリビューションにすることができますが、異なる Linux ディストリビューションではライブラリ/パッケージのバージョンが異なることが多いため、実際には RPM パッケージ内に静的バイナリが含まれることがよくあります。

関連情報