67 lines
2 KiB
Plaintext
67 lines
2 KiB
Plaintext
|
#!/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()
|