如何在 Debian 二进制包控制文件中注入用户定义的字段

如何在 Debian 二进制包控制文件中注入用户定义的字段

可以使用以下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

相关内容