X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/93ef09e180de95718ce7d7db2a4a200539ca4368..5aa7b2ef565348e637af8dfd9351f82c8cc5b5e6:/build/run-library.sh diff --git a/build/run-library.sh b/build/run-library.sh index f8e5129dae..513e8624ee 100755 --- a/build/run-library.sh +++ b/build/run-library.sh @@ -61,11 +61,12 @@ version_from_git() { } nohash_version_from_git() { + local subdir="$1"; shift if [[ -n "$ARVADOS_BUILDING_VERSION" ]]; then echo "$ARVADOS_BUILDING_VERSION" return fi - version_from_git | cut -d. -f1-4 + version_from_git $subdir | cut -d. -f1-4 } timestamp_from_git() { @@ -74,25 +75,8 @@ timestamp_from_git() { } calculate_python_sdk_cwl_package_versions() { - python_sdk_ts=$(cd sdk/python && timestamp_from_git) - cwl_runner_ts=$(cd sdk/cwl && timestamp_from_git) - - python_sdk_version=$(cd sdk/python && nohash_version_from_git) - cwl_runner_version=$(cd sdk/cwl && nohash_version_from_git) - - if [[ $python_sdk_ts -gt $cwl_runner_ts ]]; then - cwl_runner_version=$python_sdk_version - fi -} - -handle_python_package () { - # This function assumes the current working directory is the python package directory - if [ -n "$(find dist -name "*-$(nohash_version_from_git).tar.gz" -print -quit)" ]; then - # This package doesn't need rebuilding. - return - fi - # Make sure only to use sdist - that's the only format pip can deal with (sigh) - python setup.py $DASHQ_UNLESS_DEBUG sdist + python_sdk_version=$(cd sdk/python && python3 arvados_version.py) + cwl_runner_version=$(cd sdk/cwl && python3 arvados_version.py) } handle_ruby_gem() { @@ -130,9 +114,9 @@ calculate_go_package_version() { checkdirs+=("$1") shift done - if grep -qr git.arvados.org/arvados .; then - checkdirs+=(sdk/go lib) - fi + # Even our rails packages (version calculation happens here!) depend on a go component (arvados-server) + # Everything depends on the build directory. + checkdirs+=(sdk/go lib build) local timestamp=0 for dir in ${checkdirs[@]}; do cd "$WORKSPACE" @@ -146,7 +130,7 @@ calculate_go_package_version() { __returnvar="$version" } -# Usage: package_go_binary services/foo arvados-foo "Compute foo to arbitrary precision" +# Usage: package_go_binary services/foo arvados-foo "Compute foo to arbitrary precision" [apache-2.0.txt] package_go_binary() { local src_path="$1"; shift local prog="$1"; shift @@ -185,7 +169,37 @@ package_go_binary() { fi switches+=("$WORKSPACE/${license_file}=/usr/share/doc/$prog/${license_file}") - fpm_build "$GOPATH/bin/${basename}=/usr/bin/${prog}" "${prog}" dir "${go_package_version}" "--url=https://arvados.org" "--license=GNU Affero General Public License, version 3.0" "--description=${description}" "${switches[@]}" + fpm_build "${WORKSPACE}/${src_path}" "$GOPATH/bin/${basename}=/usr/bin/${prog}" "${prog}" dir "${go_package_version}" "--url=https://arvados.org" "--license=GNU Affero General Public License, version 3.0" "--description=${description}" "${switches[@]}" +} + +# Usage: package_go_so lib/foo arvados_foo.so arvados-foo "Arvados foo library" +package_go_so() { + local src_path="$1"; shift + local sofile="$1"; shift + local pkg="$1"; shift + local description="$1"; shift + + debug_echo "package_go_so $src_path as $pkg" + + calculate_go_package_version go_package_version $src_path + cd $WORKSPACE/packages/$TARGET + test_package_presence $pkg $go_package_version go || return 1 + cd $WORKSPACE/$src_path + go build -buildmode=c-shared -o ${GOPATH}/bin/${sofile} + cd $WORKSPACE/packages/$TARGET + local -a fpmargs=( + "--url=https://arvados.org" + "--license=Apache License, Version 2.0" + "--description=${description}" + "$WORKSPACE/apache-2.0.txt=/usr/share/doc/$pkg/apache-2.0.txt" + ) + if [[ -e "$WORKSPACE/$src_path/pam-configs-arvados" ]]; then + fpmargs+=("$WORKSPACE/$src_path/pam-configs-arvados=/usr/share/doc/$pkg/pam-configs-arvados-go") + fi + if [[ -e "$WORKSPACE/$src_path/README" ]]; then + fpmargs+=("$WORKSPACE/$src_path/README=/usr/share/doc/$pkg/README") + fi + fpm_build "${WORKSPACE}/${src_path}" "$GOPATH/bin/${sofile}=/usr/lib/${sofile}" "${pkg}" dir "${go_package_version}" "${fpmargs[@]}" } default_iteration() { @@ -201,10 +215,6 @@ default_iteration() { [[ ${BASH_REMATCH[1]} -le $LICENSE_PACKAGE_TS ]]; then iteration=2 fi - if [[ $package_type =~ ^python ]]; then - # Fix --iteration for #9242. - iteration=2 - fi echo $iteration } @@ -227,7 +237,7 @@ rails_package_version() { fi local version="$(version_from_git)" if [ $pkgname = "arvados-api-server" -o $pkgname = "arvados-workbench" ] ; then - calculate_go_package_version version cmd/arvados-server "$srcdir" + calculate_go_package_version version cmd/arvados-server "$srcdir" fi echo $version } @@ -326,10 +336,10 @@ test_package_presence() { echo "Package $full_pkgname build forced with --force-build, building" elif [[ "$FORMAT" == "deb" ]]; then declare -A dd - dd[debian9]=stretch dd[debian10]=buster dd[ubuntu1604]=xenial dd[ubuntu1804]=bionic + dd[ubuntu2004]=focal D=${dd[$TARGET]} if [ ${pkgname:0:3} = "lib" ]; then repo_subdir=${pkgname:0:4} @@ -337,11 +347,11 @@ test_package_presence() { repo_subdir=${pkgname:0:1} fi - repo_pkg_list=$(curl -s -o - http://apt.arvados.org/pool/${D}-dev/main/${repo_subdir}/${pkgname}/) + repo_pkg_list=$(curl -s -o - http://apt.arvados.org/${D}/pool/main/${repo_subdir}/${pkgname}/) echo "${repo_pkg_list}" |grep -q ${full_pkgname} if [ $? -eq 0 ] ; then echo "Package $full_pkgname exists upstream, not rebuilding, downloading instead!" - curl -s -o "$WORKSPACE/packages/$TARGET/${full_pkgname}" http://apt.arvados.org/pool/${D}-dev/main/${repo_subdir}/${pkgname}/${full_pkgname} + curl -s -o "$WORKSPACE/packages/$TARGET/${full_pkgname}" http://apt.arvados.org/${D}/pool/main/${repo_subdir}/${pkgname}/${full_pkgname} return 1 elif test -f "$WORKSPACE/packages/$TARGET/processed/${full_pkgname}" ; then echo "Package $full_pkgname exists, not rebuilding!" @@ -406,9 +416,7 @@ handle_rails_package() { fi # For some reason fpm excludes need to not start with /. local exclude_root="${railsdir#/}" - # .git and packages are for the SSO server, which is built from its - # repository root. - local -a exclude_list=(.git packages tmp log coverage Capfile\* \ + local -a exclude_list=(tmp log coverage Capfile\* \ config/deploy\* config/application.yml) # for arvados-workbench, we need to have the (dummy) config/database.yml in the package if [[ "$pkgname" != "arvados-workbench" ]]; then @@ -417,7 +425,7 @@ handle_rails_package() { for exclude in ${exclude_list[@]}; do switches+=(-x "$exclude_root/$exclude") done - fpm_build "${pos_args[@]}" "${switches[@]}" \ + fpm_build "${srcdir}" "${pos_args[@]}" "${switches[@]}" \ -x "$exclude_root/vendor/cache-*" \ -x "$exclude_root/vendor/bundle" "$@" "$license_arg" rm -rf "$scripts_dir" @@ -449,26 +457,12 @@ fpm_build_virtualenv () { case "$PACKAGE_TYPE" in python3) python=python3 - if [[ "$FORMAT" != "rpm" ]]; then - pip=pip3 - else - # In CentOS, we use a different mechanism to get the right version of pip - pip=pip - fi + pip=pip3 PACKAGE_PREFIX=$PYTHON3_PKG_PREFIX ;; - python) - # All Arvados Python2 packages depend on Python 2.7. - # Make sure we build with that for consistency. - python=python2.7 - pip=pip - PACKAGE_PREFIX=$PYTHON2_PKG_PREFIX - ;; esac - if [[ "$PKG" != "libpam-arvados" ]] && - [[ "$PKG" != "arvados-node-manager" ]] && - [[ "$PKG" != "arvados-docker-cleaner" ]]; then + if [[ "$PKG" != "arvados-docker-cleaner" ]]; then PYTHON_PKG=$PACKAGE_PREFIX-$PKG else # Exception to our package naming convention @@ -508,13 +502,19 @@ fpm_build_virtualenv () { fi # Determine the package version from the generated sdist archive - PYTHON_VERSION=${ARVADOS_BUILDING_VERSION:-$(awk '($1 == "Version:"){print $2}' *.egg-info/PKG-INFO)} + if [[ -n "$ARVADOS_BUILDING_VERSION" ]] ; then + UNFILTERED_PYTHON_VERSION=$ARVADOS_BUILDING_VERSION + PYTHON_VERSION=$(echo -n $ARVADOS_BUILDING_VERSION | sed s/~dev/.dev/g | sed s/~rc/rc/g) + else + PYTHON_VERSION=$(awk '($1 == "Version:"){print $2}' *.egg-info/PKG-INFO) + UNFILTERED_PYTHON_VERSION=$(echo -n $PYTHON_VERSION | sed s/\.dev/~dev/g |sed 's/\([0-9]\)rc/\1~rc/g') + fi # See if we actually need to build this package; does it exist already? # We can't do this earlier than here, because we need PYTHON_VERSION... # This isn't so bad; the sdist call above is pretty quick compared to # the invocation of virtualenv and fpm, below. - if ! test_package_presence "$PYTHON_PKG" $PYTHON_VERSION $PACKAGE_TYPE $ARVADOS_BUILDING_ITERATION; then + if ! test_package_presence "$PYTHON_PKG" $UNFILTERED_PYTHON_VERSION $PACKAGE_TYPE $ARVADOS_BUILDING_ITERATION; then return 0 fi @@ -621,30 +621,15 @@ fpm_build_virtualenv () { LICENSE_STRING=`grep license $WORKSPACE/$PKG_DIR/setup.py|cut -f2 -d=|sed -e "s/[',\\"]//g"` COMMAND_ARR+=('--license' "$LICENSE_STRING") - # 12271 - As FPM-generated packages don't include scripts by default, the - # packages cleanup on upgrade depends on files being listed on the %files - # section in the generated SPEC files. To remove DIRECTORIES, they need to - # be listed in that section too, so we need to add this parameter to properly - # remove lingering dirs. But this only works for python2: if used on - # python33, it includes dirs like /opt/rh/python33 that belong to - # other packages. - if [[ "$FORMAT" == "rpm" ]] && [[ "$python" == "python2.7" ]]; then - COMMAND_ARR+=('--rpm-auto-add-directories') - fi - - if [[ "$PKG" == "arvados-python-client" ]] || [[ "$PKG" == "arvados-fuse" ]]; then - if [[ "$python" == "python2.7" ]]; then - COMMAND_ARR+=('--conflicts' "$PYTHON3_PKG_PREFIX-$PKG") - else - COMMAND_ARR+=('--conflicts' "$PYTHON2_PKG_PREFIX-$PKG") - fi + if [[ "$FORMAT" != "rpm" ]]; then + COMMAND_ARR+=('--conflicts' "python-$PKG") fi if [[ "$DEBUG" != "0" ]]; then COMMAND_ARR+=('--verbose' '--log' 'info') fi - COMMAND_ARR+=('-v' "$PYTHON_VERSION") + COMMAND_ARR+=('-v' $(echo -n "$PYTHON_VERSION" | sed s/.dev/~dev/g | sed s/rc/~rc/g)) COMMAND_ARR+=('--iteration' "$ARVADOS_BUILDING_ITERATION") COMMAND_ARR+=('-n' "$PYTHON_PKG") COMMAND_ARR+=('-C' "build") @@ -655,11 +640,7 @@ fpm_build_virtualenv () { COMMAND_ARR+=('--before-remove' "${WORKSPACE}/build/go-python-package-scripts/prerm") fi - if [[ "$python" == "python2.7" ]]; then - COMMAND_ARR+=('--depends' "$PYTHON2_PACKAGE") - else - COMMAND_ARR+=('--depends' "$PYTHON3_PACKAGE") - fi + COMMAND_ARR+=('--depends' "$PYTHON3_PACKAGE") # avoid warning COMMAND_ARR+=('--deb-no-default-config-files') @@ -684,7 +665,7 @@ fpm_build_virtualenv () { done # make sure the systemd service file ends up in the right place - # used by arvados-docker-cleaner and arvados-node-manager + # used by arvados-docker-cleaner if [[ -e "${systemd_unit}" ]]; then COMMAND_ARR+=("usr/share/$python/dist/$PKG/share/doc/$PKG/$PKG.service=/lib/systemd/system/$PKG.service") fi @@ -703,22 +684,15 @@ fpm_build_virtualenv () { done fi - # the libpam module should place a few files in the correct place for the pam - # subsystem - if [[ -e "$WORKSPACE/$PKG_DIR/dist/build/usr/share/$python/dist/$PYTHON_PKG/lib/security/libpam_arvados.py" ]]; then - COMMAND_ARR+=("usr/share/$python/dist/$PYTHON_PKG/lib/security/libpam_arvados.py=/usr/lib/security/") - fi - if [[ -e "$WORKSPACE/$PKG_DIR/dist/build/usr/share/$python/dist/$PYTHON_PKG/share/pam-configs/arvados" ]]; then - COMMAND_ARR+=("usr/share/$python/dist/$PYTHON_PKG/share/pam-configs/arvados=/usr/share/pam-configs/") - fi - - # the python-arvados-cwl-runner package comes with cwltool, expose that version - if [[ -e "$WORKSPACE/$PKG_DIR/dist/build/usr/share/python2.7/dist/python-arvados-cwl-runner/bin/cwltool" ]]; then - COMMAND_ARR+=("usr/share/python2.7/dist/python-arvados-cwl-runner/bin/cwltool=/usr/bin/") + # the python3-arvados-cwl-runner package comes with cwltool, expose that version + if [[ -e "$WORKSPACE/$PKG_DIR/dist/build/usr/share/$python/dist/python-arvados-cwl-runner/bin/cwltool" ]]; then + COMMAND_ARR+=("usr/share/$python/dist/python-arvados-cwl-runner/bin/cwltool=/usr/bin/") fi COMMAND_ARR+=(".") + debug_echo -e "\n${COMMAND_ARR[@]}\n" + FPM_RESULTS=$("${COMMAND_ARR[@]}") FPM_EXIT_CODE=$? @@ -736,6 +710,9 @@ fpm_build_virtualenv () { # Build packages for everything fpm_build () { + # Source dir where fpm-info.sh (if any) will be found. + SRC_DIR=$1 + shift # The package source. Depending on the source type, this can be a # path, or the name of the package in an upstream repository (e.g., # pip). @@ -769,17 +746,6 @@ fpm_build () { COMMAND_ARR+=(--deb-ignore-iteration-in-dependencies) fi - # 12271 - As FPM-generated packages don't include scripts by default, the - # packages cleanup on upgrade depends on files being listed on the %files - # section in the generated SPEC files. To remove DIRECTORIES, they need to - # be listed in that section too, so we need to add this parameter to properly - # remove lingering dirs. But this only works for python2: if used on - # python33, it includes dirs like /opt/rh/python33 that belong to - # other packages. - if [[ "$FORMAT" = rpm ]] && [[ "$python" = python2.7 ]]; then - COMMAND_ARR+=('--rpm-auto-add-directories') - fi - if [[ "$DEBUG" != "0" ]]; then COMMAND_ARR+=('--verbose' '--log' 'info') fi @@ -812,17 +778,15 @@ fpm_build () { declare -a build_depends=() declare -a fpm_depends=() declare -a fpm_exclude=() - declare -a fpm_dirs=( - # source dir part of 'dir' package ("/source=/dest" => "/source"): - "${PACKAGE%%=/*}") - for pkgdir in "${fpm_dirs[@]}"; do - fpminfo="$pkgdir/fpm-info.sh" - if [[ -e "$fpminfo" ]]; then - debug_echo "Loading fpm overrides from $fpminfo" - source "$fpminfo" - break - fi - done + if [[ ! -d "$SRC_DIR" ]]; then + echo >&2 "BUG: looking in wrong dir for fpm-info.sh: $pkgdir" + exit 1 + fi + fpminfo="${SRC_DIR}/fpm-info.sh" + if [[ -e "$fpminfo" ]]; then + debug_echo "Loading fpm overrides from $fpminfo" + source "$fpminfo" + fi for pkg in "${build_depends[@]}"; do if [[ $TARGET =~ debian|ubuntu ]]; then pkg_deb=$(ls "$WORKSPACE/packages/$TARGET/$pkg_"*.deb | sort -rg | awk 'NR==1') @@ -852,13 +816,13 @@ fpm_build () { COMMAND_ARR+=('--exclude' "$i") done + COMMAND_ARR+=("${fpm_args[@]}") + # Append remaining function arguments directly to fpm's command line. for i; do COMMAND_ARR+=("$i") done - COMMAND_ARR+=("${fpm_args[@]}") - COMMAND_ARR+=("$PACKAGE") debug_echo -e "\n${COMMAND_ARR[@]}\n"