2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
6 read -rd "\000" helpmessage <<EOF
7 $(basename $0): Orchestrate run-build-packages.sh for one target
10 WORKSPACE=/path/to/arvados $(basename $0) [options]
13 Distribution to build packages for (default: debian10)
15 Build command to execute (default: use built-in Docker image command)
17 Run package install test script "test-packages-[target].sh"
19 Output debug information (default: false)
20 --only-build <package>
21 Build only a specific package
23 Test only a specific package
25 Build a specific architecture (amd64 or arm64, defaults to native architecture)
27 Build even if the package exists upstream or if it has already been
30 Test even if there is no new untested package
31 --build-version <string>
32 Version to build (default:
33 \$ARVADOS_BUILDING_VERSION-\$ARVADOS_BUILDING_ITERATION or
34 0.1.timestamp.commithash)
36 WORKSPACE=path Path to the Arvados source tree to build packages from
42 if ! [[ -n "$WORKSPACE" ]]; then
43 echo >&2 "$helpmessage"
45 echo >&2 "Error: WORKSPACE environment variable not set"
50 if ! [[ -d "$WORKSPACE" ]]; then
51 echo >&2 "$helpmessage"
53 echo >&2 "Error: $WORKSPACE is not a directory"
58 PARSEDOPTS=$(getopt --name "$0" --longoptions \
59 help,debug,test-packages,target:,command:,only-test:,force-test,only-build:,force-build,arch:,build-version: \
70 eval set -- "$PARSEDOPTS"
71 while [ $# -gt 0 ]; do
74 echo >&2 "$helpmessage"
93 ONLY_BUILD="$2"; shift
109 if [[ -z "$2" ]]; then
111 elif ! [[ "$2" =~ (.*)-(.*) ]]; then
112 echo >&2 "FATAL: --build-version '$2' does not include an iteration. Try '${2}-1'?"
114 elif ! [[ "$2" =~ ^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|)(~rc[0-9]+|~dev[0-9]+|)-[0-9]+$ ]]; then
115 echo >&2 "FATAL: --build-version '$2' is invalid, must match pattern ^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+|)(~rc[0-9]+|~dev[0-9]+|)-[0-9]+$"
118 [[ "$2" =~ (.*)-(.*) ]]
119 ARVADOS_BUILDING_VERSION="${BASH_REMATCH[1]}"
120 ARVADOS_BUILDING_ITERATION="${BASH_REMATCH[2]}"
125 if [ $# -gt 1 ]; then
126 echo >&2 "$0: unrecognized argument '$2'. Try: $0 --help"
136 if [[ -n "$ARVADOS_BUILDING_VERSION" ]]; then
137 echo "build version='$ARVADOS_BUILDING_VERSION', package iteration='$ARVADOS_BUILDING_ITERATION'"
140 if [[ -n "$test_packages" ]]; then
141 if [[ -n "$(find $WORKSPACE/packages/$TARGET -name '*.rpm')" ]] ; then
143 /usr/bin/which createrepo >/dev/null
144 if [[ "$?" != "0" ]]; then
146 echo >&2 "Error: please install createrepo. E.g. sudo apt-get install createrepo"
151 createrepo $WORKSPACE/packages/$TARGET
154 if [[ -n "$(find $WORKSPACE/packages/$TARGET -name '*.deb')" ]] ; then
156 /usr/bin/which dpkg-scanpackages >/dev/null
157 if [[ "$?" != "0" ]]; then
159 echo >&2 "Error: please install dpkg-dev. E.g. sudo apt-get install dpkg-dev"
163 /usr/bin/which apt-ftparchive >/dev/null
164 if [[ "$?" != "0" ]]; then
166 echo >&2 "Error: please install apt-utils. E.g. sudo apt-get install apt-utils"
171 (cd $WORKSPACE/packages/$TARGET
172 dpkg-scanpackages --multiversion . 2> >(grep -v 'warning' 1>&2) | tee Packages | gzip -c > Packages.gz
173 apt-ftparchive -o APT::FTPArchive::Release::Origin=Arvados release . > Release
177 COMMAND="/jenkins/package-testing/test-packages-$TARGET.sh"
178 IMAGE="arvados/package-test:$TARGET"
180 IMAGE="arvados/build:$TARGET"
181 if [[ "$COMMAND" != "" ]]; then
182 COMMAND="/usr/local/rvm/bin/rvm-exec default bash /jenkins/$COMMAND --target $TARGET$DEBUG"
186 JENKINS_DIR=$(dirname "$(readlink -e "$0")")
188 if [[ -n "$test_packages" ]]; then
189 pushd "$JENKINS_DIR/package-test-dockerfiles"
190 make "$TARGET/generated"
192 pushd "$JENKINS_DIR/package-build-dockerfiles"
193 make "$TARGET/generated"
196 GOVERSION=$(grep 'const goversion =' $WORKSPACE/lib/install/deps.go |awk -F'"' '{print $2}')
200 time docker build --tag "$IMAGE" \
201 --build-arg HOSTTYPE=$HOSTTYPE \
202 --build-arg BRANCH=$(git rev-parse --abbrev-ref HEAD) \
203 --build-arg GOVERSION=$GOVERSION --no-cache .
206 if test -z "$packages" ; then
207 packages="arvados-api-server
210 arvados-dispatch-cloud
212 arvados-docker-cleaner
222 crunch-dispatch-local
223 crunch-dispatch-slurm
237 python3-arvados-python-client
238 python3-arvados-cwl-runner
239 python3-crunchstat-summary
240 python3-arvados-user-activity"
247 mkdir -p "$WORKSPACE/apps/workbench/vendor/cache-$TARGET"
248 mkdir -p "$WORKSPACE/services/api/vendor/cache-$TARGET"
251 -v "$JENKINS_DIR:/jenkins"
252 -v "$WORKSPACE:/arvados"
253 -v /arvados/services/api/vendor/bundle
254 -v /arvados/apps/workbench/vendor/bundle
255 -v "$WORKSPACE/services/api/vendor/cache-$TARGET:/arvados/services/api/vendor/cache"
256 -v "$WORKSPACE/apps/workbench/vendor/cache-$TARGET:/arvados/apps/workbench/vendor/cache"
259 if [[ -n "$test_packages" ]]; then
260 for p in $packages ; do
261 if [[ -n "$ONLY_BUILD" ]] && [[ "$p" != "$ONLY_BUILD" ]]; then
264 if [[ -e "${WORKSPACE}/packages/.last_test_${TARGET}" ]] && [[ -z "$FORCE_TEST" ]]; then
265 MATCH=`find ${WORKSPACE}/packages/ -newer ${WORKSPACE}/packages/.last_test_${TARGET} -regex .*${TARGET}/$p.*`
266 if [[ "$MATCH" == "" ]]; then
267 # No new package has been built that needs testing
268 echo "Skipping $p test because no new package was built since the last test."
272 # If we're testing all packages, we should not error out on packages that don't exist.
273 # If we are testing one specific package only (i.e. --only-test was given), we should
274 # error out if that package does not exist.
275 if [[ -z "$testing_one_package" ]]; then
276 MATCH=`find ${WORKSPACE}/packages/ -regextype posix-extended -regex .*${TARGET}/$p.*\\(deb\\|rpm\\)`
277 if [[ "$MATCH" == "" ]]; then
278 # No new package has been built that needs testing
279 echo "Skipping $p test because no package file is available to test."
284 echo "START: $p test on $IMAGE" >&2
287 "${docker_volume_args[@]}" \
288 --env ARVADOS_DEBUG=$ARVADOS_DEBUG \
289 --env "TARGET=$TARGET" \
290 --env "WORKSPACE=/arvados" \
293 echo "OK: $p test on $IMAGE succeeded" >&2
296 package_fails="$package_fails $p"
297 echo "ERROR: $p test on $IMAGE failed with exit status $FINAL_EXITCODE" >&2
301 if [[ "$FINAL_EXITCODE" == "0" ]]; then
302 touch ${WORKSPACE}/packages/.last_test_${TARGET}
306 echo "START: build packages on $IMAGE" >&2
307 # Move existing packages and other files into the processed/ subdirectory
308 if [[ ! -e "${WORKSPACE}/packages/${TARGET}/processed" ]]; then
309 mkdir -p "${WORKSPACE}/packages/${TARGET}/processed"
312 mv -f ${WORKSPACE}/packages/${TARGET}/* ${WORKSPACE}/packages/${TARGET}/processed/ 2>/dev/null
314 # give bundle (almost) all the cores. See also the MAKE env var that is passed into the
315 # docker run command below.
316 # Cf. https://build.betterup.com/one-weird-trick-that-will-speed-up-your-bundle-install/
317 tmpfile=$(mktemp /tmp/run-build-packages-one-target.XXXXXX)
318 cores=$(let a=$(grep -c processor /proc/cpuinfo )-1; echo $a)
319 printf -- "---\nBUNDLE_JOBS: \"$cores\"" > $tmpfile
323 "${docker_volume_args[@]}" \
324 -v $tmpfile:/root/.bundle/config \
325 --env ARVADOS_BUILDING_VERSION="$ARVADOS_BUILDING_VERSION" \
326 --env ARVADOS_BUILDING_ITERATION="$ARVADOS_BUILDING_ITERATION" \
327 --env ARVADOS_DEBUG=$ARVADOS_DEBUG \
328 --env "ONLY_BUILD=$ONLY_BUILD" \
329 --env "FORCE_BUILD=$FORCE_BUILD" \
331 --env "MAKE=make --jobs $cores" \
335 echo "OK: build packages on $IMAGE succeeded" >&2
338 echo "ERROR: build packages on $IMAGE failed with exit status $FINAL_EXITCODE" >&2
340 # Clean up the bundle config file
344 if test -n "$package_fails" ; then
345 echo "Failed package tests:$package_fails" >&2