app/views/templates/future_release.html.twig (323 lines of code) (raw):

{% extends 'base.html.twig' %} {% block head_additions %} {% set meta_description = 'Follow Firefox trains and major milestones easily!' %} <meta name="description" content="{{ meta_description }}"> <meta property="twitter:description" content="{{ meta_description }}"> <meta property="og:url" content="https://whattrainisitnow.com/release/"> <meta http-equiv="refresh" content="7200"> {% endblock %} {% block header %} {% include 'release_nav.html.twig' %} {% endblock %} {% block main %} {% if not fallback_content %} {% if release == constant('BETA') %} {% set alert = 'Version shipping to users on the <b class="text-success-emphasis">Beta</b> channel' %} {% set channel = 'beta' %} {% set rollout = ' <span data-bs-toggle="tooltip" data-bs-placement="top" data-bs-html="true" title="This is the background update rate.<br><b>Not the uptake rate!</b>" > <sup class="fw-normal fst-italic text-secondary border-bottom">(' ~ beta_rollout ~ '% rollout)</sup> </span> ' %} {% elseif release == constant('NIGHTLY') %} {% set alert = 'Version shipping to users on the <b class="text-success-emphasis">Nightly</b> channel' %} {% set channel = 'nightly' %} {% elseif release == constant('BETA') - 1 and release == constant('RELEASE') +1 %} {% set alert = '<b class="text-danger">Release candidate</b> about to be released.' %} {% set channel = 'future' %} {% else %} {% set alert = 'Future version, development not started yet' %} {% set channel = 'future' %} {% endif %} {% if release == '147' %} {% set alert = alert ~ ' <div class="alert alert-warning d-flex align-top p-2" role="alert"> <svg class="bi flex-shrink-0 me-2 text-warning" width="24" height="24" role="img" aria-label="Warning:"> <use xlink:href="#exclamation-triangle-fill"/> <symbol id="exclamation-triangle-fill" fill="currentColor" viewBox="0 0 16 16"> <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/> </symbol> </svg> </svg> <div> Beta milestones might be adjusted to EOY staff availability. </div> </div> '%} {% endif %} <div class="w-50 alert alert-primary mx-auto text-center" role="alert">{{ alert|raw }} {% if channel == 'nightly'%} {% if nightly_updates %} <div class="text-success"><small>Automatic Updates are enabled</small></div> {% else %} <div> <small class="text-danger">Automatic Updates are temporarily disabled</small> {% if nightly_emergency %} <br class="mt-2"><small>&rarr; {{ nightly_emergency|raw }}</small> {% endif %} </div> {% endif %} {% endif %} </div> {% set table_header = 'text-secondary-emphasis fw-semibold' %} <table class="table table-light table-fxt-clean table-sm mb-3 w-50 justify-content-center"> <tr class='table-warning'> <th class="{{ table_header }}">Release Date</th><td title="{{ release_date|format_date('full') }}">{{ release_date|format_date('long') }}</td> </tr> <tr> <th class="{{ table_header }}">Release Owner</th><td>{{ release_owner }}</td> </tr> {% if OLDER_ESR %} <tr> <th class="{{ table_header }}">Corresponding ESR releases</th> {% if OLDER_ESR|number_format == 115 %} <td>{{ ESR }} &middot; <span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true" title="ESR 115 support is extended for <i>Windows 7-8.1</i> and <i>macOS 10.12-10.14</i> up to <b>September 2025</b>." class='text-muted'> {{ OLDER_ESR }}<sup class="text-danger">?</sup></span> </td> {% elseif ESR_115 != '' %} <td>{{ ESR }} &middot; {{ OLDER_ESR }} &middot; <span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true" title="ESR 115 support is extended for <i>Windows 7-8.1</i> and <i>macOS 10.12-10.14</i> up to <b>September 2025</b>." class='text-muted'> {{ ESR_115 }}<sup class="text-danger">?</sup></span> </td> {% else %} <td>{{ ESR }} &middot; {{ OLDER_ESR }}</td> {% endif %} </tr> {% else %} <tr> <th class="{{ table_header }}">Corresponding ESR release</th> <td>{{ ESR }}</td> </tr> {% endif %} {% if channel == 'beta' %} <tr> <th class="{{ table_header }}">Current Beta</th> <td> {% if date() > date(cycle_dates.rc_gtb) %} {{ constant('FIREFOX_BETA')|number_format(1) }} <small>Release Candidate</small> {% else %} {{ constant('FIREFOX_BETA') }} {% endif %} {% if beta_rollout != -1 %} {{ rollout|raw }} {% endif %} </td> </tr> <tr> <th class="{{ table_header }}">Bugs fixed in Nightly</th> <td>{{ nightly_fixes.bug_fixes|length }}</td> </tr> {% endif %} {% if channel == 'nightly' %} <tr> <th class="{{ table_header }}">Latest BuildID</th> <td>{{ latest_nightly }}</td> </tr> {% endif %} <tr> <th class="{{ table_header }}">Nightly cycle length</th><td>{{ nightly_cycle_length|number_format }} weeks</td> </tr> <tr> <th class="{{ table_header }}">Beta cycle length</th><td>{{ beta_cycle_length|number_format }} weeks</td> </tr> {% if release == '140' %} <tr class="table-warning"> <td colspan="2" class="text-center fw-bold">{{ release }} is the next <abbr title="Extended Support Release" class="initialism">ESR</abbr></td> </tr> {% endif %} {% if channel == 'nightly' %} <tr> <th class="{{ table_header }}">Release notes</th> <td><a href="https://www.mozilla.org/firefox/nightly/notes/">Nightly notes</a></td> </tr> {% endif %} {% if channel == 'beta' %} <tr> <th class="{{ table_header }}">Release notes</th> <td><a href="https://www.mozilla.org/firefox/beta/notes/">Beta notes</a></td> </tr> {% endif %} </table> {% set btb = ' <small class="text-secondary fw-light">Go to build</small>' %} {% set cycle_labels = { nightly_start: 'Nightly starts', a11y_request_deadline: 'Deadline to request accessibility engineering review', qa_request_deadline: 'Deadline to request manual QA', qa_feature_done: 'Build ready for QA', qa_feature_done_1: 'Build ready for QA in nightly', qa_feature_done_2: 'Build ready for QA in beta', soft_code_freeze: 'Soft Code Freeze starts', qa_pre_merge_done: 'QA pre-merge regression testing done', qa_test_plan_due: 'QA Test Plan approval due', string_freeze: 'String Freeze starts', merge_day: 'Merge day', beta_1: 'Beta 1' ~ btb, beta_2: 'Beta 2' ~ btb, beta_3: 'Beta 3' ~ btb, sumo_1: '<abbr title="support.mozilla.org">SUMO</abbr> content creation', beta_4: 'Beta 4' ~ btb, beta_5: 'Beta 5' ~ btb, beta_6: 'Beta 6' ~ btb, beta_7: 'Beta 7' ~ btb, beta_8: 'Beta 8' ~ btb, qa_pre_rc_signoff: 'Pre-release QA sign-off', beta_9: 'Beta 9' ~ btb, sumo_2: '<abbr title="support.mozilla.org">SUMO</abbr> content localization', beta_10: 'Beta 10' ~ btb, beta_11: 'Beta 11' ~ btb, beta_12: 'Beta 12' ~ btb, beta_13: 'Beta 13' ~ btb, beta_14: 'Beta 14' ~ btb, beta_15: 'Beta 15' ~ btb, rc_gtb: 'Release Candidate' ~ btb, rc: 'Release Candidate', release: 'Release day!', mobile_dot_release: 'Potential mobile dot release', planned_dot_release: 'Planned dot release' } %} {% set cycle_descriptions = { nightly_start: 'The first day of the cycle is <i>Merge Day</i>. After merging mozilla-central to mozilla-beta, we bump the nightly version number on mozilla-central and a new development cycle starts for Firefox. A new Firefox Nightly is shipped every 12 hours.', a11y_request_deadline: 'Accessibility engineering review has been requested (<a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/accessibility-review.html#requesting-engineering-review">using the <code>a11y-review</code> flag on Bugzilla</a>) for new (or significantly redesigned) UI that requires assessment to determine whether it is accessible to people with disabilities.', qa_request_deadline: 'QA has been informed (via a Jira ticket) about features that require manual testing during the nightly and/or beta cycle. <br>Feature technical documentation is also required to draft Test Plans and Test Cases.', qa_feature_done: 'Features with a QA request are ready for testing to assess feature quality and provide a formal test report by the end of Week 2 of the nightly cycle.', qa_feature_done_1: 'Features with a QA request are ready for testing to assess feature quality and provide a formal test report by the end of Week 3 of the nightly cycle.', qa_feature_done_2: 'If nightly testing was skipped then features should be in a testable state by this date for beta testing.', soft_code_freeze: 'We are nearing the end of the nightly cycle. Don\'t land new untested features. Risky changes should be avoided after 8:00 AM UTC until after the nightly version bump on <i>Merge Day</i>.', qa_pre_merge_done: 'QA assess build readiness for shipping to Beta by running a set of Regression test cases and shares a test report.', qa_test_plan_due: 'The QA team appreciates an earlier sign-off from the project teams. The approval milestone will be the final deadline for any feature Test Plan sign-offs. No feedback/sign-off on QAs Feature Test Plan could result in misalignment on testing scope, incomplete test coverage and invalid bugs.', string_freeze: 'In order to ensure that our localizers have adequate time to translate strings, please make sure that all string changes have landed by end of day.', merge_day: 'This is the day in the release cycle when we merge mozilla-central into mozilla-beta. This is the end of the development cycle for Firefox ' ~ release ~ ' and the beginning of our Beta stabilization cycle.', beta_1: 'Built manually just after the merge. It is rolled out to 25% of our beta population. Some experimental features are still activated to watch their behavior on a wider population. These experimental features will be deactivated mid-cycle. Uplift requests are open.', beta_2: 'First automated beta of the cycle. It is rolled out to 50% of our beta population. Build starts at 13:00 UTC. <br>Stabilization work via uplifts.', beta_3: 'Beta rollout bumped to 100% provided stability is good. Build starts at 13:00 UTC. Stabilization work via uplifts.', sumo_1: 'User affecting changes were identified and provided to the support.mozilla.org team. The support content for this release can now be created and will be translated before RC week.', beta_4: 'Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_5: 'Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_6: 'On a regular 4 weeks beta cycle, Beta 6 is the last beta with experimental features still activated. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_7: 'Experimental features are no longer activated at compile time. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_8: 'Last week of the beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', qa_pre_rc_signoff: 'A week before the final sign-off, QA shares preliminary test reports for each feature riding the train. This pre-release sign-off can be <abbr title="No quality concerns">Green</abbr>, <abbr title="Moderate quality concerns">Yellow</abbr> or <abbr title="Severe quality concerns">Red</abbr>.', beta_9: 'On a regular 4 weeks beta cycle, this is the last beta and thus the end of beta uplifts, including <a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/security-approval.html">security bugs</a> for this release (<code>sec-approval+</code> on Bugzilla). Build starts at 13:00 UTC.', sumo_2: 'New content on support.mozilla.org team is finalized, uploaded to the server and provided to our localization teams internationally.', beta_10: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_11: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_12: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_13: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_14: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', beta_15: 'Extra beta usually due to a longer beta cycle. Build starts at 13:00 UTC. Stabilization work via uplifts.', rc_gtb: 'We merge our mozilla-beta repository to mozilla-release and close mozilla-beta until the next merge day. We then build our Release Candidate from mozilla-release. This is the build we intend to ship a week later unless we need to build a second Release Candidate to fix a major quality or business critical issue.', rc: 'Our Release Candidate is shipped to all of our beta population.', release: 'We ship Firefox ' ~ release ~ ' at ' ~ date(cycle_dates.release)|format_date(pattern='HH:mm') ~ ' UTC (6AM PST) at 25% rollout.', mobile_dot_release: 'One week after the release, we evaluate shipping a mobile-only dot release to address identified issues. We can also enable new features on a on a case by case basis if they are suitable for uplift. The decision on shipping or not this dot release for Android and/or iOS, is on the release management team.', planned_dot_release: 'Two weeks after the release, we ship a desktop and/or mobile dot release to address identified quality issues with safe fixes ready. We can also enable new features on a on a case by case basis if they are suitable for uplift. We may have to ship other dot releases before that date. If this is the case and post-release quality issues are already fixed and shipped, the decision on shipping or not the planned dot release is on the release management team.' } %} {% set next_milestone = true %} <table class="table table-light table-fxt-clean table-hover table-sm w-50 justify-content-center mb-3"> <tr> <th colspan="2" class="text-center table-warning force-default-bg fw-semibold">Milestones<br><small class="fw-normal">Desktop, Android & iOS</small></th> </tr> {% for key, value in cycle_dates %} {% if key != 'version' %} {% set extra = '' %} {% if key == 'soft_code_freeze' %} {% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Draft beta release notes</small>' %} {% endif %} {% if key == 'beta_6' %} {% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Last early beta</small>' %} {% endif %} {% if key == 'beta_9' %} {% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Last beta uplifts <span class="fw-light">(sec-approval request deadline)</span></small>' %} {% endif %} {% if key == 'rc' %} {% set extra = ' <small class="badge bg-warning text-dark fw-semibold">Release notes finalized</small>' %} {% endif %} <tr> {% if date(value) < date() %} {% if key starts with 'beta' and key == 'beta_1' %} <th class="text-muted fw-light"> <details> <summary><a href="https://hg.mozilla.org/releases/mozilla-beta/pushloghtml?fromchange=FIREFOX_BETA_{{constant('FIREFOX_BETA')|number_format}}_BASE&amp;tochange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b1_RELEASE" class="link-secondary" title="Mercurial changelog">{{ cycle_labels[key]|raw }}{{ extra|raw }}</a></summary> <p>{{ cycle_descriptions[key]|raw }}</p> </details> </th> {% elseif key starts with 'beta' and key != 'beta_1' %} <th class="text-muted fw-light"> <details> <summary><a href="https://hg.mozilla.org/releases/mozilla-beta/pushloghtml?fromchange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b{{ key|replace({'beta_':''}) -1 }}_RELEASE&amp;tochange=FIREFOX_{{constant('FIREFOX_BETA')|number_format}}_0b{{ key|replace({'beta_':''}) }}_RELEASE" class="link-secondary" title="Mercurial changelog">{{ cycle_labels[key]|raw }}{{ extra|raw }}</a></summary> <p>{{ cycle_descriptions[key]|raw }}</p> </details> </th> {% else %} <th class="text-muted fw-light"> <details> <summary>{{ cycle_labels[key]|raw }}{{ extra|raw }}</summary> <p>{{ cycle_descriptions[key]|raw }}</p> </details> </th> {% endif %} {% else %} <th class="{{ table_header }}"> <details{{ next_milestone and channel in ['nightly', 'beta'] ? ' open' }}> <summary>{{ cycle_labels[key]|raw }}{{ extra|raw }}</summary> <p>{{ cycle_descriptions[key]|raw }}</p> </details> </th> {% set next_milestone = false %} {% endif %} <td {{ date(value) < date() ? ' class="text-muted fw-light"' }}> <span class="schedule_date" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true" title="{{ value|format_date('relative_full')}} <br><b> {{ deadlines[key]['message'] ?? '' }}" >{{ value|format_date(pattern='MMMM d') }}</span>{% if value|format_date(pattern='YYYY-MM-dd') in wellness_days %}<span data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true" title="Wellness day. <br>Reduced availability of Mozilla Staff." class='text-muted'><sup class="text-danger">?</sup></span> {% set wellness_days = wellness_days | filter((v) => v != value|format_date(pattern='YYYY-MM-dd')) %} {% endif %} <br><small class="fst-italic text-end">{{ deadlines[key]['message']}}</small> </td> </tr> {% endif %} {% endfor %} </table> {% endif %} {{ fallback_content|raw }} {% endblock %} {% block footer %} {% if not fallback_content %} {% include 'footer_UTC_warning.html.twig' %} <footer class="d-flex justify-content-center text-white-50 mt-0">Working days exclude week-ends and the current day</footer> {% endif %} <script nonce="{{constant('NONCE')}}"> $(function () { $('[data-bs-toggle="tooltip"]').tooltip() }) $('span.schedule_date').click(function (){ var current_row = $(this).closest('tr'); var details_in_row = current_row.find('details'); if (details_in_row.attr('open')) { details_in_row.removeAttr('open'); } else { details_in_row.attr('open', 'open') }; }); </script> {% endblock %}