Skip to content
Snippets Groups Projects
Commit cba31202 authored by Simon McVittie's avatar Simon McVittie
Browse files

CI: Build the source package (.dsc) separately


If we run deb-build-snapshot more than once in different container
environments, they can produce different source packages or even
different version numbers (because `git describe` does not guarantee
to emit any specific number of hex digits in the abbreviated sha1).
Ensure that all our builds are consistent by using deb-build-snapshot
to create a single source package (.dsc), and then doing all other
package builds from that .dsc rather than from git.

Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
parent b702f0e8
No related branches found
No related tags found
1 merge request!793Generalize CI to cover a non-special-case suite and architecture
......@@ -75,7 +75,7 @@ set -- "$@" --output-dir="$(pwd)/debian/tmp/artifacts/autopkgtest"
set -- "$@" --no-built-binaries
set -- "$@" debian/tmp/artifacts/build/*.deb
set -- "$@" debian/tmp/artifacts/build/*.dsc
set -- "$@" debian/tmp/artifacts/source/*.dsc
"$@" -- null || e=$?
......
#!/bin/sh
# Copyright 2022 Collabora Ltd.
# Copyright 2022-2025 Collabora Ltd.
# SPDX-License-Identifier: MIT
set -eux
......@@ -19,23 +19,30 @@ case "$(. /usr/lib/os-release; echo "${VERSION_CODENAME-${VERSION}}")" in
;;
esac
set --
if [ -n "${CI_COMMIT_TAG-}" ]; then
set -- "$@" --release
fi
mkdir -p debian/tmp/artifacts/build
set -- "$@" --download "$(pwd)/debian/tmp/artifacts/build"
cd debian/tmp/artifacts/build
dpkg-source -x ../source/*.dsc
cd ./*/
set --
case "$STEAM_CI_DEB_BUILD" in
(all)
set -- -A
;;
(any)
set -- "$@" --dpkg-buildpackage-option=-B
set -- -B
;;
(full)
set -- "$@" --source
;;
(binary)
set -- -b
;;
esac
deb-build-snapshot "$@" localhost
dpkg-buildpackage -us -uc "$@"
cd ..
rm -fr ./*/
#!/bin/sh
# Copyright 2022-2025 Collabora Ltd.
# SPDX-License-Identifier: MIT
set -eux
# This assumes a Steam Runtime SDK where the deb-build-snapshot package
# is available. If we want to run this step on a generic container image
# (like Debian) we will have to install deb-build-snapshot from git instead.
apt-get install -y --no-install-recommends \
build-essential \
deb-build-snapshot \
debhelper \
devscripts \
dpkg-dev \
rsync \
${NULL+}
set --
if [ -n "${CI_COMMIT_TAG-}" ]; then
set -- "$@" --release
fi
mkdir -p "debian/tmp/artifacts/source"
set -- "$@" --download "$(pwd)/debian/tmp/artifacts/source"
deb-build-snapshot "$@" --source-only localhost
......@@ -115,13 +115,31 @@ workflow:
- when: always
stages:
- prepare
- build
- relocatable-install
- deploy
- test
package:source:
stage: prepare
# Any SDK image is fine here, but preferably one with dpkg-dev
# and deb-build-snapshot preinstalled
image: '${SNIPER_DOCKER_REGISTRY}/${SNIPER_DOCKER_IMAGE}'
before_script:
- *common_before_script
- ./ci/prepare-deb.sh
script:
- ./ci/build-dsc.sh
artifacts:
paths:
- debian/tmp/artifacts/source
when: always
.build_deb:
stage: build
needs:
- package:source
image: ${BUILD_IMAGE}
before_script:
- *common_before_script
......@@ -134,32 +152,33 @@ stages:
- debian/tmp/artifacts/build
when: always
package:
package:scout:amd64:
extends: .build_deb
variables:
BUILD_IMAGE: '${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}'
STEAM_CI_DEB_BUILD: full # debuild --build=full, aka -F
STEAM_CI_DEB_BUILD: binary # debuild --build=binary, aka -b
package:i386:
package:scout:i386:
extends: .build_deb
variables:
BUILD_IMAGE: '${SCOUT_DOCKER_REGISTRY}/${SCOUT_I386_DOCKER_IMAGE}'
STEAM_CI_DEB_BUILD: any # debuild --build=any, aka -B
package:soldier:
package:soldier:amd64:
extends: .build_deb
variables:
BUILD_IMAGE: '${SOLDIER_DOCKER_REGISTRY}/${SOLDIER_DOCKER_IMAGE}'
STEAM_CI_DEB_BUILD: full
STEAM_CI_DEB_BUILD: binary
package:sniper:
package:sniper:amd64:
extends: .build_deb
variables:
BUILD_IMAGE: '${SNIPER_DOCKER_REGISTRY}/${SNIPER_DOCKER_IMAGE}'
STEAM_CI_DEB_BUILD: full
STEAM_CI_DEB_BUILD: binary
build:devel:
stage: build
needs: []
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/debian:testing-slim
before_script:
- *common_before_script
......@@ -199,6 +218,7 @@ build:devel:
build:aarch64:
stage: build
needs: []
tags:
- docker
- linux
......@@ -239,6 +259,7 @@ build:aarch64:
build:clang:
stage: build
needs: []
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/debian:testing-slim
before_script:
- *common_before_script
......@@ -288,13 +309,13 @@ build:clang:
relocatable-install:i386:
extends: .relocatable_install
needs:
- package # for the source code
- package:i386
- package:source
- package:scout:i386
image: "${SCOUT_DOCKER_REGISTRY}/${SCOUT_I386_DOCKER_IMAGE}"
script:
- |
mkdir -p _build/cache
dcmd cp -al debian/tmp/artifacts/build/*.dsc _build/cache
dcmd cp -al debian/tmp/artifacts/source/*.dsc _build/cache
dpkg -i \
debian/tmp/artifacts/build/*_i386.*deb \
......@@ -323,13 +344,14 @@ relocatable-install:i386:
relocatable-install:
extends: .relocatable_install
needs:
- package
- package:i386
- package:source
- package:scout:amd64
- package:scout:i386
image: "${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}"
script:
- |
mkdir -p _build/cache
dcmd cp -al debian/tmp/artifacts/build/*.dsc _build/cache
dcmd cp -al debian/tmp/artifacts/source/*.dsc _build/cache
apt-get -y --no-install-recommends install \
libglib2.0-dev:amd64 \
......@@ -451,8 +473,9 @@ autopkgtest:
stage: test
image: "${SCOUT_DOCKER_REGISTRY}/${SCOUT_DOCKER_IMAGE}"
needs:
- package
- package:i386
- package:source
- package:scout:amd64
- package:scout:i386
script:
- ./ci/prepare-deb.sh
- ./ci/autopkgtest.sh
......@@ -464,8 +487,9 @@ deploy:
stage: deploy
needs:
- build:devel # for steam-container-runtime.tar.gz
- package
- package:i386
- package:source
- package:scout:amd64
- package:scout:i386
- relocatable-install
rules:
- if: '$PRESSURE_VESSEL_CI_UPLOAD_HOST == ""'
......
......@@ -236,14 +236,16 @@ class Uploader:
sources = Path('_build', 'upload', 'sources')
sources.mkdir()
for a in Path('debian', 'tmp', 'artifacts', 'build').iterdir():
for a in Path('debian', 'tmp', 'artifacts', 'source').iterdir():
if str(a).endswith('.dsc'):
# Use dcmd to also link all the files that make up the
# source package
subprocess.check_call([
'dcmd', 'ln', str(a), str(sources),
])
elif str(a).endswith(('.deb', '.ddeb')):
for a in Path('debian', 'tmp', 'artifacts', 'build').iterdir():
if str(a).endswith(('.deb', '.ddeb')):
os.link(str(a), str(packages / a.name))
if '_all.' not in a.name:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment