# SPDX-License-Identifier: AGPL-3.0
import argparse
+import errno
import functools
import glob
import locale
class TimestampFile:
def __init__(self, path):
self.path = path
+ # Make sure the dirname for `path` exists
+ p = os.path.dirname(path)
+ try:
+ os.makedirs(p)
+ except OSError as exc:
+ if exc.errno == errno.EEXIST and os.path.isdir(p):
+ pass
+ else:
+ raise
self.start_time = time.time()
def last_upload(self):
return -1
def update(self):
- os.close(os.open(self.path, os.O_CREAT | os.O_APPEND))
- os.utime(self.path, (time.time(), self.start_time))
-
+ try:
+ os.close(os.open(self.path, os.O_CREAT | os.O_APPEND))
+ os.utime(self.path, (time.time(), self.start_time))
+ except:
+ # when the packages directory is created/populated by a build in a
+ # docker container, as root, the script that runs the upload
+ # doesn't always have permission to touch a timestamp file there.
+ # In production, we build/upload from ephemeral machines, which
+ # means that the timestamp mechanism is not used. We print a
+ # warning and move on without erroring out.
+ print("Warning: unable to update timestamp file",self.path,"permission problem?")
+ pass
class PackageSuite:
NEED_SSH = False
class DebianPackageSuite(DistroPackageSuite):
- FREIGHT_SCRIPT = """
+ APT_SCRIPT = """
cd "$1"; shift
DISTNAME=$1; shift
-freight add "$@" "apt/$DISTNAME"
-freight cache "apt/$DISTNAME"
-rm "$@"
+for package in "$@"; do
+ set +e
+ aptly repo search "$DISTNAME" "${package%.deb}" >/dev/null 2>&1
+ RET=$?
+ set -e
+ if [[ $RET -eq 0 ]]; then
+ echo "Not adding $package, it is already present in repo $DISTNAME"
+ rm "$package"
+ else
+ aptly repo add -remove-files "$DISTNAME" "$package"
+ fi
+done
+aptly publish update "$DISTNAME" filesystem:"${DISTNAME%-*}":
"""
def __init__(self, glob_root, rel_globs, target, ssh_host, ssh_opts, repo):
super().__init__(glob_root, rel_globs, target, ssh_host, ssh_opts)
self.TARGET_DISTNAMES = {
- 'debian8': 'jessie-'+repo,
- 'debian9': 'stretch-'+repo,
'debian10': 'buster-'+repo,
- 'ubuntu1404': 'trusty-'+repo,
- 'ubuntu1604': 'xenial-'+repo,
+ 'debian11': 'bullseye-'+repo,
'ubuntu1804': 'bionic-'+repo,
'ubuntu2004': 'focal-'+repo,
}
def post_uploads(self, paths):
- self._run_script(self.FREIGHT_SCRIPT, self.REMOTE_DEST_DIR + '/' + self.target,
+ self._run_script(self.APT_SCRIPT, self.REMOTE_DEST_DIR + '/' + self.target,
self.TARGET_DISTNAMES[self.target],
*self._paths_basenames(paths))
REPODIR=$1; shift
rpmsign --addsign "$@" </dev/null
mv "$@" "$REPODIR"
-createrepo "$REPODIR"
+createrepo -c ~/.createrepo-cache --update "$REPODIR"
"""
REPO_ROOT = '/var/www/rpm.arvados.org/'
'sdk/python/dist/*.tar.gz',
'sdk/cwl/dist/*.tar.gz',
'services/fuse/dist/*.tar.gz',
+ 'tools/crunchstat-summary/dist/*.tar.gz',
),
'gems': _define_suite(GemPackageSuite,
'sdk/ruby/*.gem',
if args.workspace is None:
parser.error("workspace not set from command line or environment")
- for target in ['debian8', 'debian9', 'debian10', 'ubuntu1404', 'ubuntu1604', 'ubuntu1804', 'ubuntu2004']:
+ for target in ['debian10', 'debian11', 'ubuntu1804', 'ubuntu2004']:
PACKAGE_SUITES[target] = _define_suite(
DebianPackageSuite, os.path.join('packages', target, '*.deb'),
target=target, repo=args.repo)