releaser: refactor

This commit is contained in:
umarcor
2021-12-20 06:09:32 +01:00
parent ee02a39a5e
commit e832625624

View File

@@ -30,17 +30,28 @@ from github import Github, GithubException
from subprocess import check_call from subprocess import check_call
def GetListOfArtifacts(argv): paramTag = getenv("INPUT_TAG", "tip")
paramFiles = getenv("INPUT_FILES", None).split()
paramRM = getenv("INPUT_RM", "false") == "true"
paramSnapshots = getenv("INPUT_SNAPSHOTS", "true").lower() == 'true'
paramUseGitHubCLI = getenv("INPUT_USE-GH-CLI", "false").lower() == 'true'
paramToken = (
environ["GITHUB_TOKEN"]
if "GITHUB_TOKEN" in environ else
environ["INPUT_TOKEN"]
if "INPUT_TOKEN" in environ else
None
)
paramRepo = getenv("GITHUB_REPOSITORY", None)
paramRef = getenv("GITHUB_REF", None)
paramSHA = getenv("GITHUB_SHA", None)
def GetListOfArtifacts(argv, files):
print("· Get list of artifacts to be uploaded") print("· Get list of artifacts to be uploaded")
args = files if files is not None else []
args = []
if "INPUT_FILES" in environ:
args = environ["INPUT_FILES"].split()
if len(argv) > 1: if len(argv) > 1:
args = args + argv[1:] args += argv[1:]
if len(args) == 1 and args[0].lower() == "none": if len(args) == 1 and args[0].lower() == "none":
print("! Skipping 'files' because it's set to 'none") print("! Skipping 'files' because it's set to 'none")
return [] return []
@@ -48,7 +59,7 @@ def GetListOfArtifacts(argv):
stdout.flush() stdout.flush()
raise (Exception("Glob patterns need to be provided as positional arguments or through envvar 'INPUT_FILES'!")) raise (Exception("Glob patterns need to be provided as positional arguments or through envvar 'INPUT_FILES'!"))
else: else:
files = [] flist = []
for item in args: for item in args:
print(f" glob({item!s}):") print(f" glob({item!s}):")
for fname in [fname for fname in glob(item, recursive=True) if not Path(fname).is_dir()]: for fname in [fname for fname in glob(item, recursive=True) if not Path(fname).is_dir()]:
@@ -56,33 +67,26 @@ def GetListOfArtifacts(argv):
print(f" - ! Skipping empty file {fname!s}") print(f" - ! Skipping empty file {fname!s}")
continue continue
print(f" - {fname!s}") print(f" - {fname!s}")
files.append(fname) flist.append(fname)
if len(files) < 1: if len(flist) < 1:
stdout.flush() stdout.flush()
raise (Exception("Empty list of files to upload/update!")) raise (Exception("Empty list of files to upload/update!"))
return files return flist
def GetGitHubAPIHandler(): def GetGitHubAPIHandler(token):
print("· Get GitHub API handler (authenticate)") print("· Get GitHub API handler (authenticate)")
if token is not None:
if "GITHUB_TOKEN" in environ: return Github(token)
return Github(environ["GITHUB_TOKEN"]) raise (
elif "INPUT_TOKEN" in environ: Exception(
return Github(environ["INPUT_TOKEN"]) "Need credentials to authenticate! Please, provide 'GITHUB_TOKEN' or 'INPUT_TOKEN'"
else: )
if "GITHUB_USER" not in environ or "GITHUB_PASS" not in environ: )
stdout.flush()
raise (
Exception(
"Need credentials to authenticate! Please, provide 'GITHUB_TOKEN', 'INPUT_TOKEN', or 'GITHUB_USER' and 'GITHUB_PASS'"
)
)
return Github(environ["GITHUB_USER"], environ["GITHUB_PASS"])
def GetReleaseHandler(gh): def GetReleaseHandler(gh, repo, ref, tag, sha, snapshots):
def CheckRefSemVer(gh_ref, tag): def CheckRefSemVer(gh_ref, tag, snapshots):
print("· Check SemVer compliance of the reference/tag") print("· Check SemVer compliance of the reference/tag")
env_tag = None env_tag = None
if gh_ref[0:10] == "refs/tags/": if gh_ref[0:10] == "refs/tags/":
@@ -101,7 +105,7 @@ def GetReleaseHandler(gh):
if semver.group("prerelease") is None: if semver.group("prerelease") is None:
# is a regular semver compilant tag # is a regular semver compilant tag
return (tag, env_tag, False) return (tag, env_tag, False)
elif getenv("INPUT_SNAPSHOTS", "true") == "true": elif snapshots:
# is semver compilant prerelease tag, thus a snapshot (we skip it) # is semver compilant prerelease tag, thus a snapshot (we skip it)
print("! Skipping snapshot prerelease") print("! Skipping snapshot prerelease")
sys_exit() sys_exit()
@@ -115,7 +119,7 @@ def GetReleaseHandler(gh):
raise (Exception("Repository name not defined! Please set 'GITHUB_REPOSITORY")) raise (Exception("Repository name not defined! Please set 'GITHUB_REPOSITORY"))
return gh.get_repo(repo) return gh.get_repo(repo)
def GetOrCreateRelease(gh_repo, tag): def GetOrCreateRelease(gh_repo, tag, sha, is_prerelease):
print("· Get Release handler") print("· Get Release handler")
gh_tag = None gh_tag = None
try: try:
@@ -130,26 +134,26 @@ def GetReleaseHandler(gh):
return (gh_repo.create_git_release(tag, tag, "", draft=True, prerelease=is_prerelease), True) return (gh_repo.create_git_release(tag, tag, "", draft=True, prerelease=is_prerelease), True)
else: else:
err_msg = f"Tag/release '{tag!s}' does not exist and could not create it!" err_msg = f"Tag/release '{tag!s}' does not exist and could not create it!"
if "GITHUB_SHA" not in environ: if sha is None:
raise (Exception(err_msg)) raise (Exception(err_msg))
try: try:
return ( return (
gh_repo.create_git_tag_and_release( gh_repo.create_git_tag_and_release(
tag, "", tag, "", environ["GITHUB_SHA"], "commit", draft=True, prerelease=is_prerelease tag, "", tag, "", sha, "commit", draft=True, prerelease=is_prerelease
), ),
True, True,
) )
except Exception: except Exception:
raise (Exception(err_msg)) raise (Exception(err_msg))
[tag, env_tag, is_prerelease] = CheckRefSemVer(environ["GITHUB_REF"], getenv("INPUT_TAG", "tip")) [tag, env_tag, is_prerelease] = CheckRefSemVer(ref, tag, snapshots)
gh_repo = GetRepositoryHandler(getenv("GITHUB_REPOSITORY", None)) gh_repo = GetRepositoryHandler(repo)
[gh_release, is_draft] = GetOrCreateRelease(gh_repo, tag) [gh_release, is_draft] = GetOrCreateRelease(gh_repo, tag, sha, is_prerelease)
return (gh_repo, gh_release, tag, env_tag, is_prerelease, is_draft) return (gh_repo, gh_release, tag, env_tag, is_prerelease, is_draft)
def UploadArtifacts(gh_release, artifacts): def UploadArtifacts(gh_release, artifacts, remove, token, UseGitHubCLI):
print("· Cleanup and/or upload artifacts") print("· Cleanup and/or upload artifacts")
assets = gh_release.get_assets() assets = gh_release.get_assets()
@@ -196,9 +200,7 @@ def UploadArtifacts(gh_release, artifacts):
return return
print(" - keep") print(" - keep")
UseGitHubCLI = getenv("INPUT_USE-GH-CLI", "false").lower() == 'true' if remove:
if getenv("INPUT_RM", "false") == "true":
delete_all_assets(assets) delete_all_assets(assets)
else: else:
if not UseGitHubCLI: if not UseGitHubCLI:
@@ -207,7 +209,7 @@ def UploadArtifacts(gh_release, artifacts):
if UseGitHubCLI: if UseGitHubCLI:
env = environ.copy() env = environ.copy()
env["GITHUB_TOKEN"] = environ["INPUT_TOKEN"] env["GITHUB_TOKEN"] = token
cmd = ["gh", "release", "upload", "--clobber", tag] + artifacts cmd = ["gh", "release", "upload", "--clobber", tag] + artifacts
print(f" > {' '.join(cmd)}") print(f" > {' '.join(cmd)}")
check_call(cmd, env=env) check_call(cmd, env=env)
@@ -237,15 +239,28 @@ def UpdateReference(gh_release, tag, sha, is_prerelease, is_draft):
gh_repo.get_git_ref(f"tags/{tag!s}").edit(sha) gh_repo.get_git_ref(f"tags/{tag!s}").edit(sha)
files = GetListOfArtifacts(sys_argv) files = GetListOfArtifacts(sys_argv, paramFiles)
[gh_repo, gh_release, tag, env_tag, is_prerelease, is_draft] = GetReleaseHandler(GetGitHubAPIHandler()) [gh_repo, gh_release, tag, env_tag, is_prerelease, is_draft] = GetReleaseHandler(
GetGitHubAPIHandler(paramToken),
paramRepo,
paramRef,
paramTag,
paramSHA,
paramSnapshots
)
stdout.flush() stdout.flush()
UploadArtifacts(gh_release, files) UploadArtifacts(
gh_release,
files,
paramRM,
paramToken,
paramUseGitHubCLI
)
stdout.flush() stdout.flush()
UpdateReference( UpdateReference(
gh_release, gh_release,
tag, tag,
getenv("GITHUB_SHA", None) if env_tag is None else None, paramSHA if env_tag is None else None,
is_prerelease, is_prerelease,
is_draft is_draft
) )