2 # Copyright (C) The Arvados Authors. All rights reserved.
4 # SPDX-License-Identifier: AGPL-3.0
6 . "$(dirname "$(readlink -f "$0")")"/run-library.sh || exit 1
8 read -rd "\000" helpmessage <<EOF
9 $(basename "$0"): Build Arvados packages
12 WORKSPACE=/path/to/arvados $(basename "$0") [options]
16 --build-bundle-packages (default: false)
17 Build api server package with vendor/bundle included
19 Output debug information (default: false)
21 Distribution to build packages for (default: debian10)
22 --only-build <package>
23 Build only a specific package (or ONLY_BUILD from environment)
25 Build a specific architecture (or ARCH from environment, defaults to native architecture)
27 Build even if the package exists upstream or if it has already been
30 Build command to execute (defaults to the run command defined in the
33 WORKSPACE=path Path to the Arvados source tree to build packages from
37 # Begin of user configuration
39 # set to --no-cache-dir to disable pip caching
42 MAINTAINER="Arvados Package Maintainers <packaging@arvados.org>"
43 VENDOR="The Arvados Project"
45 # End of user configuration
47 DEBUG=${ARVADOS_DEBUG:-0}
48 FORCE_BUILD=${FORCE_BUILD:-0}
53 PARSEDOPTS=$(getopt --name "$0" --longoptions \
54 help,build-bundle-packages,debug,target:,only-build:,arch:,force-build \
60 eval set -- "$PARSEDOPTS"
61 while [ $# -gt 0 ]; do
64 echo >&2 "$helpmessage"
72 ONLY_BUILD="$2"; shift
88 echo >&2 "$0: unrecognized argument '$2'. Try: $0 --help"
96 if [[ "$COMMAND" != "" ]]; then
97 COMMAND="/usr/local/rvm/bin/rvm-exec default bash /jenkins/$COMMAND --target $TARGET"
100 STDOUT_IF_DEBUG=/dev/null
101 STDERR_IF_DEBUG=/dev/null
102 DASHQ_UNLESS_DEBUG=-q
103 if [[ "$DEBUG" != 0 ]]; then
104 STDOUT_IF_DEBUG=/dev/stdout
105 STDERR_IF_DEBUG=/dev/stderr
109 # The next section defines a bunch of constants used to build distro packages
110 # for our Python tools. Because those packages include C extensions, they need
111 # to depend on and refer to a specific minor version of Python 3. The logic
112 # below should Just Work for most cases, but you can override variables for a
113 # specific distro if you need to to do something weird.
114 # * PYTHON3_VERSION: The major+minor version of Python we build against
116 # * PYTHON3_EXECUTABLE: The command to run that version of Python,
117 # either a full path or something in $PATH (e.g., "python3.11")
118 # * PYTHON3_PACKAGE: The name of the distro package that provides
119 # $PYTHON3_EXECUTABLE. Our Python packages will all depend on this.
120 # * PYTHON3_PKG_PREFIX: The prefix used in the names of all of our Python
121 # packages. This should match distro convention.
122 PYTHON3_PKG_PREFIX=python3
131 echo -e "$0: Unknown target '$TARGET'.\n" >&2
135 : "${PYTHON3_VERSION:=$("${PYTHON3_EXECUTABLE:-python3}" -c 'import sys; print("{v.major}.{v.minor}".format(v=sys.version_info))')}"
136 : "${PYTHON3_EXECUTABLE:=python$PYTHON3_VERSION}"
139 : "${PYTHON3_PACKAGE:=python$PYTHON3_VERSION}"
142 : "${PYTHON3_PACKAGE:=$(rpm -qf "$(command -v "$PYTHON3_EXECUTABLE")" --queryformat '%{NAME}\n')}"
146 if [[ -z "$WORKSPACE" ]]; then
147 echo >&2 "$helpmessage"
149 echo >&2 "Error: WORKSPACE environment variable not set"
155 fpm --version >/dev/null 2>&1
157 if [[ $? -ne 0 ]]; then
158 echo >&2 "$helpmessage"
160 echo >&2 "Error: fpm not found"
165 RUN_BUILD_PACKAGES_PATH="$(dirname "$0")"
166 RUN_BUILD_PACKAGES_PATH="$(cd "$RUN_BUILD_PACKAGES_PATH" && pwd)" # absolutized and normalized
167 if [ -z "$RUN_BUILD_PACKAGES_PATH" ] ; then
168 # error; for some reason, the path is not accessible
169 # to the script (e.g. permissions re-evaled after suid)
173 debug_echo "$0 is running from $RUN_BUILD_PACKAGES_PATH"
174 debug_echo "Workspace is $WORKSPACE"
176 if [[ -f /etc/profile.d/rvm.sh ]]; then
177 source /etc/profile.d/rvm.sh
178 GEM="rvm-exec default gem"
183 # Make all files world-readable -- jenkins runs with umask 027, and has checked
184 # out our git tree here
185 chmod o+r "$WORKSPACE" -R
187 # More cleanup - make sure all executables that we'll package are 755
188 cd "$WORKSPACE" || exit 1
189 find . -type d -name 'bin' -print0 |xargs -0 -I {} find {} -type f -print0 |xargs -0 -I {} chmod 755 {}
191 # Now fix our umask to something better suited to building and publishing
195 debug_echo "umask is" "$(umask)"
197 if [[ ! -d "$WORKSPACE/packages/$TARGET" ]]; then
198 mkdir -p "$WORKSPACE/packages/$TARGET"
199 chown --reference="$WORKSPACE" "$WORKSPACE/packages/$TARGET"
202 # Required due to CVE-2022-24765
203 git config --global --add safe.directory /arvados
206 debug_echo -e "\nRuby gems\n"
208 FPM_GEM_PREFIX=$($GEM environment gemdir)
210 cd "$WORKSPACE/sdk/ruby" || exit 1
211 handle_ruby_gem arvados
213 cd "$WORKSPACE/sdk/cli" || exit 1
214 handle_ruby_gem arvados-cli
216 cd "$WORKSPACE/services/login-sync" || exit 1
217 handle_ruby_gem arvados-login-sync
223 debug_echo -e "\nGo packages\n"
227 package_go_binary cmd/arvados-client arvados-client "$FORMAT" "$ARCH" \
228 "Arvados command line tool (beta)"
229 package_go_binary cmd/arvados-server arvados-server "$FORMAT" "$ARCH" \
230 "Arvados server daemons"
231 package_go_binary cmd/arvados-server arvados-controller "$FORMAT" "$ARCH" \
232 "Arvados cluster controller daemon"
233 package_go_binary cmd/arvados-server arvados-dispatch-cloud "$FORMAT" "$ARCH" \
234 "Arvados cluster cloud dispatch"
235 package_go_binary cmd/arvados-server arvados-dispatch-lsf "$FORMAT" "$ARCH" \
236 "Dispatch Arvados containers to an LSF cluster"
237 package_go_binary cmd/arvados-server arvados-git-httpd "$FORMAT" "$ARCH" \
238 "Provide authenticated http access to Arvados-hosted git repositories"
239 package_go_binary services/crunch-dispatch-local crunch-dispatch-local "$FORMAT" "$ARCH" \
240 "Dispatch Crunch containers on the local system"
241 package_go_binary cmd/arvados-server crunch-dispatch-slurm "$FORMAT" "$ARCH" \
242 "Dispatch Crunch containers to a SLURM cluster"
243 package_go_binary cmd/arvados-server crunch-run "$FORMAT" "$ARCH" \
244 "Supervise a single Crunch container"
245 package_go_binary cmd/arvados-server arvados-health "$FORMAT" "$ARCH" \
246 "Check health of all Arvados cluster services"
247 package_go_binary cmd/arvados-server keep-balance "$FORMAT" "$ARCH" \
248 "Rebalance and garbage-collect data blocks stored in Arvados Keep"
249 package_go_binary cmd/arvados-server keepproxy "$FORMAT" "$ARCH" \
250 "Make a Keep cluster accessible to clients that are not on the LAN"
251 package_go_binary cmd/arvados-server keepstore "$FORMAT" "$ARCH" \
252 "Keep storage daemon, accessible to clients on the LAN"
253 package_go_binary cmd/arvados-server keep-web "$FORMAT" "$ARCH" \
254 "Static web hosting service for user data stored in Arvados Keep"
255 package_go_binary cmd/arvados-server arvados-ws "$FORMAT" "$ARCH" \
256 "Arvados Websocket server"
257 package_go_binary tools/sync-groups arvados-sync-groups "$FORMAT" "$ARCH" \
258 "Synchronize remote groups into Arvados from an external source"
259 package_go_binary tools/sync-users arvados-sync-users "$FORMAT" "$ARCH" \
260 "Synchronize remote users into Arvados from an external source"
261 package_go_binary tools/keep-block-check keep-block-check "$FORMAT" "$ARCH" \
262 "Verify that all data from one set of Keep servers to another was copied"
263 package_go_binary tools/keep-rsync keep-rsync "$FORMAT" "$ARCH" \
264 "Copy all data from one set of Keep servers to another"
265 package_go_binary tools/keep-exercise keep-exercise "$FORMAT" "$ARCH" \
266 "Performance testing tool for Arvados Keep"
267 package_go_so lib/pam pam_arvados.so libpam-arvados-go "$FORMAT" "$ARCH" \
268 "Arvados PAM authentication module"
271 debug_echo -e "\nPython packages\n"
273 # The Python SDK - Python3 package
274 fpm_build_virtualenv "arvados-python-client" "sdk/python" "$FORMAT" "$ARCH"
276 # Arvados cwl runner - Python3 package
277 fpm_build_virtualenv "arvados-cwl-runner" "sdk/cwl" "$FORMAT" "$ARCH"
279 # The FUSE driver - Python3 package
280 fpm_build_virtualenv "arvados-fuse" "services/fuse" "$FORMAT" "$ARCH"
282 # The Arvados crunchstat-summary tool
283 fpm_build_virtualenv "crunchstat-summary" "tools/crunchstat-summary" "$FORMAT" "$ARCH"
285 # The Docker image cleaner
286 fpm_build_virtualenv "arvados-docker-cleaner" "services/dockercleaner" "$FORMAT" "$ARCH"
288 # The Arvados user activity tool
289 fpm_build_virtualenv "arvados-user-activity" "tools/user-activity" "$FORMAT" "$ARCH"
291 # The cwltest package, which lives out of tree
292 handle_cwltest "$FORMAT" "$ARCH"
298 debug_echo -e "\nRails packages\n"
300 # The rails api server package
301 handle_api_server "$ARCH"
303 # clean up temporary GOPATH