From ccb695f12bad05775f921fb9bb56be2c6a21edb5 Mon Sep 17 00:00:00 2001 From: Noah Hilverling <noah.hilverling@icinga.com> Date: Mon, 6 Dec 2021 09:48:19 +0100 Subject: [PATCH] Revert "Add subscription repo upload script" This reverts commit 1ff1fa3aaea91f076ec8e55af39346a770776831. --- icinga-build-upload-aptly-subscription | 279 ------------------------- 1 file changed, 279 deletions(-) delete mode 100755 icinga-build-upload-aptly-subscription diff --git a/icinga-build-upload-aptly-subscription b/icinga-build-upload-aptly-subscription deleted file mode 100755 index 12d3beb..0000000 --- a/icinga-build-upload-aptly-subscription +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env python - -import sys -import os -import os.path -import argparse -import fnmatch -from hashlib import sha1 -import requests -import json -import re - -# internals -APTLY_SESSION = None - -CI_JOB_NAME = 'CI_JOB_NAME' -CI_JOB_UPLOAD_PREFIX = 'upload[:/]' -ICINGA_BUILD_TYPE = 'ICINGA_BUILD_TYPE' -ICINGA_BUILD_RELEASE_TYPE = 'ICINGA_BUILD_RELEASE_TYPE' -ICINGA_BUILD_TYPE_DEFAULT = 'release' - -UPLOAD_TYPE_DEB = 'DEB' -UPLOAD_TYPE_RPM = 'RPM' - -def scan_dir(path, pattern): - found = [] - for root, dirs, files in os.walk(path): - for file in files: - if fnmatch.fnmatch(file, pattern): - found.append(os.path.join(root, file)) - return found - -def detect_rpm(path): - source = scan_dir(path, '*.src.rpm') - rpms = scan_dir(path, '*.rpm') - if len(source) == 0: - return [] - elif len(source) != 1: - raise StandardError, 'There more than one source RPM in ' + path - - if len(rpms) < 2: - raise StandardError, 'There should be at least 2 RPMS in ' + path - - return rpms - -def detect_deb(path): - source = scan_dir(path, '*.dsc') - tarballs = scan_dir(path, '*.tar*') - changes = scan_dir(path, '*.changes') - debs = scan_dir(path, '*.deb') - - if len(source) == 0: - return [] - elif len(source) != 1: - raise StandardError, 'There more than one source DSC in ' + path - - files = source + tarballs + changes + debs - if len(files) < 2: - raise StandardError, 'There should be at least 2 files in ' + path - - return files - -def sha1_file(path): - h = sha1() - with open(path, 'rb') as f: - for chunk in iter(lambda: f.read(4096), b""): - h.update(chunk) - return h.hexdigest() - -def upload_checksum(files): - files = sorted(files) - h = sha1() - d = dict() - for file in files: - name = os.path.basename(file) - d[name] = fh = sha1_file(file) - h.update(fh) - return (h.hexdigest(), d) - -def ci_split_name(): - """ - Split the CI_JOB_NAME into target and release - e.g. upload/debian/stretch -> ['debian', 'stretch'] - or upload/stack/dev/debian/stretch -> ['stack/dev/debian', 'stretch'] - """ - job_name = os.environ.get(CI_JOB_NAME) - if job_name: - match = re.match("^%s(.+)/([^/]+)$" % CI_JOB_UPLOAD_PREFIX, job_name) - if match: - return match.groups() - - return None - -def get_release_type(): - """ - Get ICINGA_BUILD_RELEASE_TYPE or ICINGA_BUILD_TYPE from environ - """ - if os.environ.has_key(ICINGA_BUILD_RELEASE_TYPE): - return os.environ.get(ICINGA_BUILD_RELEASE_TYPE) - - if os.environ.has_key(ICINGA_BUILD_TYPE): - return os.environ.get(ICINGA_BUILD_TYPE) - - return ICINGA_BUILD_TYPE_DEFAULT - -def ci_release(upload_type, release): - """ - Build the release name from CI_JOB_NAME and ICINGA_BUILD_TYPE - - Examples: - DEB / stretch / release -> icinga-stretch - DEB / stretch / snapshot -> icinga-stretch-snapshots - DEB / stretch / Y -> icinga-stretch-Y - - RPM / 7 / release -> 7/release - RPM / X / Y -> X/Y - """ - build_type = get_release_type() - - if upload_type == UPLOAD_TYPE_DEB: - publish_release = 'icinga-' + release - if build_type != 'release': - publish_release += '-' + build_type - - if build_type == 'snapshot': - publish_release += 's' # snapshots - - return publish_release - elif upload_type == UPLOAD_TYPE_RPM: - return release + '/' + build_type - else: - raise StandardError, "Unknown upload type %s" % upload_type - -def ci_repo(upload_type, target, release): - """ - Build the aptly repo from target, release and ICINGA_BUILD_TYPE (only for DEB) - - Examples: - icinga-debian-stretch-release - icinga-debian-stretch-snapshot - """ - if upload_type != UPLOAD_TYPE_DEB: - raise StandardError, "Repo can only be set on DEB uploads!" - - build_type = get_release_type() - - return 'icinga-%s-%s-%s' % (target, release, build_type) - -def aptly_session(): - global APTLY_SESSION - if APTLY_SESSION is None: - APTLY_SESSION = s = requests.Session() - if args.username and args.password: - s.auth = (args.username, args.password) - if args.insecure: - s.verify = False - - return APTLY_SESSION - -def aptly_url(url): - return args.server + url - -parser = argparse.ArgumentParser(description='Uploading build results to an Aptly server') -parser.add_argument('--server', help='APTLY API service to talk to (e.g. http://127.0.0.1:8080/api)', - default=os.environ.get('APTLY_SERVER', 'http://127.0.0.1:8080/api'), metavar='APTLY_SERVER') -parser.add_argument('--username', help='APTLY API username', - default=os.environ.get('APTLY_USERNAME'), metavar='APTLY_USERNAME') -parser.add_argument('--password', help='APTLY API password', - default=os.environ.get('APTLY_PASSWORD'), metavar='APTLY_PASSWORD') -parser.add_argument('--result', metavar='path', - default='build/', help='Build result to upload') -parser.add_argument('--target', metavar='target', - help='Repository to install the package to (e.g. stack/dev/epel or stack/dev/ubuntu)') -parser.add_argument('--release', metavar='release', - help='Version of the repository to install to (e.g. 7 or icinga-xenial)') -parser.add_argument('--repo', metavar='repo', - help='Specific repository name in aptly') -parser.add_argument('--architectures', metavar='list', - default=os.environ.get('ICINGA_BUILD_DEB_DEFAULT_ARCH', 'amd64'), - help=('Specify list of architectures to publish the repo with,' - 'separated by comma (e.g. amd64,i386 or armhf)')) -parser.add_argument('--insecure', action='store_true', help='Disable SSL verification') -parser.add_argument('--noop', action='store_true', help='Only prepare upload') - -args = parser.parse_args() - -if not args.server and not args.noop: - raise StandardError, "Specifying an aptly server is required (--server or APTLY_SERVER)" - -if not os.path.exists(args.result): - raise StandardError, "Result path '%s' does not exist!" % (args.result) - -rpms = detect_rpm(args.result) -debs = detect_deb(args.result) -files = None -if rpms: - type = UPLOAD_TYPE_RPM - files = rpms -elif debs: - type = UPLOAD_TYPE_DEB - files = debs - -if not files: - raise StandardError, 'No packages found in %s' % (args.result) - -pair = ci_split_name() - -if not args.target: - if pair: - args.target = pair[0] - else: - raise StandardError, "Could not detect --target from %s, please specify!" % CI_JOB_NAME - -if not args.release: - if pair: - args.release = ci_release(type, pair[1]) - else: - raise StandardError, "Could not detect --release from %s, please specify!" % CI_JOB_NAME - -if not args.repo and type == UPLOAD_TYPE_DEB: - if pair: - args.repo = ci_repo(type, *pair) - else: - raise StandardError, "Could not detect --repo from %s, please specify!" % CI_JOB_NAME - -(checksum, checksums) = upload_checksum(files) -upload_prefix = re.sub('[/\-_]+', '_', args.target + '_' + args.release) -upload_name = '%s_%s' % (upload_prefix, checksum) - -# meta and upload file -upload_meta = { - 'target': args.target, - 'release': args.release, - 'type': type, - 'checksums': checksums, -} - -if args.repo and type == UPLOAD_TYPE_DEB: - upload_meta['repo'] = args.repo - -if args.architectures: - upload_meta['architectures'] = re.split(r'\s*,\s*', args.architectures) - - # always add i386 if amd64 is base arch - if 'amd64' in upload_meta['architectures'] and not 'i386' in upload_meta['architectures']: - upload_meta['architectures'].append('i386') - -print "Prepared upload to: %s" % (aptly_url('/files/' + upload_name)) -print "Metadata is:" + json.dumps(upload_meta, sort_keys=True, indent=4) -print - -if args.noop: - print "Running in noop mode, stopping here!" - sys.exit(0) - -# ensure target is absent -r = aptly_session().delete(aptly_url('/files/' + upload_name)) -if r.status_code == requests.codes.ok: - print "Deleted existing upload %s" % (upload_name) -elif r.status_code != requests.codes.not_found: - raise StandardError, 'Unexpected result code: %s' % (r.status_code) - -# uploading files -upload_url = aptly_url('/files/subscription/' + upload_name) -print "Uploading %d files to %s" % (len(files), upload_name) -for file in files: - file_data = [('file', (file, open(file, 'rb')))] - r = aptly_session().post(upload_url, files=file_data) - if r.status_code == requests.codes.ok: - print "Upload successful: %s" % (file) - else: - raise StandardError, "Upload failed for %s - http status: %s - message:\n%s" % (upload_name, r.status_code, r.text[:30]) - -file_data = [('file', ('upload.json', json.dumps(upload_meta)))] -r = aptly_session().post(upload_url, files=file_data) -if r.status_code == requests.codes.ok: - print 'Metadata upload successful.' -else: - raise StandardError, "Upload metadata failed for %s - http status: %s - message:\n%s" % (upload_name, r.status_code, r.text[:30]) -- GitLab