TUN-4771: Upload deb, rpm and msi packages to github

- cfsetup now has a build command `github-release-pkgs` to release linux
   and msi packages to github.
 - github_message.py now has an option to upload all assets in a provided
   directory.
This commit is contained in:
Sudarsan Reddy 2021-07-26 13:49:17 +01:00
parent dff694b218
commit bd8af7d80d
3 changed files with 95 additions and 32 deletions

View File

@ -239,6 +239,10 @@ release: bin/equinox
github-release: cloudflared github-release: cloudflared
python3 github_release.py --path $(EXECUTABLE_PATH) --release-version $(VERSION) python3 github_release.py --path $(EXECUTABLE_PATH) --release-version $(VERSION)
.PHONY: github-release-built-pkgs
github-release-built-pkgs:
python3 github_release.py --path $(PWD)/built_artifacts --release-version $(VERSION)
.PHONY: github-message .PHONY: github-message
github-message: github-message:
python3 github_message.py --release-version $(VERSION) python3 github_message.py --release-version $(VERSION)

View File

@ -27,10 +27,35 @@ stretch: &stretch
- libmsi-dev - libmsi-dev
- libgcab-dev - libgcab-dev
pre-cache: pre-cache:
# TODO: https://jira.cfops.it/browse/TUN-4792 Replace this wixl with the official one once msitools supports
# environment.
- wget https://github.com/sudarshan-reddy/msitools/releases/download/v0.101b/wixl -P /usr/local/bin - wget https://github.com/sudarshan-reddy/msitools/releases/download/v0.101b/wixl -P /usr/local/bin
- chmod a+x /usr/local/bin/wixl - chmod a+x /usr/local/bin/wixl
post-cache: post-cache:
- ./build-packages.sh - ./build-packages.sh
github-release-pkgs:
build_dir: *build_dir
builddeps:
- *pinned_go_fips
- build-essential
- fakeroot
- rubygem-fpm
- rpm
- wget
# libmsi and libgcab are libraries the wixl binary depends on.
- libmsi-dev
- libgcab-dev
- python3-setuptools
- python3-pip
pre-cache:
- wget https://github.com/sudarshan-reddy/msitools/releases/download/v0.101b/wixl -P /usr/local/bin
- chmod a+x /usr/local/bin/wixl
- pip3 install pygithub
post-cache:
# build all packages and move them to /cfsetup/built_artifacts
- ./build-packages.sh
# release the packages built and moved to /cfsetup/built_artifacts
- make github-release-built-pkgs
build-deb: build-deb:
build_dir: *build_dir build_dir: *build_dir
builddeps: &build_deb_deps builddeps: &build_deb_deps

View File

@ -10,6 +10,9 @@ import shutil
import hashlib import hashlib
import requests import requests
import tarfile import tarfile
from os import listdir
from os.path import isfile, join
import re
from github import Github, GithubException, UnknownObjectException from github import Github, GithubException, UnknownObjectException
@ -135,7 +138,7 @@ def parse_args():
logging.error("Missing asset path") logging.error("Missing asset path")
is_valid = False is_valid = False
if not args.name: if not args.name and not os.path.isdir(args.path):
logging.error("Missing asset name") logging.error("Missing asset name")
is_valid = False is_valid = False
@ -161,6 +164,57 @@ def parse_args():
parser.print_usage() parser.print_usage()
exit(1) exit(1)
def upload_asset(release, filepath, filename, release_version, kv_account_id, namespace_id, kv_api_token):
logging.info(f"Uploading asset: {filename}")
release.upload_asset(filepath, name=filename)
# check and extract if the file is a tar and gzipped file (as is the case with the macos builds)
binary_path = filepath
if binary_path.endswith("tgz"):
try:
shutil.rmtree('cfd')
except OSError:
pass
zipfile = tarfile.open(binary_path, "r:gz")
zipfile.extractall('cfd') # specify which folder to extract to
zipfile.close()
binary_path = os.path.join(os.getcwd(), 'cfd', 'cloudflared')
# send the sha256 (the checksum) to workers kv
pkg_hash = get_sha256(binary_path)
send_hash(pkg_hash, filename, release_version, kv_account_id, namespace_id, kv_api_token)
# create the artifacts directory if it doesn't exist
artifact_path = os.path.join(os.getcwd(), 'artifacts')
if not os.path.isdir(artifact_path):
os.mkdir(artifact_path)
# copy the binary to the path
copy_path = os.path.join(artifact_path, filename)
try:
shutil.copy(filepath, copy_path)
except shutil.SameFileError:
pass # the macOS release copy fails with being the same file (already in the artifacts directory)
def compile_regex() :
# The capture groups are:
# 1: the text cloudflared
# 2: compiled architecture
# 3: possible extensions
capture_string = r'(cloudflared).+(amd64|x86_64|386|arm)(\.msi|\.deb|\.rpm|\.exe)?'
return re.compile(capture_string)
def extract_filename(regex, filename):
match_groups = regex.match(filename)
os = "linux"
name = match_groups.group(1)
arch = match_groups.group(2)
ext = match_groups.group(3)
if ext in ['.msi', '.exe']:
os = "windows"
return "{}-{}-{}{}".format(name, os, arch, ext if ext is not None else "")
def main(): def main():
""" Attempts to upload Asset to Github Release. Creates Release if it doesnt exist """ """ Attempts to upload Asset to Github Release. Creates Release if it doesnt exist """
@ -174,40 +228,20 @@ def main():
logging.info("Skipping asset upload because of dry-run") logging.info("Skipping asset upload because of dry-run")
return return
release.upload_asset(args.path, name=args.name) if os.path.isdir(args.path):
regexp = compile_regex()
# check and extract if the file is a tar and gzipped file (as is the case with the macos builds) onlyfiles = [f for f in listdir(args.path) if isfile(join(args.path, f))]
binary_path = args.path for filename in onlyfiles:
if binary_path.endswith("tgz"): binary_path = os.path.join(args.path, filename)
try: filename = extract_filename(regexp, filename)
shutil.rmtree('cfd') upload_asset(release, binary_path, filename, args.release_version, args.kv_account_id, args.namespace_id,
except OSError as e: args.kv_api_token)
pass else:
zipfile = tarfile.open(binary_path, "r:gz") upload_asset(release, args.path, args.name, args.release_version, args.kv_account_id, args.namespace_id,
zipfile.extractall('cfd') # specify which folder to extract to args.kv_api_token)
zipfile.close()
binary_path = os.path.join(os.getcwd(), 'cfd', 'cloudflared')
# send the sha256 (the checksum) to workers kv
pkg_hash = get_sha256(binary_path)
send_hash(pkg_hash, args.name, args.release_version, args.kv_account_id, args.namespace_id, args.kv_api_token)
# create the artifacts directory if it doesn't exist
artifact_path = os.path.join(os.getcwd(), 'artifacts')
if not os.path.isdir(artifact_path):
os.mkdir(artifact_path)
# copy the binary to the path
copy_path = os.path.join(artifact_path, args.name)
try:
shutil.copy(args.path, copy_path)
except shutil.SameFileError:
pass # the macOS release copy fails with being the same file (already in the artifacts directory). Catching to ignore.
except Exception as e: except Exception as e:
logging.exception(e) logging.exception(e)
exit(1) exit(1)
main() main()