Debian 바이너리 패키지 제어 파일에 사용자 정의 필드를 삽입하는 방법

Debian 바이너리 패키지 제어 파일에 사용자 정의 필드를 삽입하는 방법

사용자 정의 필드는 다음 방법을 사용하여 XBS-debian/control 파일에 추가할 수 있습니다 .데비안 정책 매뉴얼에 정의된 대로, 이는 바이너리 .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 builddpkg-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

관련 정보