Skip to content

Commit

Permalink
Merge pull request #3199 from nicoddemus/publish-tag-3060
Browse files Browse the repository at this point in the history
Implement deploying to PyPI by pushing a tag
  • Loading branch information
nicoddemus committed Feb 20, 2018
2 parents b486e12 + bfe2cbe commit 053fc11
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 96 deletions.
20 changes: 17 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ sudo: false
language: python
python:
- '3.6'
# command to install dependencies
install:
- pip install --upgrade --pre tox
# # command to run tests
env:
matrix:
# coveralls is not listed in tox's envlist, but should run in travis
Expand All @@ -29,7 +27,7 @@ env:
- TOXENV=doctesting
- TOXENV=docs

matrix:
jobs:
include:
- env: TOXENV=pypy
python: 'pypy-5.4'
Expand All @@ -40,6 +38,22 @@ matrix:
- env: TOXENV=py37
python: 'nightly'

- stage: deploy
python: '3.6'
env:
install: pip install -U setuptools setuptools_scm
script: skip
deploy:
provider: pypi
user: nicoddemus
distributions: sdist bdist_wheel
skip_upload_docs: true
password:
secure: xanTgTUu6XDQVqB/0bwJQXoDMnU5tkwZc5koz6mBkkqZhKdNOi2CLoC1XhiSZ+ah24l4V1E0GAqY5kBBcy9d7NVe4WNg4tD095LsHw+CRU6/HCVIFfyk2IZ+FPAlguesCcUiJSXOrlBF+Wj68wEvLoK7EoRFbJeiZ/f91Ww1sbtDlqXABWGHrmhPJL5Wva7o7+wG7JwJowqdZg1pbQExsCc7b53w4v2RBu3D6TJaTAzHiVsW+nUSI67vKI/uf+cR/OixsTfy37wlHgSwihYmrYLFls3V0bSpahCim3bCgMaFZx8S8xrdgJ++PzBCof2HeflFKvW+VCkoYzGEG4NrTWJoNz6ni4red9GdvfjGH3YCjAKS56h9x58zp2E5rpsb/kVq5/45xzV+dq6JRuhQ1nJWjBC6fSKAc/bfwnuFK3EBxNLkvBssLHvsNjj5XG++cB8DdS9wVGUqjpoK4puaXUWFqy4q3S9F86HEsKNgExtieA9qNx+pCIZVs6JCXZNjr0I5eVNzqJIyggNgJG6RyravsU35t9Zd9doL5g4Y7UKmAGTn1Sz24HQ4sMQgXdm2SyD8gEK5je4tlhUvfGtDvMSlstq71kIn9nRpFnqB6MFlbYSEAZmo8dGbCquoUc++6Rum208wcVbrzzVtGlXB/Ow9AbFMYeAGA0+N/K1e59c=
on:
tags: true
repo: pytest-dev/pytest

script: tox --recreate

notifications:
Expand Down
40 changes: 12 additions & 28 deletions HOWTORELEASE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,44 +22,28 @@ taking a lot of time to make a new one.

Ensure your are in a clean work tree.

#. Generate docs, changelog, announcements and upload a package to
your ``devpi`` staging server::
#. Generate docs, changelog, announcements and a **local** tag::

invoke generate.pre-release <VERSION> <DEVPI USER> --password <DEVPI PASSWORD>

If ``--password`` is not given, it is assumed the user is already logged in ``devpi``.
If you don't have an account, please ask for one.
invoke generate.pre-release <VERSION>

#. Open a PR for this branch targeting ``master``.

#. Test the package

* **Manual method**

Run from multiple machines::
#. After all tests pass and the PR has been approved, publish to PyPI by pushing the tag::

devpi use https://devpi.net/USER/dev
devpi test pytest==VERSION
git push [email protected]:pytest-dev/pytest.git <VERSION>

Check that tests pass for relevant combinations with::
Wait for the deploy to complete, then make sure it is `available on PyPI <https://pypi.org/project/pytest>`_.

devpi list pytest
#. Send an email announcement with the contents from::

* **CI servers**
doc/en/announce/release-<VERSION>.rst

Configure a repository as per-instructions on
devpi-cloud-test_ to test the package on Travis_ and AppVeyor_.
All test environments should pass.
To the following mailing lists:

#. Publish to PyPI::
* [email protected] (all releases)
* [email protected] (all releases)
* [email protected] (only major/minor releases)

invoke generate.publish-release <VERSION> <DEVPI USER> <PYPI_NAME>

where PYPI_NAME is the name of pypi.python.org as configured in your ``~/.pypirc``
file `for devpi <http:https://doc.devpi.net/latest/quickstart-releaseprocess.html?highlight=pypirc#devpi-push-releasing-to-an-external-index>`_.
And announce it on `Twitter <https://twitter.com/>`_ with the ``#pytest`` hashtag.

#. After a minor/major release, merge ``release-X.Y.Z`` into ``master`` and push (or open a PR).

.. _devpi-cloud-test: https://github.com/obestwalter/devpi-cloud-test
.. _AppVeyor: https://www.appveyor.com/
.. _Travis: https://travis-ci.org
1 change: 1 addition & 0 deletions changelog/3060.trivial.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pytest has changed the publication procedure and is now being published to PyPI directly from Travis.
70 changes: 7 additions & 63 deletions tasks/generate.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import os
"""
Invoke development tasks.
"""
from pathlib import Path
from subprocess import check_output, check_call

Expand Down Expand Up @@ -57,7 +59,7 @@ def regen(ctx):

@invoke.task()
def make_tag(ctx, version):
"""Create a new (local) tag for the release, only if the repository is clean."""
"""Create a new, local tag for the release, only if the repository is clean."""
from git import Repo

repo = Repo('.')
Expand All @@ -74,81 +76,24 @@ def make_tag(ctx, version):
repo.create_tag(version)


@invoke.task()
def devpi_upload(ctx, version, user, password=None):
"""Creates and uploads a package to devpi for testing."""
if password:
print("[generate.devpi_upload] devpi login {}".format(user))
check_call(['devpi', 'login', user, '--password', password])

check_call(['devpi', 'use', 'https://devpi.net/{}/dev'.format(user)])

env = os.environ.copy()
env['SETUPTOOLS_SCM_PRETEND_VERSION'] = version
check_call(['devpi', 'upload', '--formats', 'sdist,bdist_wheel'], env=env)
print("[generate.devpi_upload] package uploaded")


@invoke.task(help={
'version': 'version being released',
'user': 'name of the user on devpi to stage the generated package',
'password': 'user password on devpi to stage the generated package '
'(if not given assumed logged in)',
})
def pre_release(ctx, version, user, password=None):
"""Generates new docs, release announcements and uploads a new release to devpi for testing."""
def pre_release(ctx, version):
"""Generates new docs, release announcements and creates a local tag."""
announce(ctx, version)
regen(ctx)
changelog(ctx, version, write_out=True)

msg = 'Preparing release version {}'.format(version)
check_call(['git', 'commit', '-a', '-m', msg])

make_tag(ctx, version)

devpi_upload(ctx, version=version, user=user, password=password)

print()
print('[generate.pre_release] Please push your branch and open a PR.')


@invoke.task(help={
'version': 'version being released',
'user': 'name of the user on devpi to stage the generated package',
'pypi_name': 'name of the pypi configuration section in your ~/.pypirc',
})
def publish_release(ctx, version, user, pypi_name):
"""Publishes a package previously created by the 'pre_release' command."""
from git import Repo
repo = Repo('.')
tag_names = [x.name for x in repo.tags]
if version not in tag_names:
print('Could not find tag for version {}, exiting...'.format(version))
raise invoke.Exit(code=2)

check_call(['devpi', 'use', 'https://devpi.net/{}/dev'.format(user)])
check_call(['devpi', 'push', 'pytest=={}'.format(version), 'pypi:{}'.format(pypi_name)])
check_call(['git', 'push', '[email protected]:pytest-dev/pytest.git', version])

emails = [
'[email protected]',
'[email protected]'
]
if version.endswith('.0'):
emails.append('[email protected]')
print('Version {} has been published to PyPI!'.format(version))
print()
print('Please send an email announcement with the contents from:')
print()
print(' doc/en/announce/release-{}.rst'.format(version))
print()
print('To the following mail lists:')
print()
print(' ', ','.join(emails))
print()
print('And announce it on twitter adding the #pytest hash tag.')


@invoke.task(help={
'version': 'version being released',
'write_out': 'write changes to the actual changelog'
Expand All @@ -159,4 +104,3 @@ def changelog(ctx, version, write_out=False):
else:
addopts = ['--draft']
check_call(['towncrier', '--version', version] + addopts)

2 changes: 0 additions & 2 deletions tasks/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
devpi-client
gitpython
invoke
towncrier
tox
wheel

0 comments on commit 053fc11

Please sign in to comment.