So fügen Sie benutzerdefinierte Felder in Steuerdateien für Debian-Binärpakete ein

So fügen Sie benutzerdefinierte Felder in Steuerdateien für Debian-Binärpakete ein

Es ist möglich, benutzerdefinierte Felder in der Datei debian/control hinzuzufügen, indem Sie die folgende XBS-Methode verwenden:wie im Debian Policy Manual definiert, und diese werden in die binären .deb- und Quellpakete eingefügt.

So etwas vor dem Aufruf von dpkg-buildpackage funktioniert, um ein neues Feld sowohl in die Quell- als auch in die Binärpakete einzufügen. Einige Pakete enthalten jedoch nicht debian/control, wenn sie es generieren (Kernel usw.), daher ist dies nicht immer zuverlässig.

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

Es ist auch möglich, das benutzerdefinierte Feld in das generierte Quellpaket einzufügen, indemAn dpkg-source übergebene Optionenbeim Erstellen des Pakets:

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

Dadurch wird das Feld jedoch nur in das generierte Quellpaket eingefügt, nicht in die generierten Binärpakete. Gibt es eine Methode, um Felder zuverlässig in die Binärpakete einzufügen?

Antwort1

Es scheint, dass Ihr zugrunde liegendes Problem nicht in allen Fällen auftritt debian/control. Die Lösung hierfür besteht immer darin, mit Quellpaketen zu beginnen, da diese eine debian/controlDatei bereitstellen müssen. Bei jedem anderen Ansatz muss ein Teil des Builds direkt ausgeführt werden, da dpkg-buildpackagedies erforderlich ist debian/control. Sie könnten beispielsweise ausführen debian/rules buildund dann den Patch debian/control(der zu diesem Zeitpunkt vorhanden sein muss) ausführen, bevor Sie ihn ausführen debian/rules binary(wodurch die Binärpakete erstellt werden).

Um zu steuern, was in die Datei der Binärpakete gelangt control, können Sie auch Optionen für hinzufügen dpkg-gencontrol,z.Bmit dh_gencontrol:

override_dh_gencontrol:
        dh_gencontrol -- -Dfoo=bar

fügt einen Foo: barEintrag zu den Dateien Ihrer Binärpakete hinzu control. Dies ist in Ihrem Szenario wahrscheinlich nützlicher.

debian/rulesDazu müssen Sie Änderungen vornehmen . Sie können es dh_gencontrolwie oben verwenden oder dpkg-gencontroldirekt, wenn das Paket es nicht verwendet dh.

Antwort2

Es ist möglich, die Steuerdateien der Binärpakete über den --hook-buildinfoHook zu ändern, der unmittelbar nach debian/rules builddem Aufruf aufgerufen wird, und dpkg-debsie zum Entpacken/Neupacken zu verwenden.

#!/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

verwandte Informationen