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"
198 time docker build --tag "$IMAGE" --build-arg HOSTTYPE=$HOSTTYPE .
201 if test -z "$packages" ; then
202 packages="arvados-api-server
205 arvados-dispatch-cloud
207 arvados-docker-cleaner
216 crunch-dispatch-local
217 crunch-dispatch-slurm
233 python3-arvados-python-client
234 python3-arvados-cwl-runner
235 python3-crunchstat-summary
236 python3-arvados-user-activity"
243 mkdir -p "$WORKSPACE/apps/workbench/vendor/cache-$TARGET"
244 mkdir -p "$WORKSPACE/services/api/vendor/cache-$TARGET"
247 -v "$JENKINS_DIR:/jenkins"
248 -v "$WORKSPACE:/arvados"
249 -v /arvados/services/api/vendor/bundle
250 -v /arvados/apps/workbench/vendor/bundle
251 -v "$WORKSPACE/services/api/vendor/cache-$TARGET:/arvados/services/api/vendor/cache"
252 -v "$WORKSPACE/apps/workbench/vendor/cache-$TARGET:/arvados/apps/workbench/vendor/cache"
255 if [[ -n "$test_packages" ]]; then
256 for p in $packages ; do
257 if [[ -n "$ONLY_BUILD" ]] && [[ "$p" != "$ONLY_BUILD" ]]; then
260 if [[ -e "${WORKSPACE}/packages/.last_test_${TARGET}" ]] && [[ -z "$FORCE_TEST" ]]; then
261 MATCH=`find ${WORKSPACE}/packages/ -newer ${WORKSPACE}/packages/.last_test_${TARGET} -regex .*${TARGET}/$p.*`
262 if [[ "$MATCH" == "" ]]; then
263 # No new package has been built that needs testing
264 echo "Skipping $p test because no new package was built since the last test."
268 # If we're testing all packages, we should not error out on packages that don't exist.
269 # If we are testing one specific package only (i.e. --only-test was given), we should
270 # error out if that package does not exist.
271 if [[ -z "$testing_one_package" ]]; then
272 MATCH=`find ${WORKSPACE}/packages/ -regextype posix-extended -regex .*${TARGET}/$p.*\\(deb\\|rpm\\)`
273 if [[ "$MATCH" == "" ]]; then
274 # No new package has been built that needs testing
275 echo "Skipping $p test because no package file is available to test."
280 echo "START: $p test on $IMAGE" >&2
283 "${docker_volume_args[@]}" \
284 --env ARVADOS_DEBUG=$ARVADOS_DEBUG \
285 --env "TARGET=$TARGET" \
286 --env "WORKSPACE=/arvados" \
289 echo "OK: $p test on $IMAGE succeeded" >&2
292 package_fails="$package_fails $p"
293 echo "ERROR: $p test on $IMAGE failed with exit status $FINAL_EXITCODE" >&2
297 if [[ "$FINAL_EXITCODE" == "0" ]]; then
298 touch ${WORKSPACE}/packages/.last_test_${TARGET}
302 echo "START: build packages on $IMAGE" >&2
303 # Move existing packages and other files into the processed/ subdirectory
304 if [[ ! -e "${WORKSPACE}/packages/${TARGET}/processed" ]]; then
305 mkdir -p "${WORKSPACE}/packages/${TARGET}/processed"
308 mv -f ${WORKSPACE}/packages/${TARGET}/* ${WORKSPACE}/packages/${TARGET}/processed/ 2>/dev/null
313 "${docker_volume_args[@]}" \
314 --env ARVADOS_BUILDING_VERSION="$ARVADOS_BUILDING_VERSION" \
315 --env ARVADOS_BUILDING_ITERATION="$ARVADOS_BUILDING_ITERATION" \
316 --env ARVADOS_DEBUG=$ARVADOS_DEBUG \
317 --env "ONLY_BUILD=$ONLY_BUILD" \
318 --env "FORCE_BUILD=$FORCE_BUILD" \
323 echo "OK: build packages on $IMAGE succeeded" >&2
326 echo "ERROR: build packages on $IMAGE failed with exit status $FINAL_EXITCODE" >&2
330 if test -n "$package_fails" ; then
331 echo "Failed package tests:$package_fails" >&2