#!/bin/shset -eux# Produce a set of Cockpit release tarballs.## This is the script used to create the official releases.## It takes two mandatory arguments:## - the URL to clone the repository from,# eg. 'https://github.com/cockpit-project/cockpit'.## - the version to release, which is also the tag name, eg. '215'.## The main release tarball contains a number of files that are not directly in# version control:# - the usual automake stuff# - several submodules# - pre-compiled HTML and JS code## This script shallow-clones the specified version of Cockpit from the# specified URL, and downloads the version of the tasks container specified in# that version. It then does an offline build of the release tarball, which is# deterministic.## You can use this script to verify the integrity of a particular set of Cockpit# release tarballs, or even use it to create the tarballs for yourself, as an# alternative to downloading it.## The result of running `./autogen.sh && make dist VERSION=...` on any system# ought to be the same, so long as the same versions of the autotools are# present. Everything else present in the tarball is definitively pinned down# in one way or another by the contents of the git repository. This script is# a bit overkill, but it's written in hopes that someone reading it can# reasonably convince themselves about the origin of absolutely everything in a# Cockpit source release.## If this script produces tarballs with different checksums than the# officially-released ones, then please report a bug.URL="$1"VERSION="$2"# We collect the sources into a temporary directory, then use tar to pipe them# into a container with no network or filesystem access, where the actual build# takes place. The container pipes the built source release back to us.SOURCE="$(mktemp -dt 'cockpit-build-XXXXXX')"trap 'rm -rf "${SOURCE}"' EXIT# Clone the release and selected submodules into the temporary directory.git clone \--depth=1 \--recurse-submodules=node_modules \--recurse-submodules=vendor \-b "${VERSION}" \"${URL}" \"${SOURCE}"# Show exactly what we're building.git -C "${SOURCE}" show --no-patch "${VERSION}"# Download the tasks container image used for this release.IMAGE="$(cat "${SOURCE}"/.cockpit-ci/container)"podman pull "${IMAGE}"# Build the checked out sources into the release tarballs, offline.# `make dist` builds both the main and node runtime tarballs.# Wrap both in a tar for output and unwrap on the outside.tar -C "${SOURCE}" -c . | \podman \run \--rm \--pull=never \--network=none \--log-driver=none \--interactive \--env=VERSION="${VERSION}" \"${IMAGE}" \sh -euxc '(mkdir workcd workrpm -q autoconf automakeautomake --versionautoconf --versiontar x./autogen.shmake dist VERSION="${VERSION}") >&2tar -C work -c cockpit-"${VERSION}".tar.xz cockpit-node-"${VERSION}".tar.xz' \| tar -xv# Show the result.sha256sum cockpit-"${VERSION}".tar.xz cockpit-node-"${VERSION}".tar.xz