AUTH-2685: Adds script to create release
This commit is contained in:
		
							parent
							
								
									e3a9aa4296
								
							
						
					
					
						commit
						b46acd7f63
					
				
							
								
								
									
										10
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										10
									
								
								Makefile
								
								
								
								
							|  | @ -40,6 +40,12 @@ else | ||||||
|     $(error This system's OS $(LOCAL_OS) isn't supported) |     $(error This system's OS $(LOCAL_OS) isn't supported) | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | ifeq ($(TARGET_OS), windows) | ||||||
|  | 	EXECUTABLE_PATH=./cloudflared.exe | ||||||
|  | else | ||||||
|  | 	EXECUTABLE_PATH=./cloudflared | ||||||
|  | endif | ||||||
|  | 
 | ||||||
| .PHONY: all | .PHONY: all | ||||||
| all: cloudflared test | all: cloudflared test | ||||||
| 
 | 
 | ||||||
|  | @ -88,6 +94,10 @@ homebrew-release: homebrew-upload | ||||||
| release: bin/equinox | release: bin/equinox | ||||||
| 	bin/equinox release $(EQUINOX_FLAGS) -- $(VERSION_FLAGS) $(IMPORT_PATH)/cmd/cloudflared | 	bin/equinox release $(EQUINOX_FLAGS) -- $(VERSION_FLAGS) $(IMPORT_PATH)/cmd/cloudflared | ||||||
| 
 | 
 | ||||||
|  | .PHONY: github-release | ||||||
|  | github-release: cloudflared | ||||||
|  | 	python3 github_release.py --path $(EXECUTABLE_PATH) --release-version $(VERSION) | ||||||
|  | 
 | ||||||
| bin/equinox: | bin/equinox: | ||||||
| 	mkdir -p bin | 	mkdir -p bin | ||||||
| 	curl -s https://bin.equinox.io/c/75JtLRTsJ3n/release-tool-beta-$(EQUINOX_PLATFORM).tgz | tar xz -C bin/ | 	curl -s https://bin.equinox.io/c/75JtLRTsJ3n/release-tool-beta-$(EQUINOX_PLATFORM).tgz | tar xz -C bin/ | ||||||
|  |  | ||||||
							
								
								
									
										64
									
								
								cfsetup.yaml
								
								
								
								
							
							
						
						
									
										64
									
								
								cfsetup.yaml
								
								
								
								
							|  | @ -31,6 +31,18 @@ stretch: &stretch | ||||||
|       - export GOOS=linux |       - export GOOS=linux | ||||||
|       - export GOARCH=amd64 |       - export GOARCH=amd64 | ||||||
|       - make release |       - make release | ||||||
|  |   github-release-linux-amd64: | ||||||
|  |     build_dir: *build_dir | ||||||
|  |     builddeps: | ||||||
|  |       - *pinned_go | ||||||
|  |       - build-essential | ||||||
|  |       - python3-setuptools | ||||||
|  |       - python3-pip | ||||||
|  |     post-cache: | ||||||
|  |       - pip3 install pygithub | ||||||
|  |       - export GOOS=linux | ||||||
|  |       - export GOARCH=amd64 | ||||||
|  |       - make github-release | ||||||
|   release-linux-armv6: |   release-linux-armv6: | ||||||
|     build_dir: *build_dir |     build_dir: *build_dir | ||||||
|     builddeps: |     builddeps: | ||||||
|  | @ -42,6 +54,20 @@ stretch: &stretch | ||||||
|       - export GOARCH=arm |       - export GOARCH=arm | ||||||
|       - export CC=arm-linux-gnueabihf-gcc |       - export CC=arm-linux-gnueabihf-gcc | ||||||
|       - make release |       - make release | ||||||
|  |   github-release-linux-armv6: | ||||||
|  |     build_dir: *build_dir | ||||||
|  |     builddeps: | ||||||
|  |       - *pinned_go | ||||||
|  |       - crossbuild-essential-armhf | ||||||
|  |       - gcc-arm-linux-gnueabihf | ||||||
|  |       - python3-setuptools | ||||||
|  |       - python3-pip | ||||||
|  |     post-cache: | ||||||
|  |       - pip3 install pygithub | ||||||
|  |       - export GOOS=linux | ||||||
|  |       - export GOARCH=arm | ||||||
|  |       - export CC=arm-linux-gnueabihf-gcc | ||||||
|  |       - make github-release | ||||||
|   release-linux-386: |   release-linux-386: | ||||||
|     build_dir: *build_dir |     build_dir: *build_dir | ||||||
|     builddeps: |     builddeps: | ||||||
|  | @ -51,6 +77,18 @@ stretch: &stretch | ||||||
|       - export GOOS=linux |       - export GOOS=linux | ||||||
|       - export GOARCH=386 |       - export GOARCH=386 | ||||||
|       - make release |       - make release | ||||||
|  |   github-release-linux-386: | ||||||
|  |     build_dir: *build_dir | ||||||
|  |     builddeps: | ||||||
|  |       - *pinned_go | ||||||
|  |       - gcc-multilib | ||||||
|  |       - python3-setuptools | ||||||
|  |       - python3-pip | ||||||
|  |     post-cache: | ||||||
|  |       - pip3 install pygithub | ||||||
|  |       - export GOOS=linux | ||||||
|  |       - export GOARCH=386 | ||||||
|  |       - make github-release | ||||||
|   release-windows-amd64: |   release-windows-amd64: | ||||||
|     build_dir: *build_dir |     build_dir: *build_dir | ||||||
|     builddeps: |     builddeps: | ||||||
|  | @ -61,6 +99,19 @@ stretch: &stretch | ||||||
|       - export GOARCH=amd64 |       - export GOARCH=amd64 | ||||||
|       - export CC=x86_64-w64-mingw32-gcc |       - export CC=x86_64-w64-mingw32-gcc | ||||||
|       - make release |       - make release | ||||||
|  |   github-release-windows-amd64: | ||||||
|  |     build_dir: *build_dir | ||||||
|  |     builddeps: | ||||||
|  |       - *pinned_go | ||||||
|  |       - gcc-mingw-w64 | ||||||
|  |       - python3-setuptools | ||||||
|  |       - python3-pip | ||||||
|  |     post-cache: | ||||||
|  |       - pip3 install pygithub | ||||||
|  |       - export GOOS=windows | ||||||
|  |       - export GOARCH=amd64 | ||||||
|  |       - export CC=x86_64-w64-mingw32-gcc | ||||||
|  |       - make github-release | ||||||
|   release-windows-386: |   release-windows-386: | ||||||
|     build_dir: *build_dir |     build_dir: *build_dir | ||||||
|     builddeps: |     builddeps: | ||||||
|  | @ -71,6 +122,19 @@ stretch: &stretch | ||||||
|       - export GOARCH=386 |       - export GOARCH=386 | ||||||
|       - export CC=i686-w64-mingw32-gcc-win32 |       - export CC=i686-w64-mingw32-gcc-win32 | ||||||
|       - make release |       - make release | ||||||
|  |   github-release-windows-386: | ||||||
|  |     build_dir: *build_dir | ||||||
|  |     builddeps: | ||||||
|  |       - *pinned_go | ||||||
|  |       - gcc-mingw-w64 | ||||||
|  |       - python3-setuptools | ||||||
|  |       - python3-pip | ||||||
|  |     post-cache: | ||||||
|  |       - pip3 install pygithub | ||||||
|  |       - export GOOS=windows | ||||||
|  |       - export GOARCH=386 | ||||||
|  |       - export CC=i686-w64-mingw32-gcc-win32 | ||||||
|  |       - make github-release | ||||||
|   test: |   test: | ||||||
|     build_dir: *build_dir |     build_dir: *build_dir | ||||||
|     builddeps: |     builddeps: | ||||||
|  |  | ||||||
|  | @ -0,0 +1,128 @@ | ||||||
|  | #!/usr/bin/python3 | ||||||
|  | """ | ||||||
|  | Creates Github Releases and uploads assets | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import argparse | ||||||
|  | import logging | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from github import Github, GithubException, UnknownObjectException | ||||||
|  | 
 | ||||||
|  | FORMAT = "%(levelname)s - %(asctime)s: %(message)s" | ||||||
|  | logging.basicConfig(format=FORMAT) | ||||||
|  | 
 | ||||||
|  | CLOUDFLARED_REPO = os.environ.get("GITHUB_REPO", "cloudflare/cloudflared") | ||||||
|  | GITHUB_CONFLICT_CODE = "already_exists" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def assert_tag_exists(repo, version): | ||||||
|  |     """ Raise exception if repo does not contain a tag matching version """ | ||||||
|  |     tags = repo.get_tags() | ||||||
|  |     if not tags or tags[0].name != version: | ||||||
|  |         raise Exception("Tag {} not found".format(version)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_or_create_release(repo, version, dry_run=False): | ||||||
|  |     """ | ||||||
|  |     Get a Github Release matching the version tag or create a new one. | ||||||
|  |     If a conflict occurs on creation, attempt to fetch the Release on last time | ||||||
|  |     """ | ||||||
|  |     try: | ||||||
|  |         release = repo.get_release(version) | ||||||
|  |         logging.info("Release %s found", version) | ||||||
|  |         return release | ||||||
|  |     except UnknownObjectException: | ||||||
|  |         logging.info("Release %s not found", version) | ||||||
|  | 
 | ||||||
|  |     # We dont want to create a new release tag if one doesnt already exist | ||||||
|  |     assert_tag_exists(repo, version) | ||||||
|  | 
 | ||||||
|  |     if dry_run: | ||||||
|  |         logging.info("Skipping Release creation because of dry-run") | ||||||
|  |         return | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         logging.info("Creating release %s", version) | ||||||
|  |         return repo.create_git_release(version, version, "") | ||||||
|  |     except GithubException as e: | ||||||
|  |         errors = e.data.get("errors", []) | ||||||
|  |         if e.status == 422 and any( | ||||||
|  |             [err.get("code") == GITHUB_CONFLICT_CODE for err in errors] | ||||||
|  |         ): | ||||||
|  |             logging.warning( | ||||||
|  |                 "Conflict: Release was likely just made by a different build: %s", | ||||||
|  |                 e.data, | ||||||
|  |             ) | ||||||
|  |             return repo.get_release(version) | ||||||
|  |         raise e | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parse_args(): | ||||||
|  |     """ Parse and validate args """ | ||||||
|  |     parser = argparse.ArgumentParser( | ||||||
|  |         description="Creates Github Releases and uploads assets." | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "--api-key", default=os.environ.get("API_KEY"), help="Github API key" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "--release-version", | ||||||
|  |         metavar="version", | ||||||
|  |         default=os.environ.get("VERSION"), | ||||||
|  |         help="Release version", | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "--path", default=os.environ.get("ASSET_PATH"), help="Asset path" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "--name", default=os.environ.get("ASSET_NAME"), help="Asset Name" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "--dry-run", action="store_true", help="Do not create release or upload asset" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     args = parser.parse_args() | ||||||
|  |     is_valid = True | ||||||
|  |     if not args.release_version: | ||||||
|  |         logging.error("Missing release version") | ||||||
|  |         is_valid = False | ||||||
|  | 
 | ||||||
|  |     if not args.path: | ||||||
|  |         logging.error("Missing asset path") | ||||||
|  |         is_valid = False | ||||||
|  | 
 | ||||||
|  |     if not args.name: | ||||||
|  |         logging.error("Missing asset name") | ||||||
|  |         is_valid = False | ||||||
|  | 
 | ||||||
|  |     if not args.api_key: | ||||||
|  |         logging.error("Missing API key") | ||||||
|  |         is_valid = False | ||||||
|  | 
 | ||||||
|  |     if is_valid: | ||||||
|  |         return args | ||||||
|  | 
 | ||||||
|  |     parser.print_usage() | ||||||
|  |     exit(1) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     """ Attempts to upload Asset to Github Release. Creates Release if it doesnt exist """ | ||||||
|  |     try: | ||||||
|  |         args = parse_args() | ||||||
|  |         client = Github(args.api_key) | ||||||
|  |         repo = client.get_repo(CLOUDFLARED_REPO) | ||||||
|  |         release = get_or_create_release(repo, args.release_version, args.dry_run) | ||||||
|  | 
 | ||||||
|  |         if args.dry_run: | ||||||
|  |             logging.info("Skipping asset upload because of dry-run") | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         release.upload_asset(args.path, name=args.name) | ||||||
|  |     except Exception as e: | ||||||
|  |         logging.exception(e) | ||||||
|  |         exit(1) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | main() | ||||||
		Loading…
	
		Reference in New Issue