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:
		
							parent
							
								
									dff694b218
								
							
						
					
					
						commit
						bd8af7d80d
					
				
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							|  | @ -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) | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								cfsetup.yaml
								
								
								
								
							
							
						
						
									
										25
									
								
								cfsetup.yaml
								
								
								
								
							|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue