Debian バイナリ パッケージ制御ファイルにユーザー定義フィールドを挿入する方法

Debian バイナリ パッケージ制御ファイルにユーザー定義フィールドを挿入する方法

debian/controlファイルにユーザー定義フィールドを追加するには、次のXBS-方法を使用します。Debianポリシーマニュアルで定義されているこれらはバイナリ .deb およびソース パッケージに挿入されます。

dpkg-buildpackage を呼び出す前にこのような操作を行うと、ソース パッケージとバイナリ パッケージの両方に新しいフィールドを挿入できます。ただし、一部のパッケージでは debian/control が生成時に含まれないため (カーネルなど)、この方法は必ずしも信頼できるとは限りません。

sed -i "0,/^\s*$/s//XBS-Git-Branch: ${CI_COMMIT_BRANCH}\n/" debian/control
dpkg-buildpackage

生成されたソースパッケージにユーザー定義フィールドを挿入することもできます。dpkg-source に渡されるオプションパッケージをビルド中に:

dpkg-buildpackage --source-option=-DGit-Branch=${CI_COMMIT_BRANCH}

ただし、これによってフィールドが挿入されるのは生成されたソース パッケージのみで、生成されたバイナリ パッケージには挿入されません。バイナリ パッケージにフィールドを確実に挿入する方法はありますか?

答え1

根本的な問題は、すべてのケースで発生するわけではないようですdebian/control。その解決策は、ソース パッケージから開始することです。ソース パッケージは ファイルを提供する必要があるためです。その他の方法では、が必要なdebian/controlので、ビルドの一部を直接実行する必要があります。たとえば、 を実行し、次に を実行する前に patch (この時点で存在している必要があります) を実行してから(バイナリ パッケージを生成します) を実行できます。dpkg-buildpackagedebian/controldebian/rules builddebian/controldebian/rules binary

バイナリパッケージのcontrolファイルに何を入れるかを制御するには、オプションを追加することもできますdpkg-gencontrol例えば使用dh_gencontrol

override_dh_gencontrol:
        dh_gencontrol -- -Dfoo=bar

Foo: barバイナリ パッケージのファイルにエントリを追加しますcontrol。これはおそらく、シナリオによってはより便利です。

debian/rulesこれを行うには、を変更する必要があります。dh_gencontrol上記のように を使用することも、dpkg-gencontrolパッケージが を使用していない場合は直接 を使用することもできますdh

答え2

--hook-buildinfoが呼び出された直後に呼び出されるフックからバイナリ パッケージの制御ファイルを変更しdebian/rules builddpkg-debそれらを解凍/再パックすることができます。

#!/bin/bash
#
# deb_insert_meta.sh
#
# Inserts CI metadata into all deb files in parent directory
# Intended for use with:
# `dpkg-buildpackage --hook-buildinfo='fakeroot deb_insert_meta.sh'`
# which is the first hook after the binary deb files are generated
# but before checksums for .changes are calculated
# Should be called with 'fakeroot' so that the repacked binaries
# have their content/control ownership/permissions preserved.

pushd .. > /dev/null || exit 1

    for deb_file in *.deb; do
        [ -e "$deb_file" ] || continue

        DEB_TMPDIR=$(mktemp -d)
        if [ -z "${DEB_TMPDIR}" ]; then
            echo "Failed to create a temporary work directory"
            exit 1
        fi

        dpkg-deb -R "${deb_file}" "${DEB_TMPDIR}"

        if [ -e "${DEB_TMPDIR}/DEBIAN/control" ]; then
            if [ -n "${CI_PROJECT_PATH}" ]; then
                echo "Git-Repo: ${CI_PROJECT_PATH}" >> "${DEB_TMPDIR}/DEBIAN/control"
            fi
            if [ -n "${CI_COMMIT_SHA}" ]; then
                echo "Git-Hash: ${CI_COMMIT_SHA}" >> "${DEB_TMPDIR}/DEBIAN/control"
            fi
            if [ -n "${CI_COMMIT_BRANCH}" ]; then
                echo "Git-Branch: ${CI_COMMIT_BRANCH}" >> "${DEB_TMPDIR}/DEBIAN/control"
            fi

            dpkg-deb -b "${DEB_TMPDIR}" "${deb_file}"

        fi

        rm -rf "${DEB_TMPDIR}"

    done

popd > /dev/null || exit 1

exit 0

関連情報