Skip to content

Commit 4eeaa5e

Browse files
authored
feat: add version bumping strategies (#819)
- next version after release branch cut (new) - current version before release branch cut (previous default)
1 parent 4c38dae commit 4eeaa5e

33 files changed

+306
-195
lines changed

.github/workflows/schema.yml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ jobs:
1313
with:
1414
fetch-depth: 0
1515

16-
- name: Test GitHub CLI
17-
env:
18-
GH_TOKEN: ${{ github.token }}
19-
run: |
20-
gh pr view ${{ github.event.pull_request.number }} --json body -q '.body'
21-
2216
- name: Run schema dependency check
2317
env:
2418
GH_TOKEN: ${{ github.token }}

app/components/alert_component.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ class AlertComponent < BaseComponent
33
notice: "text-blue-900 bg-blue-50 dark:bg-main-800 dark:text-blue-400",
44
error: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
55
alert: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
6+
timedout: "text-red-800 bg-red-50 dark:bg-main-800 dark:text-red-400",
67
success: "text-green-800 bg-green-50 dark:bg-main-800 dark:text-green-400",
78
info: "text-main-800 bg-main-50 dark:bg-main-800 dark:text-main-400",
89
announce: "text-amber-800 bg-amber-50 dark:bg-amber-800 dark:text-amber-400"
@@ -12,6 +13,7 @@ class AlertComponent < BaseComponent
1213
notice: "border border-blue-300 dark:border-blue-800 " + COLORS[:notice],
1314
error: "border border-red-300 dark:border-red-800 " + COLORS[:error],
1415
alert: "border border-red-300 dark:border-red-800 " + COLORS[:alert],
16+
timedout: "border border-red-300 dark:border-red-800 " + COLORS[:alert],
1517
success: "border border-green-300 dark:border-green-800 " + COLORS[:success],
1618
info: "border border-main-300 dark:border-main-800 " + COLORS[:info],
1719
announce: "border border-amber-300 dark:border-amber-800 " + COLORS[:announce]

app/controllers/trains_controller.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ def train_params
135135
:auto_apply_patch_changes,
136136
:version_bump_enabled,
137137
:version_bump_file_paths,
138-
:version_bump_branch_prefix
138+
:version_bump_branch_prefix,
139+
:version_bump_strategy
139140
)
140141
end
141142

@@ -185,7 +186,8 @@ def train_update_params
185186
:auto_apply_patch_changes,
186187
:version_bump_enabled,
187188
:version_bump_file_paths,
188-
:version_bump_branch_prefix
189+
:version_bump_branch_prefix,
190+
:version_bump_strategy
189191
)
190192
end
191193

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Coordinators::PreReleaseJob < ApplicationJob
2+
RELEASE_HANDLERS = {
3+
"almost_trunk" => Coordinators::PreRelease::AlmostTrunk,
4+
"parallel_working" => Coordinators::PreRelease::ParallelBranches,
5+
"release_backmerge" => Coordinators::PreRelease::ReleaseBackMerge
6+
}
7+
8+
queue_as :high
9+
10+
def perform(release_id)
11+
release = Release.find(release_id)
12+
release_branch = release.release_branch
13+
train = release.train
14+
branching_strategy = train.branching_strategy
15+
16+
if release.hotfix_with_existing_branch?
17+
latest_commit = release.latest_commit_hash(sha_only: false)
18+
return Signal.commits_have_landed!(release, latest_commit, [])
19+
end
20+
21+
begin
22+
release.start_pre_release_phase!
23+
RELEASE_HANDLERS[branching_strategy].call(release, release_branch).value!
24+
rescue Triggers::Errors => ex
25+
elog(ex, level: :warn)
26+
release.fail_pre_release_phase!
27+
release.event_stamp!(reason: :pre_release_failed, kind: :error, data: {error: ex.message})
28+
end
29+
end
30+
end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Coordinators::VersionBumpJob < ApplicationJob
2+
queue_as :high
3+
4+
def perform(release_id)
5+
release = Release.find(release_id)
6+
Triggers::VersionBump.call(release)
7+
end
8+
end

app/jobs/releases/pre_release_job.rb

Lines changed: 0 additions & 14 deletions
This file was deleted.

app/libs/coordinators.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@ module Signals
4343
def self.release_has_started!(release)
4444
Coordinators::SetupReleaseSpecificChannel.call(release)
4545
release.notify!("New release has commenced!", :release_started, release.notification_params)
46-
Releases::PreReleaseJob.perform_async(release.id)
46+
Coordinators::PreReleaseJob.perform_async(release.id)
4747
Releases::FetchCommitLogJob.perform_async(release.id)
4848
RefreshReportsJob.perform_async(release.hotfixed_from.id) if release.hotfix?
4949
end
5050

5151
def self.commits_have_landed!(release, head_commit, rest_commits)
52+
Coordinators::VersionBumpJob.perform_async(release.id)
5253
Coordinators::ProcessCommits.call(release, head_commit, rest_commits)
5354
end
5455

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

9394
def self.pull_request_closed!(pr)
9495
release = pr.release
95-
Actions.complete_release!(release) if release.post_release_failed?
96-
Releases::PreReleaseJob.perform_async(release.id) if release.pre_release? && pr.pre_release_version_bump?
96+
97+
if release.post_release_failed?
98+
Actions.complete_release!(release)
99+
end
100+
101+
if release.pre_release? && pr.pre_release_version_bump?
102+
Releases::PreReleaseJob.perform_async(release.id)
103+
end
97104
end
98105
end
99106

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
module Coordinators
2+
module PreRelease
3+
class AlmostTrunk
4+
def self.call(release, release_branch)
5+
new(release, release_branch).call
6+
end
7+
8+
def initialize(release, release_branch)
9+
@release = release
10+
@release_branch = release_branch
11+
@pre_release_version_bump_pr = release.pull_requests.pre_release.version_bump_type.first
12+
end
13+
14+
def call
15+
if version_bump_required?
16+
Triggers::VersionBump.call(release).then { create_default_release_branch }
17+
else
18+
create_default_release_branch
19+
end
20+
end
21+
22+
private
23+
24+
attr_reader :release, :release_branch
25+
delegate :train, :hotfix?, :hotfix_with_new_branch?, to: :release
26+
delegate :working_branch, :version_bump_enabled?, :current_version_before_release_branch?, to: :train
27+
28+
def create_default_release_branch
29+
source =
30+
if hotfix_with_new_branch?
31+
{
32+
ref: release.hotfixed_from.end_ref,
33+
type: :tag
34+
}
35+
elsif version_bump_enabled? && (commit = @pre_release_version_bump_pr&.merge_commit_sha).present?
36+
{
37+
ref: commit,
38+
type: :commit
39+
}
40+
else
41+
{
42+
ref: working_branch,
43+
type: :branch
44+
}
45+
end
46+
stamp_data = {working_branch: source[:ref], release_branch:}
47+
stamp_type = :release_branch_created
48+
Triggers::Branch.call(release, source[:ref], release_branch, source[:type], stamp_data, stamp_type)
49+
end
50+
51+
def version_bump_required?
52+
version_bump_enabled? &&
53+
current_version_before_release_branch? &&
54+
!hotfix? &&
55+
@pre_release_version_bump_pr.blank?
56+
end
57+
end
58+
end
59+
end
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
module Coordinators
2+
module PreRelease
3+
class ParallelBranches
4+
include ApplicationHelper
5+
6+
def self.call(release, release_branch)
7+
new(release, release_branch).call
8+
end
9+
10+
def initialize(release, release_branch)
11+
@release = release
12+
@release_branch = release_branch
13+
end
14+
15+
def call
16+
create_and_merge_pr
17+
end
18+
19+
private
20+
21+
attr_reader :release, :release_branch
22+
delegate :train, to: :release
23+
delegate :vcs_provider, :working_branch, to: :train
24+
25+
def create_and_merge_pr
26+
Triggers::PullRequest.create_and_merge!(
27+
release: release,
28+
new_pull_request_attrs: {phase: :pre_release, kind: :forward_merge, release_id: release.id, state: :open},
29+
to_branch_ref: release_branch,
30+
from_branch_ref: working_branch,
31+
title: pr_title,
32+
description: pr_description,
33+
allow_without_diff: false
34+
)
35+
end
36+
37+
def pr_title
38+
"[#{version_in_progress(train.version_current)}] Pre-release merge"
39+
end
40+
41+
def pr_description
42+
"A new release train #{train.name} is starting. The #{working_branch} branch has to be merged into #{release_branch} branch."
43+
end
44+
end
45+
end
46+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module Coordinators
2+
module PreRelease
3+
class ReleaseBackMerge
4+
def self.call(release, release_branch)
5+
# ReleaseBackMerge behaves the same as AlmostTrunk while making a new release
6+
Triggers::PreRelease::AlmostTrunk.call(release, release_branch)
7+
end
8+
end
9+
end
10+
end

app/libs/triggers/pre_release.rb

Lines changed: 0 additions & 31 deletions
This file was deleted.

app/libs/triggers/pre_release/almost_trunk.rb

Lines changed: 0 additions & 54 deletions
This file was deleted.

app/libs/triggers/pre_release/parallel_branches.rb

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/libs/triggers/pre_release/release_back_merge.rb

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)