可以使用以下XBS-
方法在 debian/control 文件中添加用户定义的字段,按照 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
文件。任何其他方法都将涉及直接运行构建的一部分,因为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