upload_release_asset.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python3
  2. from github import Github, GithubException
  3. import argparse
  4. import os
  5. GH_TOKEN_ENV_VAR_NAME = "GH_TOKEN"
  6. GH_REPO_SLUG = os.environ["CI_REPO_SLUG"]
  7. class UploadReleaseAssetError(Exception):
  8. pass
  9. def upload_asset_to_github_release(
  10. asset_path: str, release_tag: str, github_token: str, asset_name: str = None
  11. ):
  12. """
  13. Upload an asset to a release
  14. :param asset_path: the file path
  15. :param release_tag: the release tag as identified on Github
  16. :param github_token: a token to allow editing the release
  17. :param asset_name: an optional name to give to the asset
  18. """
  19. repo = Github(github_token).get_repo(GH_REPO_SLUG)
  20. try:
  21. print("Getting release on {}".format(GH_REPO_SLUG))
  22. gh_release = repo.get_release(id=release_tag)
  23. print(gh_release, gh_release.tag_name, gh_release.upload_url)
  24. except GithubException as e:
  25. raise UploadReleaseAssetError("Release {} not found".format(release_tag))
  26. try:
  27. assert os.path.exists(asset_path)
  28. if asset_name:
  29. print("Uploading asset: {} as {}".format(asset_path, asset_name))
  30. gh_release.upload_asset(path=asset_path, label=asset_name, name=asset_name)
  31. else:
  32. print("Uploading asset: {}".format(asset_path))
  33. gh_release.upload_asset(asset_path)
  34. print("OK")
  35. except GithubException as e:
  36. print(e)
  37. raise UploadReleaseAssetError(
  38. "Could not upload asset for release {}.".format(release_tag)
  39. )
  40. def main():
  41. parser = argparse.ArgumentParser()
  42. parser.add_argument("release_asset", help="The file to be uploaded")
  43. parser.add_argument("release_tag", help="The version tag")
  44. parser.add_argument(
  45. "--github-token",
  46. default=os.environ.get(GH_TOKEN_ENV_VAR_NAME),
  47. help="The Github API token. If not specified, it will"
  48. " be taken from ${}.".format(GH_TOKEN_ENV_VAR_NAME),
  49. )
  50. parser.add_argument(
  51. "--asset-name", default=None, help="An optional name for the release asset"
  52. )
  53. args = parser.parse_args()
  54. upload_asset_to_github_release(
  55. args.release_asset, args.release_tag, args.github_token, args.asset_name
  56. )
  57. return 0
  58. if __name__ == "__main__":
  59. exit(main())