Difference between revisions of "ReleaseTeam/How To Release"
(talk) |
(Move) |
||
Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
+ | <!-- ## page was renamed from [[HowToRelease]] --> | ||
Raw notes for release managers, or release monkeys if need be. | Raw notes for release managers, or release monkeys if need be. | ||
<<[[TableOfContents]]()>> | <<[[TableOfContents]]()>> | ||
+ | |||
+ | First, read [[BranchModel]]. | ||
+ | |||
+ | Second: release Swift first, Glance next, and Nova last. | ||
We have two kinds of projects when it comes to release management: | We have two kinds of projects when it comes to release management: | ||
− | * '''External''' projects (Swift) release milestones as complete versions with their own versioning scheme (1.4.0), and the coordinated release just takes the latest milestone for integration in the | + | * '''External''' projects (Swift) release milestones as complete versions with their own versioning scheme (1.4.0), and the coordinated release just takes the latest milestone for integration in the OpenStack common release. |
* '''Internal''' projects (Glance, Nova) deliver milestones with a code name (diablo-1), and the coordinated release corresponds to their major release every 6 months (2011.3) | * '''Internal''' projects (Glance, Nova) deliver milestones with a code name (diablo-1), and the coordinated release corresponds to their major release every 6 months (2011.3) | ||
Line 13: | Line 18: | ||
= Release process = | = Release process = | ||
− | == External milestone release = | + | == External release (Swift) == |
+ | |||
+ | |||
+ | <pre><nowiki> | ||
+ | VER=1.4.0 # The version you want to release | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | When trunk is ready for a milestone, get the swift-core signoff by doing: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # In master swift/__init__.py, propose change from $VER to $VER+1 (leave 'False') | ||
+ | #No automation yet | ||
+ | |||
+ | # Swift-core signoffs on RBP by accepting that change | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | When that change hits trunk, trigger release process: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | PREVCOMMIT=abc0de.. # Last master commit before the one that just hit | ||
+ | |||
+ | # Make sure !FixCommitted bugs were actually fixed in that milestone (?) | ||
+ | ./process-fixcommitted-bugs.py swift --milestone $VER --check | ||
+ | |||
+ | # Create milestone-proposed branch from PREVCOMMIT | ||
+ | #Not automated yet | ||
+ | #Go to https://review.openstack.org/ and sign in | ||
+ | #Select Admin, Projects, then the project and Branches | ||
+ | #Enter milestone-proposed in the Branch Name field, and PREVCOMMIT as the Initial Revision | ||
+ | #Press Create Branch | ||
+ | |||
+ | # Target all !FixCommitted bugs to $VERSION milestone and !FixRelease them | ||
+ | ./process-fixcommitted-bugs.py swift --milestone $VER --settarget $VER --fixrelease | ||
+ | |||
+ | # Wait for tarball generation at https://jenkins.openstack.org/job/swift-milestone-tarball/ | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages | ||
+ | |||
+ | # Call for testing | ||
+ | </nowiki></pre> | ||
+ | |||
− | + | Select bugfixes should be pushed to milestone-proposed if need be. All those should be targeted to milestone and set to FixReleased when they hit. When milestone-proposed is ready for release: | |
− | |||
− | + | <pre><nowiki> | |
− | + | # In milestone-proposed: in swift/__init__.py, change from False to True (leave $VERSION) | |
− | + | #Not automated yet | |
+ | |||
+ | # Approve the merge on behalf of openstack-release | ||
+ | #Not automated yet | ||
+ | |||
+ | # Wait for tarball generation at https://jenkins.openstack.org/job/swift-milestone-tarball/ | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | If everything went well, time to tag and release: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | BUILD=20110922.r1293 | ||
+ | |||
+ | # In swift milestone-proposed: Tag release: $VER | ||
+ | git checkout milestone-proposed | ||
+ | git pull | ||
+ | git tag -s $VER | ||
+ | git push --tags gerrit | ||
+ | |||
+ | # Release $VER with resulting tarball | ||
+ | ./upload_release.py swift $VER $BUILD | ||
+ | |||
+ | # Trigger rebuild of final version in PPA | ||
+ | ./reupload_with_new_version.py swift-core/milestone-proposed swift $VER | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages | ||
+ | |||
+ | # Push to release PPA | ||
+ | ./sync_ppas.py swift-core/milestone-proposed swift-core/release | ||
+ | |||
+ | # Wait for publication at https://launchpad.net/~swift-core/+archive/release/+packages | ||
− | + | # Send email to mailing-list | |
+ | </nowiki></pre> | ||
− | |||
− | |||
− | |||
− | |||
== Internal milestone release == | == Internal milestone release == | ||
− | ( | + | For Nova, translations should be reasonably current: |
+ | |||
+ | |||
+ | <pre><nowiki> | ||
+ | (Translations merge is disabled for now) | ||
+ | </nowiki></pre> | ||
− | |||
− | |||
− | |||
When trunk is ready for a milestone: | When trunk is ready for a milestone: | ||
− | |||
− | |||
− | |||
− | Select bugfixes should be pushed to milestone-proposed if need be. When milestone-proposed is ready for release: | + | <pre><nowiki> |
+ | PROJECT=nova # Project to release | ||
+ | VER=2012.1 # Current dev cycle | ||
+ | MILESTONE=essex-1 # Milestone to release (=VER for release) | ||
+ | MSTONE=e1 # Short name for $MILESTONE | ||
+ | NEWMSTONE=e2 # Short name for new milestone | ||
+ | |||
+ | # Make sure !FixCommitted bugs were actually fixed in that milestone (?) | ||
+ | ./process-fixcommitted-bugs.py $PROJECT --milestone $MILESTONE --check | ||
+ | |||
+ | # Bump milestone in Jenkins | ||
+ | #Not automated yet | ||
+ | #Jenkins:common-bump-milestone set trunk to $NEWMSTONE (keep $MILESTONE for release) | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | '''Only for final release''': | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # Race condition: this must be the first commit of $NEWMSTONE ! | ||
+ | # In master $PROJECT/version.py, propose change from $VER to $VER+1 (leave 'False') | ||
+ | #No automation yet | ||
+ | |||
+ | # $PROJECT-core signoffs on RBP by accepting the branch | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | Then: | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # In milestone-proposed, merge from $REV of trunk | ||
+ | #Not automated yet | ||
+ | #Go to https://review.openstack.org/ and sign in | ||
+ | #Select Admin, Projects, then the project and Branches | ||
+ | #Enter milestone-proposed in the Branch Name field, and HEAD as the Initial Revision | ||
+ | #Press Create Branch | ||
+ | |||
+ | # Target all !FixCommitted bugs to $MILESTONE milestone and !FixRelease them | ||
+ | ./process-fixcommitted-bugs.py $PROJECT --milestone $MILESTONE --settarget $MILESTONE --fixrelease | ||
+ | |||
+ | # Wait for tarball generation at https://jenkins.openstack.org/job/$PROJECT-milestone-tarball/ | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages | ||
+ | |||
+ | # Call for testing | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | Select bugfixes should be pushed to milestone-proposed if need be. All those should be targeted to milestone. When milestone-proposed is ready for release: | ||
+ | |||
+ | '''Milestone process:''' | ||
+ | |||
+ | <pre><nowiki> | ||
+ | BUILD=20110727.r1143 # Look up latest milestone-proposed tarball name | ||
+ | |||
+ | # Bump milestone in Jenkins | ||
+ | #Not automated yet | ||
+ | #Jenkins:common-bump-milestone set release to $NEWMSTONE (keep $NEWMSTONE for trunk) | ||
+ | |||
+ | # In milestone-proposed: Tag release: $MILESTONE | ||
+ | git checkout milestone-proposed | ||
+ | git pull | ||
+ | git tag -s $MILESTONE | ||
+ | git push --tags gerrit | ||
+ | |||
+ | # Release $MILESTONE with corresponding tarball | ||
+ | ./upload_release.py $PROJECT $VER $BUILD $MILESTONE | ||
+ | |||
+ | # Rebuild final version in PPA | ||
+ | ./reupload_with_new_version.py $PROJECT-core/milestone-proposed $PROJECT $VER~$MSTONE | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages | ||
+ | |||
+ | # Push to milestone PPA | ||
+ | ./sync_ppas.py $PROJECT-core/milestone-proposed $PROJECT-core/milestone | ||
+ | |||
+ | # Wait for publication at https://launchpad.net/~$PROJECT-core/+archive/milestone/+packages | ||
+ | |||
+ | # Send email to mailing-list | ||
+ | </nowiki></pre> | ||
+ | |||
+ | |||
+ | '''Final release process:''' | ||
+ | |||
+ | <pre><nowiki> | ||
+ | # In milestone-proposed: in $PROJECT/version.py, change from False to True (leave $VER) | ||
+ | #Not automated yet | ||
+ | |||
+ | # Wait for tarball generation at https://jenkins.openstack.org/job/$PROJECT-milestone-tarball/ | ||
+ | |||
+ | # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages | ||
+ | |||
+ | # Note down last tarball build num | ||
+ | BUILD=20110727.r1143 # Look up latest milestone-proposed tarball name | ||
+ | |||
+ | # Bump milestone in Jenkins | ||
+ | #Not automated yet | ||
+ | #Jenkins:common-bump-milestone set release to $NEWMSTONE (keep $NEWMSTONE for trunk) | ||
+ | |||
+ | # In milestone-proposed: Tag release: $VER | ||
+ | git checkout milestone-proposed | ||
+ | git pull | ||
+ | git tag -s $VER | ||
+ | git push --tags gerrit | ||
+ | |||
+ | # Release $VERSION with corresponding tarball | ||
+ | ./upload_release.py $PROJECT $VER $BUILD | ||
+ | |||
+ | # Rebuild final version in PPA | ||
+ | ./reupload_with_new_version.py $PROJECT-core/milestone-proposed $PROJECT $VER | ||
− | + | # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages | |
− | |||
− | |||
− | + | # Push to milestone PPA | |
+ | ./sync_ppas.py $PROJECT-core/milestone-proposed $PROJECT-core/milestone | ||
− | + | # Wait for publication at https://launchpad.net/~$PROJECT-core/+archive/milestone/+packages | |
+ | </nowiki></pre> | ||
− | |||
− | |||
− | |||
− | When | + | == When all projects are done == |
− | + | <pre><nowiki> | |
− | + | # Create openstack-release PPA | |
− | + | #Not automated yet | |
− | |||
− | + | # Push to openstack-release PPA | |
+ | ./sync_ppas.py nova-core/milestone-proposed glance-core/milestone-proposed \ | ||
+ | swift-core/milestone-proposed openstack-release/$VERSION | ||
− | + | # Wait for publication at https://launchpad.net/~openstack-release/+archive/$VERSION/+packages | |
− | |||
− | |||
− | |||
− | + | # Send email to mailing-list | |
+ | </nowiki></pre> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | = Howtos = | + | = Random Howtos = |
== Tag == | == Tag == | ||
− | * Go to Jenkins, nova job, click on Tags | + | * Go to Jenkins, nova-milestone job, click on Tags /!\ New job names to add |
* Set the checkbox for the first in the list, set tag, click OK | * Set the checkbox for the first in the list, set tag, click OK | ||
− | == Release MILESTONE with | + | == Release MILESTONE with TARBALL as MVERSION == |
− | * Download http://PROJECT.openstack.org/tarballs/ | + | * Download http://PROJECT.openstack.org/tarballs/TARBALL.tar.gz |
− | * Sanity-check tarball contents: tar tzf | + | * Sanity-check tarball contents: tar tzf TARBALL.tar.gz |
− | * Calculate MD5: md5sum | + | * Calculate MD5: md5sum TARBALL.tar.gz |
− | * Rename file: mv | + | * Rename file: mv TARBALL.tar.gz PROJECT-MVERSION.tar.gz |
* Sign file: gpg --armor --sign --detach-sig PROJECT-MVERSION.tar.gz | * Sign file: gpg --armor --sign --detach-sig PROJECT-MVERSION.tar.gz | ||
* Mark milestone as released in Launchpad | * Mark milestone as released in Launchpad | ||
− | ** Go to https://launchpad.net/ | + | ** Go to https://launchpad.net/PROJECT/+milestone/MILESTONE |
** Click on "Create release" | ** Click on "Create release" | ||
− | ** Set release notes | + | ** Set release notes (if any) |
* Add a download file | * Add a download file | ||
** Click "Add a download file" on the milestone page | ** Click "Add a download file" on the milestone page |
Revision as of 16:03, 16 December 2011
Raw notes for release managers, or release monkeys if need be.
<<TableOfContents()>>
First, read BranchModel.
Second: release Swift first, Glance next, and Nova last.
We have two kinds of projects when it comes to release management:
- External projects (Swift) release milestones as complete versions with their own versioning scheme (1.4.0), and the coordinated release just takes the latest milestone for integration in the OpenStack common release.
- Internal projects (Glance, Nova) deliver milestones with a code name (diablo-1), and the coordinated release corresponds to their major release every 6 months (2011.3)
This leads to two slightly different processes.
Release process
External release (Swift)
VER=1.4.0 # The version you want to release
When trunk is ready for a milestone, get the swift-core signoff by doing:
# In master swift/__init__.py, propose change from $VER to $VER+1 (leave 'False') #No automation yet # Swift-core signoffs on RBP by accepting that change
When that change hits trunk, trigger release process:
PREVCOMMIT=abc0de.. # Last master commit before the one that just hit # Make sure !FixCommitted bugs were actually fixed in that milestone (?) ./process-fixcommitted-bugs.py swift --milestone $VER --check # Create milestone-proposed branch from PREVCOMMIT #Not automated yet #Go to https://review.openstack.org/ and sign in #Select Admin, Projects, then the project and Branches #Enter milestone-proposed in the Branch Name field, and PREVCOMMIT as the Initial Revision #Press Create Branch # Target all !FixCommitted bugs to $VERSION milestone and !FixRelease them ./process-fixcommitted-bugs.py swift --milestone $VER --settarget $VER --fixrelease # Wait for tarball generation at https://jenkins.openstack.org/job/swift-milestone-tarball/ # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages # Call for testing
Select bugfixes should be pushed to milestone-proposed if need be. All those should be targeted to milestone and set to FixReleased when they hit. When milestone-proposed is ready for release:
# In milestone-proposed: in swift/__init__.py, change from False to True (leave $VERSION) #Not automated yet # Approve the merge on behalf of openstack-release #Not automated yet # Wait for tarball generation at https://jenkins.openstack.org/job/swift-milestone-tarball/ # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages
If everything went well, time to tag and release:
BUILD=20110922.r1293 # In swift milestone-proposed: Tag release: $VER git checkout milestone-proposed git pull git tag -s $VER git push --tags gerrit # Release $VER with resulting tarball ./upload_release.py swift $VER $BUILD # Trigger rebuild of final version in PPA ./reupload_with_new_version.py swift-core/milestone-proposed swift $VER # Wait for build at https://launchpad.net/~swift-core/+archive/milestone-proposed/+packages # Push to release PPA ./sync_ppas.py swift-core/milestone-proposed swift-core/release # Wait for publication at https://launchpad.net/~swift-core/+archive/release/+packages # Send email to mailing-list
Internal milestone release
For Nova, translations should be reasonably current:
(Translations merge is disabled for now)
When trunk is ready for a milestone:
PROJECT=nova # Project to release VER=2012.1 # Current dev cycle MILESTONE=essex-1 # Milestone to release (=VER for release) MSTONE=e1 # Short name for $MILESTONE NEWMSTONE=e2 # Short name for new milestone # Make sure !FixCommitted bugs were actually fixed in that milestone (?) ./process-fixcommitted-bugs.py $PROJECT --milestone $MILESTONE --check # Bump milestone in Jenkins #Not automated yet #Jenkins:common-bump-milestone set trunk to $NEWMSTONE (keep $MILESTONE for release)
Only for final release:
# Race condition: this must be the first commit of $NEWMSTONE ! # In master $PROJECT/version.py, propose change from $VER to $VER+1 (leave 'False') #No automation yet # $PROJECT-core signoffs on RBP by accepting the branch
Then:
# In milestone-proposed, merge from $REV of trunk #Not automated yet #Go to https://review.openstack.org/ and sign in #Select Admin, Projects, then the project and Branches #Enter milestone-proposed in the Branch Name field, and HEAD as the Initial Revision #Press Create Branch # Target all !FixCommitted bugs to $MILESTONE milestone and !FixRelease them ./process-fixcommitted-bugs.py $PROJECT --milestone $MILESTONE --settarget $MILESTONE --fixrelease # Wait for tarball generation at https://jenkins.openstack.org/job/$PROJECT-milestone-tarball/ # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages # Call for testing
Select bugfixes should be pushed to milestone-proposed if need be. All those should be targeted to milestone. When milestone-proposed is ready for release:
Milestone process:
BUILD=20110727.r1143 # Look up latest milestone-proposed tarball name # Bump milestone in Jenkins #Not automated yet #Jenkins:common-bump-milestone set release to $NEWMSTONE (keep $NEWMSTONE for trunk) # In milestone-proposed: Tag release: $MILESTONE git checkout milestone-proposed git pull git tag -s $MILESTONE git push --tags gerrit # Release $MILESTONE with corresponding tarball ./upload_release.py $PROJECT $VER $BUILD $MILESTONE # Rebuild final version in PPA ./reupload_with_new_version.py $PROJECT-core/milestone-proposed $PROJECT $VER~$MSTONE # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages # Push to milestone PPA ./sync_ppas.py $PROJECT-core/milestone-proposed $PROJECT-core/milestone # Wait for publication at https://launchpad.net/~$PROJECT-core/+archive/milestone/+packages # Send email to mailing-list
Final release process:
# In milestone-proposed: in $PROJECT/version.py, change from False to True (leave $VER) #Not automated yet # Wait for tarball generation at https://jenkins.openstack.org/job/$PROJECT-milestone-tarball/ # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages # Note down last tarball build num BUILD=20110727.r1143 # Look up latest milestone-proposed tarball name # Bump milestone in Jenkins #Not automated yet #Jenkins:common-bump-milestone set release to $NEWMSTONE (keep $NEWMSTONE for trunk) # In milestone-proposed: Tag release: $VER git checkout milestone-proposed git pull git tag -s $VER git push --tags gerrit # Release $VERSION with corresponding tarball ./upload_release.py $PROJECT $VER $BUILD # Rebuild final version in PPA ./reupload_with_new_version.py $PROJECT-core/milestone-proposed $PROJECT $VER # Wait for build at https://launchpad.net/~$PROJECT-core/+archive/milestone-proposed/+packages # Push to milestone PPA ./sync_ppas.py $PROJECT-core/milestone-proposed $PROJECT-core/milestone # Wait for publication at https://launchpad.net/~$PROJECT-core/+archive/milestone/+packages
When all projects are done
# Create openstack-release PPA #Not automated yet # Push to openstack-release PPA ./sync_ppas.py nova-core/milestone-proposed glance-core/milestone-proposed \ swift-core/milestone-proposed openstack-release/$VERSION # Wait for publication at https://launchpad.net/~openstack-release/+archive/$VERSION/+packages # Send email to mailing-list
Random Howtos
Tag
- Go to Jenkins, nova-milestone job, click on Tags /!\ New job names to add
- Set the checkbox for the first in the list, set tag, click OK
Release MILESTONE with TARBALL as MVERSION
- Download http://PROJECT.openstack.org/tarballs/TARBALL.tar.gz
- Sanity-check tarball contents: tar tzf TARBALL.tar.gz
- Calculate MD5: md5sum TARBALL.tar.gz
- Rename file: mv TARBALL.tar.gz PROJECT-MVERSION.tar.gz
- Sign file: gpg --armor --sign --detach-sig PROJECT-MVERSION.tar.gz
- Mark milestone as released in Launchpad
- Go to https://launchpad.net/PROJECT/+milestone/MILESTONE
- Click on "Create release"
- Set release notes (if any)
- Add a download file
- Click "Add a download file" on the milestone page
- Set description accordingly
- Point to tarball (PROJECT-MVERSION.tar.gz) and signature (PROJECT-MVERSION.tar.gz.asc)
- File content type: "Code release tarball"
- Doublecheck md5sum
- Click on "md5" at the download level and compare with the one previously generated
Push a release to PyPI
Prerequisites:
- Contact one of the existing PyPI maintainers for Glance (JayPipes, EwanMellor or MontyTaylor) and get them to add you to the release admins.
- Create a login/password and set your PGP key on your PyPI account details area
Process:
- Upload PKG-INFO from release tarball to set release details
- In "Files", Upload "source" tarball, any python version, with signature.
Open new branch
- Create stable branch (for the just-released SERIES)
- ssh to jenkins box
- sudo su - jenkins
- mkdir tmp && cd tmp
- bzr branch lp:PROJECT
- cd PROJECT
- bzr push lp:~openstack-hudson/PROJECT/SERIES
- Point newly-created series to ~hudson-openstack/PROJECT/trunk
- Point just-released series to newly-created ~openstack-hudson/PROJECT/SERIES
- Switch branches
- Go to https://launchpad.net/nova/
- "Development focus" on the front page. Change it.
- Go to the previous release, e.g. https://launchpad.net/nova/bexar
- Set it to obsolete
- Go to the one being released right now, e.g. https://launchpad.net/nova/cactus
- Set it to "Current stable release"