Skip to content

Commit 45f6248

Browse files
DonalMepascalchevrel
authored andcommitted
Add the 2027 release schedule
Added Fx165 - Fx190 Set ESR175 as the next ESR version Minor change in rounding for weeks so a Nightly cycle shortened by an early merge (186: 13 days) still reads as 2 weeks.
1 parent a861f52 commit 45f6248

9 files changed

Lines changed: 143 additions & 13 deletions

File tree

‎app/classes/ReleaseInsights/ESR.php‎

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ESR
1010
* @var array<int> $esr_releases
1111
*/
1212
public static array $esr_releases = [
13-
10, 17, 24, 31, 38, 45, 52, 60, 68, 78, 91, 102, 115, 128, 140, 153,
13+
10, 17, 24, 31, 38, 45, 52, 60, 68, 78, 91, 102, 115, 128, 140, 153, 175,
1414
];
1515

1616
/**
@@ -77,19 +77,25 @@ public static function getOlderSupportedVersion(int $version): ?string
7777
];
7878

7979
/*
80-
1. We support 2 ESR branches for 5 releases by default since we moved to a 2 week cadence from Firefox 155, this is what the next transition (from ESR 153) will use.
81-
ESR 140 is an exception with 4 releases because Firefox 154 was still 4 weeks after 153 before the switch to 2 week cycles at 155, this keeps ESR 140 EOL on October 13 (Firefox 158).
82-
2. Before that, we had 2 ESR branches for 3 releases only since Version 68 and before that we had 2 cycles only with 2 ESR branches as cycles lasted longer
80+
The value is the last dot release of the new ESR that still ships
81+
alongside the previous ESR, the previous ESR is EOL from the next one.
82+
83+
1. Since the 2 week cadence (Firefox 155), the default is 5:
84+
ESR 153's last release is 153.27 (Firefox 180),
85+
ESR 175.6 (Firefox 181) replaces it.
86+
ESR 140 is an exception with 4: Firefox 154 was still 4 weeks after 153,
87+
before the switch to 2 week cycles at 155. ESR 140's last release is
88+
140.17 (Firefox 157), ESR 153.5 (Firefox 158, October 13) replaces it.
89+
2. Before that, we had 2 ESR branches for 3 releases only since Version 68
90+
and before that we had 2 cycles only with 2 ESR branches as cycles lasted longer
8391
3. We extended the 115 ESR cycle because of a still large Windows 7/8.1 population
84-
85-
TODO: remove codeCoverageIgnore on default value for 2027 next ESR when the release is decided. Activate the commented out unit test.
8692
*/
8793
$esr_minor_releases = match(true) {
8894
$version < 78 => 1,
8995
$current_ESR === 128 => 11,
9096
$previous_ESR < 140 => 3,
9197
$previous_ESR === 140 => 4,
92-
default => 5, // @codeCoverageIgnore
98+
default => 5,
9399
};
94100

95101
if (($version - $current_ESR) > $esr_minor_releases) {

‎app/classes/ReleaseInsights/Release.php‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,41 @@ public function getTwoWeekSchedule(): array
308308
]);
309309
}
310310

311+
// Firefox 186 merges a day early, on Wednesday, because Thursday Nov 11
312+
// is a US and Canadian holiday. Build ready for QA moves a day earlier
313+
// too, to preserve 5 days for QA before the merge.
314+
if ($this->version->normalized === '186.0') {
315+
$schedule = array_merge($schedule, [
316+
'qa_feature_done' => '2027-11-03 21:00:00+00:00', // Nightly W1 Wednesday
317+
'merge_day' => '2027-11-10 16:00:00+00:00', // Nightly W2 Wednesday
318+
]);
319+
}
320+
321+
// Firefox 187 starts Nightly on 186's early Wednesday merge, but its early
322+
// Nightly milestones stay on the usual Thursday/Friday.
323+
if ($this->version->normalized === '187.0') {
324+
$schedule = array_merge($schedule, [
325+
'qa_request_deadline' => '2027-11-04 00:00:00+00:00', // Nightly W-1 Thursday
326+
'qa_feature_done' => '2027-11-18 21:00:00+00:00', // Nightly W1 Thursday
327+
'qa_test_plan_due' => '2027-11-19 21:00:00+00:00', // Nightly W1 Friday
328+
]);
329+
}
330+
331+
// Firefox 188 straddles the 2027 year-end break: a 3-week Nightly and an
332+
// early merge before the holidays, then a 3-week Beta. The Beta-side
333+
// deadlines keep the standard release-anchored dates.
334+
if ($this->version->normalized === '188.0') {
335+
$schedule = array_merge($schedule, [
336+
'qa_request_deadline' => '2027-11-17 00:00:00+00:00', // Nightly W-1 Wednesday
337+
'strings_handoff' => '2027-12-13 00:00:00+00:00', // Nightly W3 Monday
338+
'string_freeze' => '2027-12-15 00:00:00+00:00', // Nightly W3 Wednesday
339+
'qa_nightly_signoff' => '2027-12-15 14:00:00+00:00', // Nightly W3 Wednesday, day before merge
340+
'relnotes_beta_ready' => '2027-12-16 00:00:00+00:00', // Nightly W3 Thursday
341+
'merge_day' => '2027-12-16 16:00:00+00:00', // Nightly W3 Thursday
342+
'sumo_1' => '2027-12-23 21:00:00+00:00', // Beta W1 Thursday, SUMO content creation
343+
]);
344+
}
345+
311346
// Sort the schedule by date, needed for schedules with a fixup
312347
asort($schedule);
313348

‎app/data/release_owners.php‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,35 @@
193193
'157.0' => $owners['pascalc'],
194194
'158.0' => $owners['dianna'],
195195
'159.0' => $owners['ryanvm'],
196+
'160.0' => $owners['dmeehan'],
197+
'161.0' => $owners['pascalc'],
198+
'162.0' => $owners['dianna'],
199+
'163.0' => $owners['ryanvm'],
200+
'164.0' => $owners['dmeehan'],
201+
'165.0' => $owners['pascalc'],
202+
'166.0' => $owners['dianna'],
203+
'167.0' => $owners['ryanvm'],
204+
'168.0' => $owners['dmeehan'],
205+
'169.0' => $owners['pascalc'],
206+
'170.0' => $owners['dianna'],
207+
'171.0' => $owners['ryanvm'],
208+
'172.0' => $owners['dmeehan'],
209+
'173.0' => $owners['pascalc'],
210+
'174.0' => $owners['dianna'],
211+
'175.0' => $owners['ryanvm'],
212+
'176.0' => $owners['dmeehan'],
213+
'177.0' => $owners['pascalc'],
214+
'178.0' => $owners['dianna'],
215+
'179.0' => $owners['ryanvm'],
216+
'180.0' => $owners['dmeehan'],
217+
'181.0' => $owners['pascalc'],
218+
'182.0' => $owners['dianna'],
219+
'183.0' => $owners['ryanvm'],
220+
'184.0' => $owners['dmeehan'],
221+
'185.0' => $owners['pascalc'],
222+
'186.0' => $owners['dianna'],
223+
'187.0' => $owners['ryanvm'],
224+
'188.0' => $owners['dmeehan'],
225+
'189.0' => $owners['pascalc'],
226+
'190.0' => $owners['dianna'],
196227
];

‎app/data/upcoming_releases.php‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,30 @@
2626
'162.0' => '2026-12-08',
2727
'163.0' => '2027-01-12',
2828
'164.0' => '2027-01-26',
29+
'165.0' => '2027-02-09',
30+
'166.0' => '2027-02-23',
31+
'167.0' => '2027-03-09',
32+
'168.0' => '2027-03-23',
33+
'169.0' => '2027-04-06',
34+
'170.0' => '2027-04-20',
35+
'171.0' => '2027-05-04',
36+
'172.0' => '2027-05-18',
37+
'173.0' => '2027-06-01',
38+
'174.0' => '2027-06-15',
39+
'175.0' => '2027-06-29',
40+
'176.0' => '2027-07-13',
41+
'177.0' => '2027-07-27',
42+
'178.0' => '2027-08-10',
43+
'179.0' => '2027-08-24',
44+
'180.0' => '2027-09-07',
45+
'181.0' => '2027-09-21',
46+
'182.0' => '2027-10-05',
47+
'183.0' => '2027-10-19',
48+
'184.0' => '2027-11-02',
49+
'185.0' => '2027-11-16',
50+
'186.0' => '2027-11-30',
51+
'187.0' => '2027-12-14',
52+
'188.0' => '2028-01-11',
53+
'189.0' => '2028-01-25',
54+
'190.0' => '2028-02-08',
2955
];

‎app/data/wellness_days.php‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,8 @@
2121
'2026-06-05',
2222
'2026-08-28',
2323
'2026-10-23',
24+
'2027-02-26',
25+
'2027-04-09',
26+
'2027-07-02',
27+
'2027-10-29',
2428
];

‎app/models/future_release.php‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
// with the displayed milestones, including 155's 4-week Nightly transition and
3939
// 163's stretched year-end Beta. Measured on calendar days (times stripped) and
4040
// floored to whole weeks, so e.g. a 14-day beta reads as 2 weeks regardless of
41-
// the merge/release times of day.
42-
$nightly_cycle_length = intdiv(
41+
// the merge/release times of day. The Nightly length is rounded instead, so a
42+
// Nightly shortened by an early merge (186: 13 days) still reads as 2 weeks.
43+
$nightly_cycle_length = (int) round(
4344
new DateTime($cycle_dates['nightly_start'])->setTime(0, 0)
44-
->diff(new DateTime($cycle_dates['merge_day'])->setTime(0, 0))->days,
45-
7
45+
->diff(new DateTime($cycle_dates['merge_day'])->setTime(0, 0))->days / 7
4646
);
4747
$beta_cycle_length = intdiv(
4848
new DateTime($cycle_dates['merge_day'])->setTime(0, 0)

‎app/views/templates/future_release.html.twig‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
{% set channel = 'future' %}
4242
{% endif %}
4343

44-
{% if release == 163 %}
44+
{% if release == 163 or release == 188 %}
4545
{% set alert = alert ~ '
4646
4747
<div class="alert alert-warning d-flex justify-content-center align-top p-2" role="alert">

‎tests/Unit/ReleaseInsights/ESRTest.php‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
expect($output)->toEqual(ESR::getVersion($input));
99
})->with([
1010
[160, '153.7.0'],
11+
[174, '153.21.0'],
12+
[175, '175.0.0'],
13+
[190, '175.15.0'],
1114
[100, '91.9.0'],
1215
[95, '91.4.0'],
1316
[91, '91.0.0'],
@@ -40,7 +43,10 @@
4043
// ESR 140's last release is 140.17 (Firefox 157); it is EOL from Firefox 158 (2026-10-13).
4144
[157, '140.17.0'],
4245
[158, null],
43-
// [178, '153.25.0'], // activate test when 178 is confirmed as the next ESR with a 5 releases overlap with previous ESR
46+
// ESR 153's last release is 153.27 (Firefox 180); ESR 175.6 (Firefox 181) replaces it.
47+
[175, '153.22.0'],
48+
[180, '153.27.0'],
49+
[181, null],
4450
[1000, null],
4551
]);
4652

‎tests/Unit/ReleaseInsights/ReleaseTest.php‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,28 @@
133133
// 164 Nightly QA sign-off is a day earlier than the usual Wednesday (holiday in RO)
134134
expect($sched['qa_nightly_signoff'])->toBe("2027-01-05 14:00:00+00:00");
135135

136+
// 186 merges on Wednesday (Nov 11 holiday); 187 chains off it but keeps its
137+
// early Nightly milestones on Thursday/Friday.
138+
$sched = new Release('186.0')->getSchedule();
139+
expect($sched['qa_feature_done'])->toBe("2027-11-03 21:00:00+00:00");
140+
expect($sched['merge_day'])->toBe("2027-11-10 16:00:00+00:00");
141+
$sched = new Release('187.0')->getSchedule();
142+
expect($sched['nightly_start'])->toBe("2027-11-10 00:00:00+00:00");
143+
expect($sched['qa_request_deadline'])->toBe("2027-11-04 00:00:00+00:00");
144+
expect($sched['qa_feature_done'])->toBe("2027-11-18 21:00:00+00:00");
145+
expect($sched['qa_test_plan_due'])->toBe("2027-11-19 21:00:00+00:00");
146+
147+
// 188 merges early (Dec 16) before the 2027 year-end break, then a 3-week
148+
// Beta; 189 chains off that merge.
149+
$sched = new Release('188.0')->getSchedule();
150+
expect($sched['qa_request_deadline'])->toBe("2027-11-17 00:00:00+00:00");
151+
expect($sched['string_freeze'])->toBe("2027-12-15 00:00:00+00:00");
152+
expect($sched['qa_nightly_signoff'])->toBe("2027-12-15 14:00:00+00:00");
153+
expect($sched['merge_day'])->toBe("2027-12-16 16:00:00+00:00");
154+
expect($sched['sumo_1'])->toBe("2027-12-23 21:00:00+00:00");
155+
expect($sched['rc_gtb'])->toBe("2028-01-06 17:00:00+00:00");
156+
expect($nightly_date('189.0'))->toBe($merge_date('188.0'));
157+
136158
// Firefox 155 is the transition release: a long (~4-week) Nightly then a
137159
// regular 2-week Beta with the full Mon/Wed/Fri cadence (5 betas before the RC).
138160
$sched = new Release('155.0')->getSchedule();

0 commit comments

Comments
 (0)