Skip to content

Commit 032b355

Browse files
committed
DOC: more work on release guide
1 parent 595f4a1 commit 032b355

File tree

1 file changed

+165
-130
lines changed

1 file changed

+165
-130
lines changed

doc/devel/release_guide.rst

Lines changed: 165 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,174 +1,200 @@
1+
.. highlight:: bash
2+
13
.. _release-guide:
24

3-
*************
4-
Release Guide
5-
*************
5+
===============
6+
Release Guide
7+
===============
68

79
A guide for developers who are doing a matplotlib release.
810

9-
Development (beta/RC) release checklist
10-
---------------------------------------
11-
12-
- [ ] Testing
13-
- [ ] Create empty REL: commit
14-
- [ ] Create tag
15-
- [ ] Push tags + branches to GH
16-
- [ ] Notify mac/windows/conda builders
17-
- [ ] Merge everything to master
18-
- [ ] announce release
19-
20-
Final release checklist
21-
-----------------------
22-
23-
- [ ] Testing
24-
- [ ] update gh states
25-
- [ ] Create empty REL: commit
26-
- [ ] Create tag
27-
- [ ] Create branches
28-
- [ ] Push tags + branches to GH
29-
- [ ] release / DOI management
30-
- [ ] Notify mac/windows/conda builders
31-
- [ ] Merge everything to master
32-
- [ ] build documentation
33-
- [ ] upload to pypi / sf
34-
- [ ] deploy updated documentation
35-
- [ ] announce release
36-
37-
Details
38-
-------
11+
All Releases
12+
============
3913

4014
.. _release-testing:
4115

4216
Testing
43-
=======
17+
-------
4418

4519
We use `travis-ci <https://travis-ci.org/matplotlib/matplotlib>`__ for
4620
continuous integration. When preparing for a release, the final
4721
tagged commit should be tested locally before it is uploaded::
4822

4923
python tests.py --processes=8 --process-timeout=300
5024

51-
In addition ::
25+
In addition the following two tests should be run and manually inspected::
5226

53-
python unit/memleak_hawaii3.py
54-
55-
should be run to check for memory leaks. Optionally, make sure ::
56-
57-
cd examples/tests/
27+
python unit/memleak_hawaii3.py``
28+
pushd examples/tests/
5829
python backend_driver.py
59-
60-
runs without errors and check the output of the PNG, PDF, PS and SVG
61-
backends.
30+
popd
6231

6332

6433
.. _release_ghstats:
6534

6635
Github Stats
67-
============
36+
------------
6837

69-
To make sure everyone's hard work gets credited, regenerate the github
70-
stats. In the project root run ::
38+
We automatically extract github issue, PRs, and authors from the github via the API::
7139

72-
python tools/github_stats.py --since-tag $TAG --project 'matplotlib/matplotlib' --links > doc/users/github_stats.rst
40+
python tools/github_stats.py --since-tag $TAG --project 'matplotlib/matplotlib' --links --milestone v2.0.0 > doc/users/github_stats.rst
7341

42+
Review and commit changes. Some issue/PR titles may not be valid rst (the most common issue is
43+
``*`` which is interpreted as unclosed markup).
7444

75-
where `$TAG` is the tag of the last major release. This will generate
76-
stats for all work done since that release.
45+
.. _release_chkdocs:
7746

78-
- [ ] review and commit changes
79-
- [ ] check for valid rst
80-
- [ ] re-add github-stats link
47+
Check Docs
48+
----------
49+
50+
Before tagging, make sure that the docs build cleanly ::
51+
52+
pushd doc
53+
python make.py html pdf -n 16
54+
popd
55+
56+
After the docs are built, check that all of the links, internal and external, are still
57+
valid. We use ``linkchecker`` for this, which has not been ported to python3 yet. You will
58+
need to create a python2 enviroment with ``requests==2.9.0`` and linkchecker ::
59+
60+
conda create -p /tmp/lnkchk python=2 requests==2.9.0
61+
source activate /tmp/lnkchk
62+
pip install linkchecker
63+
pushd docs/build/html
64+
linkchecker index.html --check-extern
65+
66+
Address any issues which may arise. The internal links are checked on travis, this should only
67+
flag failed external links.
8168

8269
.. _release_tag:
8370

84-
Create Tag
85-
==========
71+
Create release commit and tag
72+
-----------------------------
73+
74+
To create the tag, first create an empty commit with a very terse set of the release notes
75+
in the commit message ::
76+
77+
git commit --allow-empty
78+
79+
and then create a signed, annotated tag with the same text in the body
80+
message ::
81+
82+
git tag -a -s v2.0.0
83+
84+
which will prompt you for your gpg key password and an annotation.
85+
For pre releases it is important to follow :pep:`440` so than the
86+
build artifacts will sort correctly in pypi. Finally, push the tag to github ::
8687

87-
On the tip of the current branch::
88+
git push -t DANGER v2.0.0
89+
90+
Congratulations, the scariest part is done!
91+
92+
To prevent issues with any down-stream builders which download the
93+
tarball from github it is important to move all branches away from the commit
94+
with the tag ::
8895

8996
git commit --allow-empty
90-
git tag -a -s v1.5.0
97+
git push DANGER master
9198

92-
The commit and tag message should be very terse release notes should look something
93-
like
99+
If this is a final release, also create a 'doc' branch (this is not
100+
done for pre-releases)::
94101

95-
REL: vX.Y.Z
102+
git branch v2.0.0-doc
103+
git push DANGER v2.0.0-doc
96104

97-
Something brief description
105+
and if this is a major or minor release, also create a bug-fix branch (a
106+
micro release will be cut off of this branch)::
98107

99-
Development releases should be post-fixed with the proper string following
100-
`PEP 440<https://www.python.org/dev/peps/pep-0440/>`__ conventions.
108+
git branch v2.0.x
109+
git push DANGER v2.0.x
101110

102-
.. _release-branching:
103111

104-
Branching
105-
=========
106112

107-
Once all the tests are passing and you are ready to do a release, you
108-
need to create a release branch. These only need to be created when
109-
the second part of the version number changes::
113+
.. _release_tag:
110114

111-
git checkout -b v1.1.x
112-
git push git@github.com:matplotlib/matplotlib.git v1.1.x
115+
Release Management / DOI
116+
------------------------
113117

118+
Via the github UI (chase down link), turn the newly pushed tag into a
119+
release. If this is a pre-release remember to mark it as such.
114120

115-
.. _release-packaging:
121+
For final releases also get a DOI from `zenodo
122+
<https://zenodo.org/>`__ and edit :file:`doc/_templates/citing.html`
123+
with DOI link and commit to the VER-doc branch and push to github ::
116124

117-
Packaging
118-
=========
125+
git push DANGER v2.0.0-doc:v2.0.0-doc
119126

120-
* Make sure the :file:`MANIFEST.in` is up to date and remove
121-
:file:`MANIFEST` so it will be rebuilt by MANIFEST.in
127+
.. _release_bld_bin:
122128

123-
* run `git clean` in the mpl git directory before building the sdist
129+
Building binaries
130+
-----------------
124131

125-
* unpack the sdist and make sure you can build from that directory
132+
We distribute mac, windows, and many linux wheels as well as a source
133+
tarball via pypi. Before uploading anything, contact the various
134+
builders. Mac and manylinux wheels are built on travis
135+
. You need to edit the
136+
:file:`.travis.yml` file and push to master of `the build
137+
project <https://github.com/MacPython/matplotlib-wheels>`__.
126138

127-
* Use :file:`setup.cfg` to set the default backends. For windows and
128-
OSX, the default backend should be TkAgg. You should also turn on
129-
or off any platform specific build options you need. Importantly,
130-
you also need to make sure that you delete the :file:`build` dir
131-
after any changes to :file:`setup.cfg` before rebuilding since cruft
132-
in the :file:`build` dir can get carried along.
139+
Update the ``master`` branch (for pre-releases the ``devel`` branch)
140+
of the `conda-forge feedstock
141+
<https://github.com/conda-forge/matplotlib-feedstock>`__ via pull request.
133142

134-
* On windows, unix2dos the rc file.
143+
If this is a final release the following down-steam packagers should be contacted:
135144

136-
* We have a Makefile for the OS X builds in the mpl source dir
137-
:file:`release/osx`, so use this to prepare the OS X releases.
145+
- debian
146+
- fedora
147+
- arch
148+
- gentoo
149+
- macports
150+
- homebrew
151+
- Christoph Gohlke
152+
- continuum
153+
- enthought
138154

139-
* We have a Makefile for the win32 mingw builds in the mpl source dir
140-
:file:`release/win32` which you can use this to prepare the windows
141-
releases.
155+
This can be done ahead of collecting all of the binaries and uploading to pypi.
142156

157+
.. _release_upload_bin:
143158

144-
Update PyPI
145-
===========
159+
make distribution and upload to pypi / SF
160+
-----------------------------------------
146161

147-
This step tells PyPI about the release and uploads a source
148-
tarball. This should only be done with final (non-release-candidate)
149-
releases, since doing so will hide any available stable releases.
162+
Once you have collected all of the wheels, generate the tarball ::
150163

151-
You may need to set up your `.pypirc` file as described in the
152-
`distutils register command documentation
153-
<http://docs.python.org/2/distutils/packageindex.html>`_.
164+
git checkout v2.0.0
165+
git clean -xfd
166+
python setup.py sdist
154167

155-
Then updating the record on PyPI is as simple as::
168+
and copy all of the wheels into :file:`dist` directory. You should use
169+
``twine`` to upload all of the files to pypi ::
156170

157-
python setup.py register
171+
twine -s upload dist/matplotlib*tar.gz
172+
twine upload dist/*whl
158173

159-
This will hide any previous releases automatically.
174+
Congratulations, you have now done the second scariest part!
160175

161-
Then, to upload the source tarball::
176+
Additionally, for a final release, upload all of the files to sourceforge.
162177

163-
rm -rf dist
164-
python setup.py sdist upload
178+
.. _release_docs:
165179

180+
Build and Deploy Documentation
181+
------------------------------
182+
183+
To build the documentation you must have the tagged version installed, but
184+
build the docs from the ``ver-doc`` branch. An easy way to arrange this is::
185+
186+
pip install matplotlib
187+
pip install -r doc-requirements.txt
188+
git checkout v2.0.0-doc
189+
git clean -xfd
190+
cd doc
191+
pyhton make.py html latex -n 16
192+
193+
which will build both the html and pdf version of the documentation.
166194

167-
Build and deploy Documentation
168-
==============================
169195

170196
The built documentation exists in the `matplotlib.github.com
171-
<https://github.com/matplotlib/matplotlib.github.com/>`_ repository.
197+
<https://github.com/matplotlib/matplotlib.github.com/>`__ repository.
172198
Pushing changes to master automatically updates the website.
173199

174200
The documentation is organized by version. At the root of the tree is
@@ -177,39 +203,48 @@ there are directories containing the documentation for older versions.
177203
The documentation for current master are built on travis and push to
178204
the `devdocs <https://github.com/matplotlib/devdocs/>`__ repository.
179205
These are available `matplotlib.org/devdocs
180-
<http://matplotlib.org/devdocs>`__. There is a symlink directory
181-
with the name of the most recently released version that points to the
182-
root. With each new release, these directories may need to be
183-
reorganized accordingly. Any time these version directories are added
184-
or removed, the `versions.html` file (which contains a list of the
185-
available documentation versions for the user) must also be updated.
206+
<http://matplotlib.org/devdocs>`__.
186207

208+
Assuming you have this repository checked out in the same directory as
209+
matplotlib ::
187210

188-
In the matplotlib source repository, build the documentation::
211+
cd ../matplotlib.github.com
212+
mkdir 2.0.0
213+
rsync -a ../matplotlib/doc/build/html/* 2.0.0
214+
cp ../matplotlib/doc/build/html/Matplotlib.pdf 2.0.0
189215

190-
cd doc
191-
python make.py html
192-
python make.py latex
216+
which will copy the built docs over. If this is a final release, also
217+
replace the top-level docs ::
193218

194-
Then copy the build products into your local checkout of the
195-
`matplotlib.github.com` repository (assuming here to be checked out in
196-
`~/matplotlib.github.com`::
219+
rsync -a 2.0.0/* ./
197220

198-
cp -r build/html/* ~/matplotlib.github.com
199-
cp build/latex/Matplotlib.pdf ~/matplotlib.github.com
221+
You will need to manually edit :file:`versions.html` to show the last
222+
3 tagged versions. Now commit and push everything to github ::
200223

201-
Then, from the `matplotlib.github.com` directory, commit and push the
202-
changes upstream::
224+
git add *
225+
git commit -a -m 'Updating docs for v2.0.0
226+
git push DANGER master
203227

204-
git commit -m "Updating for v1.0.1"
205-
git push upstream master
228+
Congratulations you have now done the third scariest part!
206229

230+
It typically takes about 5-10 minutes for github to process the push
231+
and update the live web page (remember to clear your browser cache).
207232

208233

209234
Announcing
210-
==========
235+
----------
236+
237+
The final step is to announce the release to the world. A short
238+
version of the release notes along with acknowledgments should be sent to
239+
240+
- matplotlib-user@python.org
241+
- matplotlib-devel@python.org
242+
- matplotlib-announce@python.org
243+
244+
For final releases announcements should also be sent to the
245+
numpy/scipy/jupyter mailing lists and python-announce.
211246

212-
Announce the release on matplotlib-announce, matplotlib-users, and
213-
matplotlib-devel. Final (non-release-candidate) versions should also
214-
be announced on python-announce. Include a summary of highlights from
215-
the CHANGELOG and/or post the whole CHANGELOG since the last release.
247+
In addition, annoucments should be made on social networks (twitter,
248+
g+, FB). For major release, numFOCUS should be contacted for
249+
inclusion in their news letter and maybe to have something posted on
250+
their blog.

0 commit comments

Comments
 (0)