Copy and adapt release_commands.pl from Lucy.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/e6cf0653 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/e6cf0653 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/e6cf0653 Branch: refs/heads/master Commit: e6cf0653c66a759cca36ee8a35b19efa7ab5f051 Parents: 532afe5 Author: Marvin Humphrey <[email protected]> Authored: Mon Aug 18 18:57:31 2014 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Wed Aug 20 16:59:52 2014 -0700 ---------------------------------------------------------------------- devel/bin/release_commands.pl | 316 +++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e6cf0653/devel/bin/release_commands.pl ---------------------------------------------------------------------- diff --git a/devel/bin/release_commands.pl b/devel/bin/release_commands.pl new file mode 100755 index 0000000..eeee9d0 --- /dev/null +++ b/devel/bin/release_commands.pl @@ -0,0 +1,316 @@ +#!/usr/bin/perl + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +use 5.010; +use strict; +use warnings; +use Getopt::Long qw( GetOptions ); + +my $usage = join( ' ', + $0, qq|--version=X.Y.Z-rcN|, qq|--apache-id=APACHE_ID|, + qq|--name="FULL NAME"| ) + . "\n"; + +my ( $full_rc_version, $apache_id, $name ); +GetOptions( + 'version=s' => \$full_rc_version, + 'apache-id=s' => \$apache_id, + 'name=s' => \$name, +); +$full_rc_version or die $usage; +$apache_id or die $usage; +$name or die $usage; +$apache_id =~ /^\w+$/ or die $usage; +$full_rc_version =~ m/^(\d+)\.(\d+)\.(\d+)-rc(\d+)$/ or die $usage; +my ( $major, $minor, $micro, $rc ) = ( $1, $2, $3, $4 ); +my $x_y_z_version = sprintf( "%d.%d.%d", $major, $minor, $micro ); + +say qq|###############################################################|; +say qq|# Commands to execute release for | + . qq|Apache Clownfish $x_y_z_version RC $rc|; +say qq|###############################################################|; + +say qq|# If your code signing key is not already available from pgp.mit.edu|; +say qq|# and <http://www.apache.org/dist/lucy/KEYS>, publish it.|; +say qq|[...]\n|; + +say qq|# chdir to the top level of your local copy of the Clownfish repository.|; +say qq|[...]\n|; + +if ( $micro == 0 && $rc < 2 ) { + say qq|# Check out the master branch.|; + say qq|git checkout master\n|; +} +else { + say qq|# Check out the $major.$minor branch.|; + say qq|git checkout $major.$minor\n|; +} + +if ( $rc < 2 ) { + say qq|# Since this is the first RC, run update_version.|; + say qq|./devel/bin/update_version $x_y_z_version\n|; + say qq|# Update the the CHANGES file and associate release|; + say qq|# $x_y_z_version with today's date.|; + say qq|[...]\n|; + say qq|# Commit version bump and CHANGES.|; + say qq|git commit -m "Updating CHANGES and version number | + . qq|for release $x_y_z_version."\n|; +} + +if ( $micro == 0 && $rc < 2 ) { + say qq|# Since this is the first release in a series (i.e. X.Y.0),|; + say qq|# create a branch.|; + say qq|git checkout -b $major.$minor|; +} + +say qq|# Create a tag for the release candidate.|; +say qq|git tag apache-clownfish-$full_rc_version | + . qq|-m "Tagging release candidate $rc for $x_y_z_version."\n|; + +say qq|# Export a pristine copy of the source from the release candidate|; +say qq|# tag.|; +say qq|git archive --prefix=apache-clownfish-$x_y_z_version/ | + . qq|--output=apache-clownfish-$x_y_z_version.tar.gz | + . qq|apache-clownfish-$full_rc_version\n|; + +say qq|# Create an RC directory in our dev area on dist.apache.org|; +say qq|# and check out a copy.|; +say qq|svn mkdir -m "Create RC dir for apache-clownfish-$full_rc_version" | + . qq|https://dist.apache.org/repos/dist/dev/lucy/clownfish/apache-clownfish-$full_rc_version|; +say qq|svn co | + . qq|https://dist.apache.org/repos/dist/dev/lucy/clownfish/apache-clownfish-$full_rc_version\n|; + +say qq|# Move the tarball and a copy of the CHANGES file into the RC dir,|; +say qq|# then chdir into it.|; +say qq|mv apache-clownfish-$x_y_z_version.tar.gz apache-clownfish-$full_rc_version|; +say qq|cp -p CHANGES apache-clownfish-$full_rc_version/CHANGES-$x_y_z_version.txt|; +say qq|cd apache-clownfish-$full_rc_version\n|; + +say qq|# Generate checksums.|; +say qq|perl -MDigest -e '\$d = Digest->new("MD5"); open \$fh, | + . qq|"<apache-clownfish-$x_y_z_version.tar.gz" or die; | + . qq|\$d->addfile(\$fh); print \$d->hexdigest; | + . qq|print " apache-clownfish-$x_y_z_version.tar.gz\\n"' > | + . qq| apache-clownfish-$x_y_z_version.tar.gz.md5|; +say qq|perl -MDigest -e '\$d = Digest->new("SHA-512"); open \$fh, | + . qq|"<apache-clownfish-$x_y_z_version.tar.gz" or die; | + . qq|\$d->addfile(\$fh); print \$d->hexdigest; | + . qq|print " apache-clownfish-$x_y_z_version.tar.gz\\n"' > | + . qq| apache-clownfish-$x_y_z_version.tar.gz.sha\n|; + +say qq|# Sign the release.|; +say qq|gpg --armor --output apache-clownfish-$x_y_z_version.tar.gz.asc | + . qq|--detach-sig apache-clownfish-$x_y_z_version.tar.gz\n|; + +say qq|# Add the artifacts and commit to the dev area on dist.apache.org.|; +say qq|svn add | + . qq|apache-clownfish-$x_y_z_version.tar.gz | + . qq|apache-clownfish-$x_y_z_version.tar.gz.md5 | + . qq|apache-clownfish-$x_y_z_version.tar.gz.sha | + . qq|apache-clownfish-$x_y_z_version.tar.gz.asc | + . qq|CHANGES-$x_y_z_version.txt |; +say qq|svn ci -m "Add apache-clownfish-$x_y_z_version artifacts"\n|; + +say qq|# Perform whatever QC seems prudent on the tarball, installing it|; +say qq|# on test systems, etc.|; +say qq|[...]\n|; + +say qq|# Push your branch and the tag for the RC.|; +say qq|git push origin $major.$minor|; +say qq|git push origin apache-clownfish-$full_rc_version\n|; + +say qq|###############################################################|; +say qq|# Voting|; +say qq|###############################################################\n|; + +say qq|# Call a release vote on the dev list, referring to the artifacts|; +say qq|# made public in the previous step and using the boilerplate email|; +say qq|# below.|; +say qq|[...]\n|; + +say qq|###############################################################|; +say qq|# After the vote has passed...|; +say qq|###############################################################\n|; + +say qq|# Tag the release and delete the RC tags.|; +say qq|git tag apache-clownfish-$x_y_z_version apache-clownfish-$full_rc_version|; +say qq|git push origin apache-clownfish-$x_y_z_version|; +for ( 1 .. $rc ) { + my $rc_tag = qq|apache-clownfish-$major.$minor.$micro-rc$_|; + say qq|git tag -d $rc_tag|; + say qq|git push origin :$rc_tag|; +} +say ""; + +say qq|# Copy release artifacts to the production dist directory and|; +say qq|# remove the RC dir. The "svnmucc" app, which ships with Subversion|; +say qq|# 1.7, is required. If you don't have it, you can ssh to|; +say qq|# people.apache.org and run the commands from there.|; +say qq|ssh $apache_id\@people.apache.org|; +say qq|svnmucc -m "Publish Apache Clownfish $x_y_z_version" | + . qq|-U https://dist.apache.org/repos/dist/ | + . qq|mv dev/lucy/clownfish/apache-clownfish-$full_rc_version/apache-clownfish-$x_y_z_version.tar.gz | + . qq|release/lucy/clownfish/apache-clownfish-$x_y_z_version.tar.gz | + . qq|mv dev/lucy/clownfish/apache-clownfish-$full_rc_version/apache-clownfish-$x_y_z_version.tar.gz.md5 | + . qq|release/lucy/clownfish/apache-clownfish-$x_y_z_version.tar.gz.md5 | + . qq|mv dev/lucy/clownfish/apache-clownfish-$full_rc_version/apache-clownfish-$x_y_z_version.tar.gz.sha | + . qq|release/lucy/clownfish/apache-clownfish-$x_y_z_version.tar.gz.sha | + . qq|mv dev/lucy/clownfish/apache-clownfish-$full_rc_version/apache-clownfish-$x_y_z_version.tar.gz.asc | + . qq|release/lucy/clownfish/apache-clownfish-$x_y_z_version.tar.gz.asc | + . qq|mv dev/lucy/clownfish/apache-clownfish-$full_rc_version/CHANGES-$x_y_z_version.txt | + . qq|release/lucy/clownfish/CHANGES-$x_y_z_version.txt | + . qq|rm dev/lucy/clownfish/apache-clownfish-$full_rc_version\n|; + +say qq|# Carefully remove the artifacts for any previous releases superseded|; +say qq|# by this one.|; +if ( $micro > 0 ) { + my $prev = sprintf( "%d.%d.%d", $major, $minor, $micro - 1 ); + say qq|svnmucc -m "Remove Apache Clownfish $prev" | + . qq|-U https://dist.apache.org/repos/dist/release/lucy/clownfish | + . qq|rm apache-clownfish-$prev.tar.gz | + . qq|rm apache-clownfish-$prev.tar.gz.md5 | + . qq|rm apache-clownfish-$prev.tar.gz.sha | + . qq|rm apache-clownfish-$prev.tar.gz.asc | + . qq|rm CHANGES-$prev.txt |; +} +say qq|[...]\n|; + +say qq|# Update the issue tracker.|; +say qq|# While logged into JIRA, visit the following web page. (Note: this|; +say qq|# permalink may or may not work, and you may not have the necessary|; +say qq|# JIRA permissions to perform the required actions. Please let the|; +say qq|# dev list know if you encounter problems.) Click the "release"|; +say qq|# link for $x_y_z_version and input the date from the CHANGES file.|; +say qq|https://issues.apache.org/jira/plugins/servlet/| + . qq|project-config/LUCY/versions\n|; + +say qq|# Once the release files are in place, update the download page|; +say qq|# of the Lucy website. The easiest way to perform this action is to|; +say qq|# use the CMS bookmarklet at https://cms.apache.org/#bookmark|; +say qq|# to access the edit screens via the CMS web interface. Change the|; +say qq|# artifact links to point at the new version; ensure that while the|; +say qq|# primary download links point at mirrors, the signature and sums|; +say qq|# files point at apache.org.|; +say qq|[...]\n|; + +say qq|# [TODO: this action cannot yet be performed by the RM, so ignore.]|; +say qq|# Publish HTML exports of the documentation for the new release on|; +say qq|# the Lucy website.|; +say qq|[...]\n|; + +say qq|# Send emails announcing the release to:|; +say qq|#|; +say qq|# * The user list.|; +say qq|# * The dev list.|; +say qq|# * The announce\@a.o list. Be sure to send from your|; +say qq|# \@apache.org address|; +say qq|#|; +say qq|# Use the entry in the CHANGES file as the basis for your|; +say qq|# email, or optionally, use the boilerplate announcement text below.|; +say qq|[...]\n|; + +say qq|###############################################################|; +say qq|# Boilerplate VOTE email for dev\@lucy.a.o|; +say qq|# Suggested subject:|; +say qq|#|; +say qq|# [VOTE] Apache Clownfish $x_y_z_version RC $rc|; +say qq|#|; +say qq|###############################################################\n|; + +say <<END_CLOWNFISH_DEV_VOTE; +Hello, + +Release candidate $rc for Apache Clownfish version $x_y_z_version can be +found at: + + https://dist.apache.org/repos/dist/dev/lucy/clownfish/apache-clownfish-$full_rc_version/ + +See the CHANGES file at the top level of the archive for information +about the content of this release. + +This candidate was assembled according to the process documented at: + + http://wiki.apache.org/lucy/ReleaseGuide + +It was cut using "git archive" from the tag at: + + https://git-wip-us.apache.org/repos/asf?p=lucy-clownfish.git;a=tag;h=refs/tags/apache-clownfish-$full_rc_version + +Please vote on releasing this candidate as Apache Clownfish version +$x_y_z_version. The vote will be held open for at least the next 72 +hours. + +All interested parties are welcome to inspect the release candidate +and express approval or disapproval. Votes from members of the Lucy +PMC are binding; the vote passes if there are at least three binding ++1 votes and more +1 votes than -1 votes. + +For suggestions as to how to evaluate Apache Clownfish release candidates, +and for information on ASF voting procedures, see: + + http://wiki.apache.org/lucy/ReleaseVerification + http://wiki.apache.org/lucy/ReleasePrep + http://www.apache.org/foundation/voting.html + +[ ] +1 Release RC $rc as Apache Clownfish $x_y_z_version. +[ ] +0 +[ ] -1 Do not release RC $rc as Apache Clownfish $x_y_z_version because... + +Here's my +1. + +Thanks! +END_CLOWNFISH_DEV_VOTE + +say qq|###############################################################|; +say qq|# Boilerplate ANNOUNCE email|; +say qq|# Suggested subject:|; +say qq|#|; +say qq|# [ANNOUNCE] Apache Clownfish $x_y_z_version released|; +say qq|#|; +say qq|###############################################################\n|; + +say <<END_ANNOUNCE_EMAIL; +Greetings, + +The Apache Lucy team is pleased to announce the release of +Apache Clownfish version $x_y_z_version! + +The Apache Clownfish "symbiotic" object system pairs with "host" +dynamic language environments and facilitates the development of +high performance host language extensions. For a list of issues resolved in +this version, please see the release notes: + + http://www.apache.org/dist/lucy/clownfish/CHANGES-$x_y_z_version.txt + +The most recent release can be obtained from our download page: + + http://lucy.apache.org/download.html + +For general information on Apache Clownfish, please visit the Lucy +project website: + + http://lucy.apache.org/ + +Regards, + +$name, on behalf of the Apache Lucy development team +and community + +END_ANNOUNCE_EMAIL + +say qq|###############################################################|; +
