Como injetar campos definidos pelo usuário em arquivos de controle de pacote binário Debian

Como injetar campos definidos pelo usuário em arquivos de controle de pacote binário Debian

É possível adicionar campos definidos pelo usuário no arquivo debian/control usando o XBS-método,conforme definido no Manual de Políticas Debian, e eles serão injetados nos pacotes binários .deb e de origem.

Algo assim antes de chamar dpkg-buildpackage funcionará para injetar um novo campo nos pacotes fonte e binário. Mas alguns pacotes não contêm debian/control à medida que o geram (kernel, etc.), portanto isso nem sempre é confiável.

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

Também é possível injetar o campo definido pelo usuário no pacote fonte gerado usandoopções passadas para dpkg-sourceao construir o pacote:

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

No entanto, isso apenas injetará o campo no pacote fonte gerado, não nos pacotes binários gerados. Existe um método para injetar campos de forma confiável nos pacotes binários?

Responder1

Parece que o seu problema subjacente não ocorre debian/controlem todos os casos. A solução para isso é sempre começar a partir dos pacotes fonte, já que eles precisam fornecer um debian/controlarquivo. Qualquer outra abordagem envolverá a execução direta de parte da compilação, pois dpkg-buildpackagerequer debian/control; por exemplo, você poderia executar debian/rules builde, em seguida, corrigir debian/control(que deve existir neste ponto) antes de executar debian/rules binary(que produz os pacotes binários).

Para controlar o que entra no arquivo dos pacotes binários control, você também pode adicionar opções para dpkg-gencontrol,por exemplousando dh_gencontrol:

override_dh_gencontrol:
        dh_gencontrol -- -Dfoo=bar

irá adicionar uma Foo: barentrada aos arquivos dos seus pacotes binários control. Provavelmente isso é mais útil no seu cenário.

Você precisará mudar debian/rulespara fazer isso; você pode usar dh_gencontrolcomo acima ou dpkg-gencontroldiretamente se o pacote não usar dh.

Responder2

É possível modificar os arquivos de controle dos pacotes binários a partir do --hook-buildinfogancho que é chamado imediatamente após debian/rules buildser chamado, usando dpkg-debpara descompactá-los/reembalá-los.

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

informação relacionada