Merge branch 'verify-release'

This commit is contained in:
Kasper Timm Hansen 2017-07-23 14:27:02 +02:00
commit a532eb448f
No known key found for this signature in database
GPG Key ID: 191153215EDA53D8
4 changed files with 138 additions and 96 deletions

View File

@ -96,15 +96,15 @@ If you're doing a stable branch release, you should also ensure that all of
the CHANGELOG entries in the stable branch are also synced to the master
branch.
### Update the RAILS_VERSION file to include the RC.
### Put the new version in the RAILS_VERSION file.
Include an RC number if appropriate, e.g. `6.0.0.rc1`.
### Build and test the gem.
Run `rake install` to generate the gems and install them locally. Then try
generating a new app and ensure that nothing explodes.
Verify that Action Cable and Action View's package.json files are updated with
the RC version.
Run `rake verify` to generate the gems and install them locally. `verify` also
generates a Rails app with a migration and boots it to smoke test with in your
browser.
This will stop you from looking silly when you push an RC to rubygems.org and
then realize it is broken.
@ -117,22 +117,17 @@ as NPM packages, so you must have Node.js installed, have an NPM account
check this via `npm owner ls actioncable` and `npm owner ls rails-ujs`) in
order to do a full release. Do not release until you're set up with NPM!
The release task will sign the release tag. If you haven't got commit signing
set up, use https://git-scm.com/book/tr/v2/Git-Tools-Signing-Your-Work as a
guide. You can generate keys with the GPG suite from here: https://gpgtools.org.
Run `rake changelog:header` to put a header with the new version in every
CHANGELOG. Don't commit this, the release task handles it.
Run `rake release`. This will populate the gemspecs and NPM package.json with
the current RAILS_VERSION, commit the changes, tag it, and push the gems to
rubygems.org.
Here are the commands that `rake release` uses so you can understand what to do
in case anything goes wrong:
```
$ rake all:build
$ git commit -am'updating RAILS_VERSION'
$ git tag -m 'v3.0.10.rc1 release' v3.0.10.rc1
$ git push
$ git push --tags
$ for i in $(ls pkg); do gem push $i; npm publish; done
```
### Send Rails release announcements
Write a release announcement that includes the version, changes, and links to
@ -146,6 +141,13 @@ lists where you should announce:
Use Markdown format for your announcement. Remember to ask people to report
issues with the release candidate to the rails-core mailing list.
NOTE: For patch releases there's a `rake announce` task to generate the release
post. It supports multiple patch releases too:
```
VERSIONS="5.0.5.rc1,5.1.3.rc1" rake announce
```
IMPORTANT: If any users experience regressions when using the release
candidate, you *must* postpone the release. Bugfix releases *should not*
break existing applications.

View File

@ -7,6 +7,9 @@ require "railties/lib/rails/api/task"
desc "Build gem files for all projects"
task build: "all:build"
desc "Build, install and verify the gem files in a generated Rails app."
task verify: "all:verify"
desc "Prepare the release"
task prep_release: "all:prep_release"

View File

@ -142,7 +142,7 @@ namespace :all do
task push: FRAMEWORKS.map { |f| "#{f}:push" } + ["rails:push"]
task :ensure_clean_state do
unless `git status -s | grep -v 'RAILS_VERSION\\|CHANGELOG\\|Gemfile.lock\\|package.json\\|version.rb'`.strip.empty?
unless `git status -s | grep -v 'RAILS_VERSION\\|CHANGELOG\\|Gemfile.lock\\|package.json\\|version.rb\\|tasks/release.rb'`.strip.empty?
abort "[ABORTING] `git status` reports a dirty tree. Make sure all changes are committed"
end
@ -152,6 +152,27 @@ namespace :all do
end
end
task verify: :install do
app_name = "pkg/verify-#{version}-#{Time.now.to_i}"
sh "rails new #{app_name}"
cd app_name
sh "rails generate scaffold user name admin:boolean && rails db:migrate"
puts "Booting a Rails server. Verify the release by:"
puts
puts "- Seeing the correct release number on the root page"
puts "- Viewing /users"
puts "- Creating a user"
puts "- Updating a user (e.g. disable the admin flag)"
puts "- Deleting a user on /users"
puts "- Whatever else you want."
begin
sh "rails server"
rescue Interrupt
# Server passes along interrupt. Prevent halting verify task.
end
end
task :bundle do
sh "bundle check"
end
@ -179,69 +200,47 @@ namespace :all do
task release: %w(prep_release tag push)
end
task :announce do
Dir.chdir("pkg/") do
if gem_version.segments[2] == 0 || gem_version.segments[3].is_a?(Integer)
# Not major releases, and not security releases
raise "Only valid for patch releases"
module Announcement
class Version
def initialize(version)
@version, @gem_version = version, Gem::Version.new(version)
end
sums = "$ shasum -a 256 *-#{version}.gem\n" + `shasum -a 256 *-#{version}.gem`
def to_s
@version
end
puts "Hi everyone,"
puts
def previous
@gem_version.segments[0, 3].tap { |v| v[2] -= 1 }.join(".")
end
puts "I am happy to announce that Rails #{version} has been released."
puts
def major_or_security?
@gem_version.segments[2].zero? || @gem_version.segments[3].is_a?(Integer)
end
previous_version = gem_version.segments[0, 3]
previous_version[2] -= 1
previous_version = previous_version.join(".")
def rc?
@version =~ /rc/
end
end
end
if version =~ /rc/
task :announce do
Dir.chdir("pkg/") do
versions = ENV["VERSIONS"] ? ENV["VERSIONS"].split(",") : [ version ]
versions = versions.sort.map { |v| Announcement::Version.new(v) }
raise "Only valid for patch releases" if versions.any?(&:major_or_security?)
if versions.any?(&:rc?)
require "date"
future_date = Date.today + 5
future_date += 1 while future_date.saturday? || future_date.sunday?
github_user = `git config github.user`.chomp
puts <<MSG
If no regressions are found, expect the final release on #{future_date.strftime('%A, %B %-d, %Y')}.
If you find one, please open an [issue on GitHub](https://github.com/rails/rails/issues/new)
#{"and mention me (@#{github_user}) on it, " unless github_user.empty?}so that we can fix it before the final release.
MSG
end
puts <<MSG
## CHANGES since #{previous_version}
To view the changes for each gem, please read the changelogs on GitHub:
MSG
FRAMEWORKS.sort.each do |framework|
puts "* [#{FRAMEWORK_NAMES[framework]} CHANGELOG](https://github.com/rails/rails/blob/v#{version}/#{framework}/CHANGELOG.md)"
end
puts <<MSG
*Full listing*
To see the full list of changes, [check out all the commits on
GitHub](https://github.com/rails/rails/compare/v#{previous_version}...v#{version}).
## SHA-256
If you'd like to verify that your gem is the same as the one I've uploaded,
please use these SHA-256 hashes.
Here are the checksums for #{version}:
```
#{sums}
```
As always, huge thanks to the many contributors who helped with this release.
MSG
require "erb"
template = File.read("../tasks/release_announcement_draft.erb")
puts ERB.new(template, nil, "<>").result(binding)
end
end

View File

@ -0,0 +1,38 @@
Hi everyone,
I am happy to announce that Rails <%= versions.join(" and ") %> <%= versions.size > 1 ? "have" : "has" %> been released.
<% if future_date %>
If no regressions are found, expect the final release on <%= future_date.strftime("%A, %B %-d, %Y") %>.
If you find one, please open an [issue on GitHub](https://github.com/rails/rails/issues/new)
<%= "and mention me (@github_user}) on it, " unless github_user.empty? %>so that we can fix it before the final release.
<% end %>
<% versions.each do |version| %>
## CHANGES since <%= version.previous %>
To view the changes for each gem, please read the changelogs on GitHub:
<% FRAMEWORKS.sort.each do |framework| %>
<%= "* [#{FRAMEWORK_NAMES[framework]} CHANGELOG](https://github.com/rails/rails/blob/v#{version}/#{framework}/CHANGELOG.md)" %>
<% end %>
*Full listing*
To see the full list of changes, [check out all the commits on
GitHub](https://github.com/rails/rails/compare/v<%= "#{version.previous}...v#{version}" %>).
<% end %>
## SHA-256
If you'd like to verify that your gem is the same as the one I've uploaded,
please use these SHA-256 hashes.
<% versions.each do |version| %>
Here are the checksums for <%= version %>:
```
$ shasum -a 256 *-<%= version %>.gem
<%= `shasum -a 256 *-#{version}.gem` %>
```
<% end %>
As always, huge thanks to the many contributors who helped with this release.