You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
18 KiB
470 lines
18 KiB
.. _release_process: |
|
|
|
Release Process |
|
############### |
|
|
|
The Zephyr project releases on a time-based cycle, rather than a feature-driven |
|
one. Zephyr releases represent an aggregation of the work of many contributors, |
|
companies, and individuals from the community. |
|
|
|
A time-based release process enables the Zephyr project to provide users with a |
|
balance of the latest technologies and features and excellent overall quality. A |
|
roughly 4-month release cycle allows the project to coordinate development of |
|
the features that have actually been implemented, allowing the project to |
|
maintain the quality of the overall release without delays because of one or two |
|
features that are not ready yet. |
|
|
|
The Zephyr release model is loosely based on the Linux kernel model: |
|
|
|
- Release tagging procedure: |
|
|
|
- linear mode on main branch, |
|
- release branches for maintenance after release tagging. |
|
- Each release period will consist of a merge window period followed by one or |
|
more release candidates on which only stabilization changes, bug fixes, and |
|
documentation can be merged in. |
|
|
|
- Merge window mode: all changes are accepted (subject to approval from the |
|
respective maintainers.) |
|
- When the merge window is closed, the release owner lays a vN-rc1 tag and the |
|
tree enters the release candidate phase |
|
- CI sees the tag, builds and runs tests; QA analyses the report from the |
|
build and test run and gives an ACK/NAK to the build |
|
- The release owner, with QA and any other needed input, determines if the |
|
release candidate is a go for release |
|
- If it is a go for a release, the release owner lays a tag release vN at the |
|
same point |
|
- Development on new features continues in topic branches. Once features are |
|
ready, they are submitted to mainline during the merge window period and after |
|
the release is tagged. |
|
|
|
.. figure:: release_cycle.png |
|
:align: center |
|
:alt: Release Cycle |
|
:figclass: align-center |
|
:width: 80% |
|
|
|
Release Cycle |
|
|
|
Merge Window |
|
************* |
|
|
|
A relatively straightforward discipline is followed with regard to the merging |
|
of patches for each release. At the beginning of each development cycle, the |
|
"merge window" is said to be open. At that time, code which is deemed to be |
|
sufficiently stable (and which is accepted by the development community) is |
|
merged into the mainline tree. The bulk of changes for a new development cycle |
|
(and all of the major changes) will be merged during this time. |
|
|
|
The merge window lasts for approximately two months. At the end of this time, |
|
the release owner will declare that the window is closed and release the first |
|
of the release candidates. For the codebase release which is destined to be |
|
0.4.0, for example, the release which happens at the end of the merge window |
|
will be called 0.4.0-rc1. The -rc1 release is the signal that the time to merge |
|
new features has passed, and that the time to stabilize the next release of the |
|
code base has begun. |
|
|
|
Over the next weeks, only patches which fix problems should be submitted to the |
|
mainline. On occasion, a more significant change will be allowed, but such |
|
occasions are rare and require a TSC approval (Change Control Board). As a |
|
general rule, if you miss the merge window for a given feature, the best thing |
|
to do is to wait for the next development cycle. (An occasional exception is |
|
made for drivers for previously unsupported hardware; if they do not touch any |
|
other in-tree code, they cannot cause regressions and should be safe to add at |
|
any time). |
|
|
|
As fixes make their way into the mainline, the patch rate will slow over time. |
|
The mainline release owner releases new -rc drops once or twice a week; a normal |
|
series will get up to somewhere between -rc4 and -rc6 before the code base is |
|
considered to be sufficiently stable and the quality metrics have been achieved |
|
at which point the final 0.4.x release is made. |
|
|
|
At that point, the whole process starts over again. |
|
|
|
Here is the description of the various moderation levels: |
|
|
|
- Low: |
|
|
|
- Major New Features |
|
- Bug Fixes |
|
- Refactoring |
|
- Structure/Directory Changes |
|
- Medium: |
|
|
|
- Bug Fixes, all priorities |
|
- Enhancements |
|
- Minor "self-contained" New Features |
|
- High: |
|
|
|
- Bug Fixes: P1 and P2 |
|
- Documentation + Test Coverage |
|
|
|
.. _release_quality_criteria: |
|
|
|
Release Quality Criteria |
|
************************ |
|
|
|
The current backlog of prioritized bugs shall be used as a quality metric to |
|
gate the final release. The following counts shall be used: |
|
|
|
.. csv-table:: Bug Count Release Thresholds |
|
:header: "High", "Medium", "Low" |
|
:widths: auto |
|
|
|
|
|
"0","<20","<50" |
|
|
|
.. note:: |
|
|
|
The "low" bug count target of <50 will be a phased approach starting with 150 |
|
for release 2.4.0, 100 for release 2.5.0, and 50 for release 2.6.0 |
|
|
|
|
|
Releases |
|
********* |
|
|
|
The following syntax should be used for releases and tags in Git: |
|
|
|
- Release [Major].[Minor].[Patch Level] |
|
- Release Candidate [Major].[Minor].[Patch Level]-rc[RC Number] |
|
- Tagging: |
|
|
|
- v[Major].[Minor].[Patch Level]-rc[RC Number] |
|
- v[Major].[Minor].[Patch Level] |
|
- v[Major].[Minor].99 - A tag applied to main branch to signify that work on |
|
v[Major].[Minor+1] has started. For example, v1.7.99 will be tagged at the |
|
start of v1.8 process. The tag corresponds to |
|
VERSION_MAJOR/VERSION_MINOR/PATCHLEVEL macros as defined for a |
|
work-in-progress main branch version. Presence of this tag allows generation of |
|
sensible output for "git describe" on main branch, as typically used for |
|
automated builds and CI tools. |
|
|
|
|
|
.. figure:: release_flow.png |
|
:align: center |
|
:alt: Releases |
|
:figclass: align-center |
|
:width: 80% |
|
|
|
Zephyr Code and Releases |
|
|
|
Long Term Support (LTS) |
|
======================= |
|
|
|
Long-term support releases are designed to be supported and maintained |
|
for an extended period and is the recommended release for |
|
products and the auditable branch used for certification. |
|
|
|
An LTS release is defined as: |
|
|
|
- **Product focused** |
|
- **Extended Stabilisation period**: Allow for more testing and bug fixing |
|
- **Stable APIs** |
|
- **Quality Driven Process** |
|
- **Long Term**: Maintained for an extended period of time (at least 2.5 years) |
|
overlapping previous LTS release for at least half a year. |
|
|
|
|
|
Product Focused |
|
+++++++++++++++ |
|
|
|
Zephyr LTS is the recommended release for product makers with an extended |
|
support and maintenance which includes general stability and bug fixes, |
|
security fixes. |
|
|
|
An LTS includes both mature and new features. API and feature maturity is |
|
documented and tracked. The footprint and scope of mature and stable APIs expands |
|
as we move from one LTS to the next giving users access to bleeding edge features |
|
and new hardware while keeping a stable foundation that evolves over time. |
|
|
|
Extended Stabilisation Period |
|
+++++++++++++++++++++++++++++ |
|
|
|
Zephyr LTS development cycle differs from regular releases and has an extended |
|
stabilization period. Feature freeze of regular releases happens 3-4 weeks |
|
before the scheduled release date. The stabilisation period for LTS is extended |
|
by 3 weeks with the feature freeze occurring 6-7 weeks before the anticipated |
|
release date. The time between code freeze and release date is extended in this case. |
|
|
|
Stable APIs |
|
+++++++++++ |
|
|
|
Zephyr LTS provides a stable and long-lived foundation for developing |
|
products. To guarantee stability of the APIs and the implementation of such |
|
APIs it is required that any release software that makes the core of the OS |
|
went through the Zephyr API lifecycle and stabilised over at least 2 releases. |
|
This guarantees that we release many of the highlighted and core features with |
|
mature and well-established implementations with stable APIs that are |
|
supported during the lifetime of the release LTS. |
|
|
|
- API Freeze (LTS - 2) |
|
|
|
- All stable APIs need to be frozen 2 releases before an LTS. APIs can be extended |
|
with additional features, but the core implementation is not modified. This |
|
is valid for the following subsystems for example: |
|
|
|
- Device Drivers (i2c.h, spi.h)... |
|
- Kernel (k_*): |
|
- OS services (logging,debugging, ..) |
|
- DTS: API and bindings stability |
|
- Kconfig |
|
|
|
- New APIs for experimental features can be added at any time as long as they |
|
are standalone and documented as experimental or unstable features/APIs. |
|
- Feature Freeze (LTS - 1) |
|
- No new features or overhaul/restructuring of code covering major LTS features. |
|
|
|
- Kernel + Base OS |
|
- Additional advertised LTS features |
|
|
|
- Auxiliary features on top of and/or extending the base OS and advertised LTS features |
|
can be added at any time and should be marked as experimental if applicable |
|
|
|
Quality Driven Process |
|
++++++++++++++++++++++ |
|
|
|
The Zephyr project follows industry standards and processes with the goal of |
|
providing a quality oriented releases. This is achieved by providing the |
|
following products to track progress, integrity and quality of the software |
|
components provided by the project: |
|
|
|
- Compliance with published coding guidelines, style guides and naming |
|
conventions and documentation of deviations. |
|
- Regular static analysis on the complete tree using available commercial and |
|
open-source tools and documentation of deviations and false positives. |
|
- Documented components and APIS |
|
- Requirements Catalog |
|
- Verification Plans |
|
- Verification Reports |
|
- Coverage Reports |
|
- Requirements Traceability Matrix (RTM) |
|
- SPDX License Reports |
|
|
|
Each release is created with the above products to document the quality and the |
|
state of the software when it was released. |
|
|
|
Long Term Support and Maintenance |
|
++++++++++++++++++++++++++++++++++ |
|
|
|
A Zephyr LTS release is published every 2 years and is branched and maintained |
|
independently from the main tree for at least 2.5 years after it was |
|
released. Support and maintenance for an LTS release stops at least half a year |
|
after the following LTS release is published. |
|
|
|
.. figure:: lts.png |
|
:align: center |
|
:alt: Long Term Support Release |
|
:figclass: align-center |
|
:width: 80% |
|
|
|
Long Term Support Release |
|
|
|
Changes and fixes flow in both directions. However, changes from main branch to an |
|
LTS branch will be limited to fixes that apply to both branches and for existing |
|
features only. |
|
|
|
All fixes for an LTS branch that apply to the mainline tree shall be submitted to |
|
mainline tree as well. |
|
|
|
Auditable Code Base |
|
=================== |
|
|
|
An auditable code base is to be established from a defined subset of Zephyr OS |
|
features and will be limited in scope. The LTS, development tree, and the |
|
auditable code bases shall be kept in sync after the audit branch is created, |
|
but with a more rigorous process in place for adding new features into the audit |
|
branch used for certification. |
|
|
|
This process will be applied before new features move into the |
|
auditable code base. |
|
|
|
The initial and subsequent certification targets will be decided by the Zephyr project |
|
governing board. |
|
|
|
Processes to achieve selected certification will be determined by the Security and |
|
Safety Working Groups and coordinated with the TSC. |
|
|
|
|
|
Release Procedure |
|
****************** |
|
|
|
This section documents the Release manager responsibilities so that it serves as |
|
a knowledge repository for Release managers. |
|
|
|
Milestones |
|
========== |
|
|
|
The following graphic shows the timeline of phases and milestones associated |
|
with each release: |
|
|
|
.. figure:: milestones.jpg |
|
:align: center |
|
:alt: Release Milestones |
|
:figclass: align-center |
|
:width: 80% |
|
|
|
Release milestones |
|
|
|
This shows how the phases and milestones of one release overlap with those of |
|
the next release: |
|
|
|
|
|
.. figure:: milestones2.jpg |
|
:align: center |
|
:alt: Release Milestones |
|
:figclass: align-center |
|
:width: 80% |
|
|
|
Release milestones with planning |
|
|
|
|
|
.. csv-table:: Milestone Description |
|
:header: "Milestone", "Description", "Definition" |
|
:widths: auto |
|
|
|
|
|
"P0","Planning Kickoff","Start Entering Requirements" |
|
"P1","","TSC Agrees on Major Features and Schedule" |
|
"M0","Merge Window Open","All features, Sized, and AssignedMerge Window Is Opened" |
|
"M1","M1 Checkpoint","Major Features Ready for Code Reviews |br| Test Plans Reviewed and Approved" |
|
"M2","Feature Merge Window Close","Feature Freeze |br| Feature Development Complete (including Code Reviews and Unit Tests Passing) |br| P1 Stories Implemented |br| Feature Merge Window Is Closed |br| Test Development Complete |br| Technical Documentation Created/Updated and Ready for Review |br| CCB Control Starts" |
|
"M3","Code Freeze","Code Freeze |br| RC3 Tagged and Built" |
|
"M4","Release","TSC Reviews the Release Criteria Report and Approves Release |
|
|br| Final RC Tagged |br| Make the Release" |
|
|
|
Release Checklist |
|
================= |
|
|
|
Each release has a GitHub issue associated with it that contains the full |
|
checklist. After a release is complete, a checklist for the next release is |
|
created. |
|
|
|
Tagging |
|
======= |
|
|
|
The final release and each release candidate shall be tagged using the following |
|
steps: |
|
|
|
.. note:: |
|
|
|
Tagging needs to be done via explicit git commands and not via GitHub's release |
|
interface. The GitHub release interface does not generate annotated tags (it |
|
generates 'lightweight' tags regardless of release or pre-release). You should |
|
also upload your gpg public key to your GitHub account, since the instructions |
|
below involve creating signed tags. However, if you do not have a gpg public |
|
key you can opt to remove the ``-s`` option from the commands below. |
|
|
|
.. tabs:: |
|
|
|
.. tab:: Release Candidate |
|
|
|
.. note:: |
|
|
|
This section uses tagging 1.11.0-rc1 as an example, replace with |
|
the appropriate release candidate version. |
|
|
|
#. Update the version variables in the :zephyr_file:`VERSION` file |
|
located in the root of the Git repository to match the version for |
|
this release candidate. The ``EXTRAVERSION`` variable is used to |
|
identify the rc[RC Number] value for this candidate:: |
|
|
|
EXTRAVERSION = rc1 |
|
|
|
#. Post a PR with the updated :zephyr_file:`VERSION` file using |
|
``release: Zephyr 1.11.0-rc1`` as the commit subject. Merge |
|
the PR after successful CI. |
|
#. Tag and push the version, using an annotated tag:: |
|
|
|
$ git pull |
|
$ git tag -s -m "Zephyr 1.11.0-rc1" v1.11.0-rc1 |
|
$ git push git@github.com:zephyrproject-rtos/zephyr.git v1.11.0-rc1 |
|
|
|
#. Once the tag is pushed, a github action will create a draft release |
|
in Github with a shortlog since the last tag. The action will also |
|
create a SPDX manifest of the Zephyr tree and will add the file as an |
|
asset in the release. |
|
|
|
Go to the draft release that was created and edit as needed. If this |
|
step fails for a reason, it can be done manually following the steps |
|
below: |
|
|
|
#. Create a shortlog of changes between the previous release (use |
|
rc1..rc2 between release candidates):: |
|
|
|
$ git shortlog v1.10.0..v1.11.0-rc1 |
|
|
|
#. Find the new tag at the top of the releases page and edit the release |
|
with the ``Edit tag`` button with the following: |
|
|
|
* Name it ``Zephyr 1.11.0-rc1`` |
|
* Copy the shortlog into the release notes textbox (*don't forget |
|
to quote it properly so it shows as unformatted text in Markdown*) |
|
* Check the "This is a pre-release" checkbox |
|
|
|
#. Send an email to the mailing lists (``announce`` and ``devel``) |
|
with a link to the release |
|
|
|
.. tab:: Final Release |
|
|
|
.. note:: |
|
|
|
This section uses tagging 1.11.0 as an example, replace with the |
|
appropriate final release version. |
|
|
|
When all final release criteria has been met and the final release notes |
|
have been approved and merged into the repository, the final release version |
|
will be set and repository tagged using the following procedure: |
|
|
|
#. Update the version variables in the :zephyr_file:`VERSION` file |
|
located in the root of the Git repository. Set ``EXTRAVERSION`` |
|
variable to an empty string to indicate final release:: |
|
|
|
EXTRAVERSION = |
|
|
|
#. Post a PR with the updated :zephyr_file:`VERSION` file using |
|
``release: Zephyr 1.11.0`` as the commit subject. Merge |
|
the PR after successful CI. |
|
#. Tag and push the version, using two annotated tags:: |
|
|
|
$ git pull |
|
$ git tag -s -m "Zephyr 1.11.0" v1.11.0 |
|
$ git push git@github.com:zephyrproject-rtos/zephyr.git v1.11.0 |
|
|
|
# This is the tag that will represent the release on GitHub, so that |
|
# the file you can download is named ``zephyr-v1.11.0.zip`` and not |
|
# just ``v1.11.0.zip`` |
|
$ git tag -s -m "Zephyr 1.11.0" zephyr-v1.11.0 |
|
$ git push git@github.com:zephyrproject-rtos/zephyr.git zephyr-v1.11.0 |
|
|
|
#. Find the new ``zephyr-v1.11.0`` tag at the top of the releases page |
|
and edit the release with the ``Edit tag`` button with the following: |
|
|
|
* Name it ``Zephyr 1.11.0`` |
|
* Copy the full content of ``docs/releases/release-notes-1.11.rst`` |
|
into the release notes textbox |
|
|
|
#. Send an email to the mailing lists (``announce`` and ``devel``) with a link |
|
to the release |
|
|
|
Listing all closed GitHub issues |
|
================================= |
|
|
|
The release notes for a final release contain the list of GitHub issues that |
|
have been closed during the development process of that release. |
|
|
|
In order to obtain the list of issues closed during the release development |
|
cycle you can do the following: |
|
|
|
#. Look for the last release before the current one and find the day it was |
|
tagged:: |
|
|
|
$ git show -s --format=%ci zephyr-v1.10.0 |
|
tag zephyr-v1.10.0 |
|
Tagger: Kumar Gala <kumar.gala@linaro.org> |
|
|
|
Zephyr 1.10.0 |
|
2017-12-08 13:32:22 -0600 |
|
|
|
|
|
#. Use available release tools to list all the issues that have been closed |
|
between that date and the day of the release.
|
|
|