From 40cd6a1446b9975ec4b60cd7efcfeb7fdb99ef1d Mon Sep 17 00:00:00 2001
From: Christoph Groth <christoph.groth@cea.fr>
Date: Fri, 15 Dec 2017 11:44:26 +0100
Subject: [PATCH] add instructions on Debian/Ubuntu packaging

---
 RELEASE.rst | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 314 insertions(+), 11 deletions(-)

diff --git a/RELEASE.rst b/RELEASE.rst
index 760ee226..e294f01f 100644
--- a/RELEASE.rst
+++ b/RELEASE.rst
@@ -1,13 +1,18 @@
 Making a Kwant release
 ======================
+
 This document guides a contributor through creating a release of Kwant.
 
+
 Preflight checks
 ################
+
 The following checks should be made *before* tagging the release.
 
+
 Check that all issues are resolved
 ----------------------------------
+
 Check that all the issues and merge requests for the appropriate
 `milestone <https://gitlab.kwant-project.org/kwant/kwant/milestones>`
 have been resolved. Any unresolved issues should have their milestone
@@ -16,6 +21,7 @@ bumped.
 
 Ensure that all tests pass
 --------------------------
+
 This should be as simple as verifying that the latest CI pipeline succeeded.
 For major and minor releases we will be tagging the ``master`` branch.
 For patch releases, the ``stable`` branch.
@@ -23,6 +29,7 @@ For patch releases, the ``stable`` branch.
 
 Inspect the documentation
 -------------------------
+
 If the CI pipeline succeeded, then the latest docs should be available at:
 
     https://test.kwant-project.org/doc/<branch name>
@@ -32,6 +39,7 @@ Check that there are no glaring deficiencies.
 
 Update the ``whatsnew`` file
 ----------------------------
+
 Check that there is an appropriate ``whatsnew`` file in ``doc/source/pre/whatsnew``.
 This should be named as::
 
@@ -45,28 +53,313 @@ assigned to the release's milestons and get an idea of what was introduced
 from there.
 
 
+Make a release, but do not publish it yet
+#########################################
+
+Various problems can surface only during the process of preparing a release and
+make it necessary to fix the codebase.  It would be a pity to have to succeed
+the freshly released version by a minor release just to correct a glitch that
+was detected too late.  Therefore it is a good idea to pursue the release as
+far as possible without announcing it, such that it can be undone and corrected
+if necessary.  In the past tests that failed on the x86-32 architecture and
+wrongly declared dependencies have been detected in this way.
+
+
 Tag the release
-###############
-Make an *annotated*, *signed* tag for the release. The tag must have the semantic
-versioning format::
+---------------
 
-    v<major>.<minor>.<patch>
+A particularly good way to expose hidden problems is building Debian packages
+using an isolated minimal build environment (cowbuilder).  This approach is
+described here.
 
-Once the tag has been created, push it to Kwant Gitlab.
+Make an *annotated*, *signed* tag for the release. The tag must have the name::
 
+    git tag -s v1.2.3 -m "version 1.2.3"
 
-Post-tagging
-############
-Pushing a new tag to Kwant Gitlab will kick off a few CI jobs, but there is
-still some manual work to do.
+Be sure to respect the format of the tag name (leading "v").  The tag message
+format is the one that has been used so far.
 
+Do *not* yet push the tag anywhere, it might have to be undone!
 
-Prepare the Debian package
---------------------------
+
+Build a source taball and inspect it
+------------------------------------
+
+    ./setup.py sdist
+
+This creates the file dist/kwant-1.2.3.tar.gz.  It is a good idea to unpack it
+in /tmp and inspect that builds in isolation and that the tests run::
+
+    cd /tmp
+    tar xzf ~/src/kwant/dist/kwant-1.2.3.tar.gz
+    cd kwant-1.2.3
+    ./setup.py test
+
+
+Clone the repository of the Kwant Debian package
+------------------------------------------------
+
+This step needs to be performed only once.  The cloned repository can be reused
+for subsequent releases.
+
+Clone the "kwant-debian" repository and go into its root directory.  If you
+keep the Kwant source in "src/kwant", a good location for the Debian package
+repository is "src/debian/kwant".  The packaging process creates many files
+that are placed into the parent directory of the packaging repository, hence
+having an additional directory level ("src/debian") is a good way to keep these
+files separate::
+
+    mkdir debian
+    cd debian
+    git clone ssh://git@gitlab.kwant-project.org:443/kwant/debian-kwant.git kwant
+    cd kwant
+
+Create a local upstream branch::
+
+    git branch upstream origin/upstream
+
+Add a remote for the repository that contains the previously created tag::
+
+    git remote add upstream_repo ~/src/kwant
+
+Make sure that::
+
+    git config --get user.name
+    git config --get user.email
+
+show correct information.
+
+
+Release a new version of the Kwant Debian package
+-------------------------------------------------
+
+Fetch the git tag created above into the packaging repo::
+
+    git fetch --all
+
+Now there are two options.  If, as recommended above, the tarball of the new
+version has not been made public yet, it must be imported as follows::
+
+    gbp import-orig ~/src/kwant/dist/kwant-1.2.3.tar.gz
+
+Alternatively, the following commands will import the newest version from PyPI::
+
+    uscan --report      # This will report if a newer version exists on PyPI
+    gbp import-orig --uscan
+
+Update the debian changelog.  Add a point "New upstream release" if there was
+one, and describe any other changes to the Debian *packaging*::
+
+    DEBEMAIL=your.email@somewhere.org gbp dch -R --commit --distribution testing
+
+Now the package can be built with::
+
+    git clean -i
+    gbp buildpackage
+
+But this is *not* how the package should be built for distribution.  For that,
+see the following two sections.
+
+
+Setup git-pbuilder to build Debian packages
+-------------------------------------------
+
+Pbuilder is a tool to build Debian packages in an isolated chroot.  This allows
+to verify that the package indeed only has the declared dependencies.  It also
+allows to cross-build packages for i386 on amd64.
+
+The following describes how to setup git-pbuilder, see also
+https://wiki.debian.org/git-pbuilder.  This procedure needs to be executed only
+once for a Debian system.
+
+Install the Debian package git-buildpackage.
+
+As root, add the following lines to /etc/sudoers or /etc/sudoers.d/local
+
+    Cmnd_Alias BUILD = /usr/sbin/cowbuilder
+
+and
+
+    user     ALL = SETENV: BUILD
+
+Now create pbuilder images.  In the following, replace "buster" by the current
+Debian testing codename::
+
+    ARCH=i386 DIST=buster git-pbuilder create
+    ARCH=amd64 DIST=buster git-pbuilder create
+
+If the packages to be built have special dependencies, use the trick described in https://wiki.debian.org/git-pbuilder#Using_Local_Packages
+
+
+Build Kwant packages using git-pbuilder
+---------------------------------------
+
+Update the builder environment (again, replace "buster" with the name of the
+current Debian testing)::
+
+    ARCH=i386 DIST=buster git-pbuilder update
+    ARCH=amd64 DIST=buster git-pbuilder update
+
+Now build the packages.  First the i386 package.  The option "--git-tag" tags
+and signs the tag if the build is successful.  In a second step, the package is
+built for amd64, but only the architecture-dependent files (not the
+documentation package)::
+
+    gbp buildpackage --git-pbuilder --git-arch=i386 --git-dist=buster --git-tag
+    gbp buildpackage --git-pbuilder --git-arch=amd64 --git-dist=buster --git-pbuilder-options='--binary-arch'
+
+Another example: build source package only::
+
+    gbp buildpackage --git-export-dir=/tmp -S
+
+Build packports for the current Debian stable
+---------------------------------------------
+
+Create a changelog entry for the backport::
+
+    DEBEMAIL=your.email@somewhere.org dch --bpo
+
+Build backported packages::
+
+    gbp buildpackage --git-pbuilder --git-ignore-new --git-arch=i386 --git-dist=stretch
+    gbp buildpackage --git-pbuilder --git-ignore-new --git-arch=amd64 --git-dist=stretch --git-pbuilder-options='--binary-arch'
+
+Do not commit anything.
+
+Publish the release
+###################
+
+If the Debian packages build correctly that means that all tests pass both on
+i386 and amd64, and that no undeclared dependencies are needed.  We can be
+reasonable sure that the release is ready to be published.
+
+git
+---
+
+Push the tag to the official Kwant repository::
+
+    git push origin v1.2.3
+
+PyPI
+----
+
+PyPI (this requires a file ~/.pypirc with a vaild username and password)::
+
+    twine upload -s dist/kwant-1.2.3.tar.gz
+
+It is very important that the tarball uploaded here is the same (bit-by-bit,
+not only the contents) as the one used for the Debian packaging.  Otherwise it
+will not be possible to build the Debian package based on the tarball from
+PyPI.
+
+Kwant website
+-------------
+
+The tarball and its signature (generated by the twine command above) should be
+also made available on the website::
+
+    scp dist/kwant-1.2.3.tar.gz* kwant-website-downloads:downloads/kwant
+
+Debian packages
+---------------
+
+Go to the Debian packaging repository and push out everything::
+
+    git push --all --tags origin
+
+Now the Debian packages that we built previously need to be added to the
+repository of Debian packages on the Kwant website.  So far this the full
+version of this repository is kept on Christoph Groth's machine, so this
+instructions are for reference only.
+
+Go to the reprepro repository directory and verify that the configuration file
+"conf/distributions" looks up-to-date.  It should look something like this::
+
+    Origin: Kwant project
+    Suite: stretch-backports
+    Codename: stretch-backports
+    Version: 9.0
+    Architectures: i386 amd64 source
+    Components: main
+    Description: Unofficial Debian package repository of http://kwant-project.org/
+    SignWith: C3F147F5980F3535
+    
+    Origin: Kwant project
+    Suite: testing
+    Codename: buster
+    Version: 10.0
+    Architectures: i386 amd64 source
+    Components: main
+    Description: Unofficial Debian package repository of http://kwant-project.org/
+    SignWith: C3F147F5980F3535
+
+If the config had to be updated execute::
+
+    reprepro export
+    reprepro --delete createsymlinks
+
+Now the source and binary Debian packages can be added.  The last line has to
+be executed for all the .deb files and may be automated with a shell loop. (Be
+sure to use the appropriate <dist>: either testing or stretch-backports.)::
+
+    reprepro includedsc <dist> ../../src/kwant_1.2.3-1.dsc
+    reprepro includedeb <dist> python3-kwant_1.2.3-1_amd64.deb
+
+Once all the packages have been added, upload the repository::
+
+    rsync -avz --delete dists pool wfw:webapps/downloads/debian
+
+Ubuntu packages
+---------------
+
+Make sure ~/.dput.cf has something like this::
+    [ubuntu-ppa-kwant]
+    fqdn = ppa.launchpad.net
+    method = ftp
+    incoming = ~kwant-project/ppa/ubuntu/
+    login = anonymous
+    allow_unsigned_uploads = 0
+
+We will also use the following script (prepare_ppa_upload)::
+    #!/bin/sh
+    
+    if [ $# -eq 0 ]; then
+        echo -e "\nUsage: $(basename $0) lousy mourning2 nasty\n"
+        exit
+    fi
+    
+    version=`dpkg-parsechangelog --show-field Version`
+    mv debian/changelog /tmp/changelog.$$
+    
+    for release in $@; do
+        cp /tmp/changelog.$$ debian/changelog
+        DEBEMAIL=christoph.groth@cea.fr dch -b -v "$version~$release" -u low 'Ubuntu PPA upload'
+        sed -i -e "1,1 s/UNRELEASED/$release/" debian/changelog
+        debuild -S -sa
+    done
+    
+    mv /tmp/changelog.$$ debian/changelog
+
+Make sure that the Debian package builds correctly and go to its directory.
+
+Check https://wiki.ubuntu.com/Releases for the current releases and execute::
+    prepare_ppa_upload trusty vivid wily
+
+(if a second upload of the same Debian version is needed, something like vivid2 can be used)
+
+Now the changes files are "put" to start the build process on the PPA servers::
+
+    cd ..
+    dput ubuntu-ppa-kwant *~*.changes
 
 
 Gather the autobuilt packages from CI
 -------------------------------------
+
+(This section needs to be updated.  Using the sdist package as generated by
+PyPI requires pushing the tag to gitlab and as such is incompatible with doing
+the Debian packaging with an unpublished tag.)
+
 CI automatically generates:
 
 + HTML documentation
@@ -80,6 +373,10 @@ These can be found in the artifacts of the last CI job in the pipeline,
 
 Publish to the Kwant website
 ----------------------------
+
+(This section needs to be updated.  The twine tool creates the signature file
+during the upload.)
+
 To do the following you will need access to the webroots of ``downloads.kwant-project.org``
 and ``kwant-project.org``. Ask Christoph Groth if you need to be granted access.
 
@@ -104,6 +401,9 @@ on ``kwant-project.org``. Point the symbolic link ``<major>`` to this directory.
 
 Publish to PyPI
 ---------------
+
+(This also needs to be updated.)
+
 Install `twine <https://pypi.python.org/pypi/twine>` and use it to upload
 the tar archive in the ``sdist`` directory of the Ci artifacts downloaded
 in the previous step::
@@ -121,6 +421,7 @@ Publish to Launchpad
 
 Publish to Conda forge
 ----------------------
+
 Conda forge automates build/deploy by using CI on Github repositoried containing
 recipes for making packages from their source distributions.
 
@@ -139,6 +440,7 @@ to review and accept the pull request, so that Kwant will be rebuilt.
 
 Announce the release
 --------------------
+
 Write a short post summarizing the highlights of the release on the
 `Kwant website <https://gitlab.kwant-project.org/kwant/website>`, then
 post this to the mailing list kwant-discuss@kwant-project.org.
@@ -146,6 +448,7 @@ post this to the mailing list kwant-discuss@kwant-project.org.
 
 Working towards the next release
 ################################
+
 After finalizing a release, a new ``whatsnew`` file should be created for
 the *next* release, and this addition should be committed and tagged as::
 
-- 
GitLab