#!/usr/bin/env python3 ''' Run [[file:scripts/release][scripts/release]] to deploy Python package onto [[https://pypi.org][PyPi]] and [[https://test.pypi.org][test PyPi]]. The script expects =TWINE_PASSWORD= environment variable to contain the [[https://pypi.org/help/#apitoken][PyPi token]] (not the password!). The script can be run manually. It's also running as =pypi= job in [[file:.github/workflows/main.yml][Github Actions config]]. Packages are deployed on: - every master commit, onto test pypi - every new tag, onto production pypi You'll need to set =TWINE_PASSWORD= and =TWINE_PASSWORD_TEST= in [[https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets][secrets]] for Github Actions deployment to work. ''' import os import sys from pathlib import Path from subprocess import check_call import shutil is_ci = os.environ.get('CI') is not None def main(): import argparse p = argparse.ArgumentParser() p.add_argument('--test', action='store_true', help='use test pypi') args = p.parse_args() extra = [] if args.test: extra.extend(['--repository-url', 'https://test.pypi.org/legacy/']) root = Path(__file__).absolute().parent.parent os.chdir(root) # just in case if is_ci: # see https://github.com/actions/checkout/issues/217 check_call('git fetch --prune --unshallow'.split()) dist = root / 'dist' if dist.exists(): shutil.rmtree(dist) check_call('python3 setup.py sdist bdist_wheel', shell=True) TP = 'TWINE_PASSWORD' password = os.environ.get(TP) if password is None: print(f"WARNING: no {TP} passed", file=sys.stderr) import pip_secrets password = pip_secrets.token_test if args.test else pip_secrets.token # meh check_call([ 'python3', '-m', 'twine', 'upload', *dist.iterdir(), *extra, ], env={ 'TWINE_USERNAME': '__token__', TP: password, **os.environ, }) if __name__ == '__main__': main()