lib/tasks/release.rake (190 lines of code) (raw):
namespace :release do
desc 'Create a release task issue'
task :issue, [:version] do |_t, args|
version = get_version(args)
ReleaseTools::Tasks::Release::Issue.new(version).execute
end
desc 'Prepare for a new release'
task :prepare, [:version] do |_t, args|
version = args[:version] ? get_version(args) : nil
ReleaseTools::Tasks::Release::Prepare.new(version).execute
end
desc "Check a release's build status"
task :status, [:version] do |t, args|
version = get_version(args)
status = ReleaseTools::BranchStatus.for([version])
status.each_pair do |project, results|
results.each do |result|
ReleaseTools.logger.tagged(t.name) do
ReleaseTools.logger.info(project, result.to_h)
end
end
end
ReleaseTools::Slack::ChatopsNotification.branch_status(status)
end
desc 'Tag a new release'
task :tag, [:version] do |_t, args|
version = get_version(args)
metadata = ReleaseTools::ReleaseMetadata.new
cng_version = ReleaseTools::CNGVersion.new(version.to_ee)
omnibus_version =
ReleaseTools::OmnibusGitlabVersion.new(version.to_omnibus(ee: true))
charts_version =
ReleaseTools::Helm::HelmVersionFinder.new.execute(version)
commits =
if (env = ENV.fetch('STABLE_BRANCH_SOURCE_COMMITS', nil))
ReleaseTools::PublicRelease.parse_hash_from_string(env.to_s)
else
{}
end
ReleaseTools::TraceSection.collapse('Gitaly release', icon: '📦') do
ReleaseTools::PublicRelease::GitalyMonthlyRelease
.new(version, release_metadata: metadata, commit: commits[:gitaly])
.execute
end
ReleaseTools::TraceSection.collapse('Kas release', icon: '📦') do
ReleaseTools::PublicRelease::KasRelease
.new(version, release_metadata: metadata)
.execute
end
ReleaseTools::TraceSection.collapse('GitLab Pages release', icon: '📦') do
ReleaseTools::PublicRelease::GitlabPagesRelease
.new(version, release_metadata: metadata, commit: commits[:gitlab_pages])
.execute
end
ReleaseTools::TraceSection.collapse('GitLab release', icon: '📦') do
ReleaseTools::PublicRelease::GitlabRelease
.new(version.to_ee, release_metadata: metadata, commit: commits[:gitlab])
.execute
end
ReleaseTools::TraceSection.collapse('Omnibus release', icon: '📦') do
ReleaseTools::PublicRelease::OmnibusGitlabRelease
.new(omnibus_version, release_metadata: metadata, commit: commits[:omnibus])
.execute
end
ReleaseTools::TraceSection.collapse('CNG release', icon: '📦') do
ReleaseTools::PublicRelease::CNGImageRelease
.new(cng_version, release_metadata: metadata, commit: commits[:cng])
.execute
end
ReleaseTools::TraceSection.collapse('Helm release', icon: '📦') do
ReleaseTools::PublicRelease::HelmGitlabRelease
.new(charts_version, version, release_metadata: metadata, commit: commits[:helm])
.execute
end
unless dry_run?
file_name = version.to_normalized_version
ReleaseTools::ReleaseMetadataUploader.new.upload(file_name, metadata, auto_deploy: false)
end
Rake::Task['release_environment:create'].invoke(version)
end
desc 'Records a deployment in release/metadata project using the GitLab API'
task :record_metadata_deployment, [:environment, :status, :version] do |_, args|
env = args[:environment]
status = args[:status]
version = args[:version]
ReleaseTools.logger.info(
'Recording metadata deployment',
env: env,
status: status,
version: version,
dry_run: dry_run?
)
next if dry_run?
meta = ReleaseTools::Deployments::Metadata.new(version)
ReleaseTools::SharedStatus.as_security_release(meta.security_release?) do
tracker = ReleaseTools::Deployments::DeploymentTracker.new(environment: env, status: status, version: version)
tracker.record_metadata_deployment
end
end
desc 'Tracks a deployment using the GitLab API'
task :track_deployment, [:environment, :status, :version] do |_, args|
env = args[:environment]
status = args[:status]
version = args[:version]
ReleaseTools.logger.info(
'Starting track_deployment',
env: env,
status: status,
version: version,
dry_run: dry_run?
)
next if dry_run?
meta = ReleaseTools::Deployments::Metadata.new(version)
ReleaseTools::SharedStatus.as_security_release(meta.security_release?) do
tracker = ReleaseTools::Deployments::DeploymentTracker.new(environment: env, status: status, version: version)
deployments = tracker.track
unless env == 'gstg-ref'
ReleaseTools::ErrorTracking.with_exception_captured do
ReleaseTools::Deployments::MergeRequestLabeler
.new
.label_merge_requests(env, deployments)
end
end
ReleaseTools::Deployments::SentryTracker.new.deploy(env, status, version)
end
end
namespace :gitaly do
desc 'Tag a new release'
task :tag, [:version] do |_, args|
version = get_version(args)
ReleaseTools::PublicRelease::GitalyMasterRelease.new(version).execute
end
end
namespace :helm do
desc 'Tag a new release'
task :tag, [:charts_version, :gitlab_version] do |_t, args|
charts_version = ReleaseTools::Version.new(args[:charts_version]) if args[:charts_version] && !args[:charts_version].empty?
gitlab_version = ReleaseTools::Version.new(args[:gitlab_version]) if args[:gitlab_version] && !args[:gitlab_version].empty?
# At least one of the versions must be provided in order to tag
if (!charts_version && !gitlab_version) || (charts_version && !charts_version.valid?) || (gitlab_version && !gitlab_version.valid?)
ReleaseTools.logger.warn('Version number must be in the following format: X.Y.Z')
exit 1
end
ReleaseTools.logger.info(
'Chart release',
charts_version: charts_version,
gitlab_version: gitlab_version
)
charts_version ||=
ReleaseTools::Helm::HelmVersionFinder.new.execute(gitlab_version)
gitlab_version ||=
ReleaseTools::Helm::GitlabVersionFinder.new.execute(charts_version)
ReleaseTools::TraceSection.collapse('Helm release', icon: '📦') do
ReleaseTools::PublicRelease::HelmGitlabRelease
.new(charts_version, gitlab_version)
.execute
end
end
end
# This rake task can be used if the patch blog post automatic generation fails.
# Do not use this task for major or minor releases that go out on the release monthly date.
desc 'Creates a new release post for patch versions'
task :patch_blog_post, :version do |_t, args|
unless args[:version]
ReleaseTools::Security::ReleasePreparation::GenerateBlogPost.new.execute
next
end
coordinator = ReleaseTools::PatchRelease::Coordinator.new(version: args[:version])
blog_post = ReleaseTools::PatchRelease::BlogPost::MergeRequestFactory.create(
patch_coordinator: coordinator,
security_fixes: []
)
ReleaseTools.logger.info("Printing blog post for patch release", version: args[:version])
$stdout.puts blog_post.generate_blog_content if dry_run?
create_or_show_merge_request(blog_post)
end
desc 'Post a message on slack containing a list of backports merged into the stable branches'
task :pending_backports do
release = ReleaseTools::PatchRelease::Coordinator.new
content = release.merge_requests(with_patch_version: true)
ReleaseTools.logger.info("Notifying #{release.versions.join(', ')} backports on slack.")
ReleaseTools::Slack::PatchReleaseMergeRequestsNotification.notify(content)
end
namespace :update_paths do
desc 'Notify the update path pipeline has finished'
task :finish_notification, [:previous_version, :version, :status] do |_t, args|
previous_version = args[:previous_version]
version = args[:version]
status = args[:status].to_sym
ReleaseTools::UpdatePaths::FinishNotification.new(previous_version: previous_version, version: version, status: status).execute
end
end
end