Skip to content

Allow bumping versions after release branch cut #819

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
May 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .github/workflows/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,6 @@ jobs:
with:
fetch-depth: 0

- name: Test GitHub CLI
env:
GH_TOKEN: ${{ github.token }}
run: |
gh pr view ${{ github.event.pull_request.number }} --json body -q '.body'

- name: Run schema dependency check
env:
GH_TOKEN: ${{ github.token }}
Expand Down
2 changes: 2 additions & 0 deletions app/components/alert_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class AlertComponent < BaseComponent
notice: "text-blue-900 bg-blue-50 dark:bg-main-800 dark:text-blue-400",
error: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
alert: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
timedout: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
success: "text-green-800 bg-green-50 dark:bg-main-800 dark:text-green-400",
info: "text-main-800 bg-main-50 dark:bg-main-800 dark:text-main-400",
announce: "text-amber-800 bg-amber-50 dark:bg-amber-800 dark:text-amber-400"
Expand All @@ -12,6 +13,7 @@ class AlertComponent < BaseComponent
notice: "border border-blue-300 dark:border-blue-800 " + COLORS[:notice],
error: "border border-red-300 dark:border-red-800 " + COLORS[:error],
alert: "border border-red-300 dark:border-red-800 " + COLORS[:alert],
timedout: "border border-red-300 dark:border-red-800 " + COLORS[:alert],
success: "border border-green-300 dark:border-green-800 " + COLORS[:success],
info: "border border-main-300 dark:border-main-800 " + COLORS[:info],
announce: "border border-amber-300 dark:border-amber-800 " + COLORS[:announce]
Expand Down
6 changes: 4 additions & 2 deletions app/controllers/trains_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ def train_params
:auto_apply_patch_changes,
:version_bump_enabled,
:version_bump_file_paths,
:version_bump_branch_prefix
:version_bump_branch_prefix,
:version_bump_strategy
)
end

Expand Down Expand Up @@ -185,7 +186,8 @@ def train_update_params
:auto_apply_patch_changes,
:version_bump_enabled,
:version_bump_file_paths,
:version_bump_branch_prefix
:version_bump_branch_prefix,
:version_bump_strategy
)
end

Expand Down
30 changes: 30 additions & 0 deletions app/jobs/coordinators/pre_release_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class Coordinators::PreReleaseJob < ApplicationJob
RELEASE_HANDLERS = {
"almost_trunk" => Coordinators::PreRelease::AlmostTrunk,
"parallel_working" => Coordinators::PreRelease::ParallelBranches,
"release_backmerge" => Coordinators::PreRelease::ReleaseBackMerge
}

queue_as :high

def perform(release_id)
release = Release.find(release_id)
release_branch = release.release_branch
train = release.train
branching_strategy = train.branching_strategy

if release.hotfix_with_existing_branch?
latest_commit = release.latest_commit_hash(sha_only: false)
return Signal.commits_have_landed!(release, latest_commit, [])
end

begin
release.start_pre_release_phase!
RELEASE_HANDLERS[branching_strategy].call(release, release_branch).value!
rescue Triggers::Errors => ex
elog(ex, level: :warn)
release.fail_pre_release_phase!
release.event_stamp!(reason: :pre_release_failed, kind: :error, data: {error: ex.message})
end
end
end
8 changes: 8 additions & 0 deletions app/jobs/coordinators/version_bump_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class Coordinators::VersionBumpJob < ApplicationJob
queue_as :high

def perform(release_id)
release = Release.find(release_id)
Triggers::VersionBump.call(release)
end
end
14 changes: 0 additions & 14 deletions app/jobs/releases/pre_release_job.rb

This file was deleted.

13 changes: 10 additions & 3 deletions app/libs/coordinators.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,13 @@ module Signals
def self.release_has_started!(release)
Coordinators::SetupReleaseSpecificChannel.call(release)
release.notify!("New release has commenced!", :release_started, release.notification_params)
Releases::PreReleaseJob.perform_async(release.id)
Coordinators::PreReleaseJob.perform_async(release.id)
Releases::FetchCommitLogJob.perform_async(release.id)
RefreshReportsJob.perform_async(release.hotfixed_from.id) if release.hotfix?
end

def self.commits_have_landed!(release, head_commit, rest_commits)
Coordinators::VersionBumpJob.perform_async(release.id)
Coordinators::ProcessCommits.call(release, head_commit, rest_commits)
end

Expand Down Expand Up @@ -92,8 +93,14 @@ def self.workflow_run_trigger_failed!(workflow_run)

def self.pull_request_closed!(pr)
release = pr.release
Actions.complete_release!(release) if release.post_release_failed?
Releases::PreReleaseJob.perform_async(release.id) if release.pre_release? && pr.pre_release_version_bump?

if release.post_release_failed?
Actions.complete_release!(release)
end

if release.pre_release? && pr.pre_release_version_bump?
Releases::PreReleaseJob.perform_async(release.id)
end
end
end

Expand Down
59 changes: 59 additions & 0 deletions app/libs/coordinators/pre_release/almost_trunk.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
module Coordinators
module PreRelease
class AlmostTrunk
def self.call(release, release_branch)
new(release, release_branch).call
end

def initialize(release, release_branch)
@release = release
@release_branch = release_branch
@pre_release_version_bump_pr = release.pull_requests.pre_release.version_bump_type.first
end

def call
if version_bump_required?
Triggers::VersionBump.call(release).then { create_default_release_branch }
else
create_default_release_branch
end
end

private

attr_reader :release, :release_branch
delegate :train, :hotfix?, :hotfix_with_new_branch?, to: :release
delegate :working_branch, :version_bump_enabled?, :current_version_before_release_branch?, to: :train

def create_default_release_branch
source =
if hotfix_with_new_branch?
{
ref: release.hotfixed_from.end_ref,
type: :tag
}
elsif version_bump_enabled? && (commit = @pre_release_version_bump_pr&.merge_commit_sha).present?
{
ref: commit,
type: :commit
}
else
{
ref: working_branch,
type: :branch
}
end
stamp_data = {working_branch: source[:ref], release_branch:}
stamp_type = :release_branch_created
Triggers::Branch.call(release, source[:ref], release_branch, source[:type], stamp_data, stamp_type)
end

def version_bump_required?
version_bump_enabled? &&
current_version_before_release_branch? &&
!hotfix? &&
@pre_release_version_bump_pr.blank?
end
end
end
end
46 changes: 46 additions & 0 deletions app/libs/coordinators/pre_release/parallel_branches.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Coordinators
module PreRelease
class ParallelBranches
include ApplicationHelper

def self.call(release, release_branch)
new(release, release_branch).call
end

def initialize(release, release_branch)
@release = release
@release_branch = release_branch
end

def call
create_and_merge_pr
end

private

attr_reader :release, :release_branch
delegate :train, to: :release
delegate :vcs_provider, :working_branch, to: :train

def create_and_merge_pr
Triggers::PullRequest.create_and_merge!(
release: release,
new_pull_request_attrs: {phase: :pre_release, kind: :forward_merge, release_id: release.id, state: :open},
to_branch_ref: release_branch,
from_branch_ref: working_branch,
title: pr_title,
description: pr_description,
allow_without_diff: false
)
end

def pr_title
"[#{version_in_progress(train.version_current)}] Pre-release merge"
end

def pr_description
"A new release train #{train.name} is starting. The #{working_branch} branch has to be merged into #{release_branch} branch."
end
end
end
end
10 changes: 10 additions & 0 deletions app/libs/coordinators/pre_release/release_back_merge.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module Coordinators
module PreRelease
class ReleaseBackMerge
def self.call(release, release_branch)
# ReleaseBackMerge behaves the same as AlmostTrunk while making a new release
Triggers::PreRelease::AlmostTrunk.call(release, release_branch)
end
end
end
end
31 changes: 0 additions & 31 deletions app/libs/triggers/pre_release.rb

This file was deleted.

54 changes: 0 additions & 54 deletions app/libs/triggers/pre_release/almost_trunk.rb

This file was deleted.

44 changes: 0 additions & 44 deletions app/libs/triggers/pre_release/parallel_branches.rb

This file was deleted.

8 changes: 0 additions & 8 deletions app/libs/triggers/pre_release/release_back_merge.rb

This file was deleted.

Loading