
É 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/control
em todos os casos. A solução para isso é sempre começar a partir dos pacotes fonte, já que eles precisam fornecer um debian/control
arquivo. Qualquer outra abordagem envolverá a execução direta de parte da compilação, pois dpkg-buildpackage
requer debian/control
; por exemplo, você poderia executar debian/rules build
e, 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: bar
entrada aos arquivos dos seus pacotes binários control
. Provavelmente isso é mais útil no seu cenário.
Você precisará mudar debian/rules
para fazer isso; você pode usar dh_gencontrol
como acima ou dpkg-gencontrol
diretamente se o pacote não usar dh
.
Responder2
É possível modificar os arquivos de controle dos pacotes binários a partir do --hook-buildinfo
gancho que é chamado imediatamente após debian/rules build
ser chamado, usando dpkg-deb
para 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