カスタムフィールドは、次の方法を使用してXBS-
debian / controlファイルに追加できます。Debian Policy Manualで定義されているように、これはバイナリ.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
。他のアプローチは、dpkg-buildpackage
必要に応じてビルドの一部を直接実行することですdebian/control
。たとえば、debian/rules build
実行してから実行(バイナリパッケージを作成)するdebian/control
前に、パッチ(この時点で存在する必要があります)を実行できます。debian/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 build
dpkg-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