What is the motivation for this suggestion?
We start summarizing the process that is in place for contributing code to the O3DE repositories. In particular, we are going to identify three different phases that happen between two major releases of the engine, in order to highlight the actions that are performed by the involved actors and which of them can become critical for the entire process.
It is important to note that we don't aim to provide here a full description of the contribution process, but just a brief overview of the context in which this RFC is applied. For further details, please refer to the Contribution Guidelines and SIG-Release Process Docs.
Current process
Let's assume that the latest stable release is publicly available. The following steps are expected for enhancing the next version of the engine:
- A User opens a new issue selecting the desired template: (1) report a bug, or (2) suggest a new feature. The
need-triage and need-sig labels are assigned automatically.
- During the weekly meetings, a Special Interest Group (SIG) Chair/Co-Chair removes the
need-* labels and assign the issue to the correct SIG(s), by adding the relative sig/<name> and triage/accepted labels.
- Eventually, a Contributor picks up and solves the issue. The solution is contributed back to the main repository by opening a Pull Request (PR) toward the
development branch.
- Two Maintainers review and accept the PR, which can be merged into the codebase only if it passes all tests on he Automated Review (AR).
When a date for the next major release is picked:
- The Release Manager creates a Project Board to list the important governance tasks, and a Milestone to track bugs.
- A
stabilization/<version> branch is created from development for each repository that is part of the release.
- Contributors focus on testing the code that is part of the stabilization branch, in order to find any minor / major / critical bug.
- When an error is found, it is reported following the above point (1). It is very important that the Contributor remembers to fill the
Found in Branch section in the issue template, in order to distinguish between this phase and the previous one.
- The Release Manager adds the issue to the Milestone to track its progress.
- The issue is fixed following the standard process, exception that PR is created against
stabilization rather than development.
When the release date is approaching:
- An Exception Board is used to filter which PR can still be accepted into the
stabilization branch, according to the severity of the bug.
- The Release Manager creates a Feature List that describes all the changes since the last major release, using the PRs that were created over the past months. All SIG Chairs/Co-Chairs can provide additional details about them. Finally, the Documentation Manager convert it to a full Release Notes for the site.
- The Release Manager makes a determination on the stability of the code, according to the bugs that are still open.
- If everything is fine, the stabilized code is merged into the
main branch and released. The stabilization branch is then cancelled.
Please remember that the first phase is always active, even while the other two ones are running. Periodic synchronizations between branches are done by cherry-picking changes back from stabilization to development.
Critical points
- Provisioning of data requires actors to perform a manual operation on issues or PRs, such as writing a valid text, assigning the correct label or milestone. When it is missed due to other duties, information about that contribution may get lost.
- Retrieving planned / implemented features requires inspecting every PRs, since information is manly included in their text fields.
- Monitoring issues and PRs that are related to a specific version requires to generate queries that combine multiple fields, such as labels, creation date, etc.
Suggestion design description:
In the past months, GitHub had launched new features that we can leverage to automate parts of the issue management. They could be used to address the above critical points, introducing only a minimal additional effort for Contributors (see chapter about disadvantages).
-
The issue template for bugs is enhanced to use issue forms, which provides a validation on input data rather than the classical markdown text. Common widgets (e.g. dropdown, checkbox) are used to restrict the supported values, so that it is simpler to automate them. In particular:
-
Set the existing Found in Branch field to a set of multiple radiobuttons to distinguish between the affected engine versions and the valid ones. Since O3DE doesn't have a Long-Term Support (LTS), the following versions are suggested:
<latest_stable_number> (stable)
<candidate_stabilization_number> (stabilization)
development
For each of them, the following values are defined:
-
Existing labels for code repositories have to be revisited in order to describe the information that are currently available only in the text fields of issues and PRs (e.g. descriptions, titles). In particular:
- Add a new set for describing the affected versions:
branch/stable
branch/stabilization
branch/development
- Add a new set for describing the versions that still need to be double-checked for a reported bug:
need-check/stable
need-check/stabilization
need-check/development
- Add a new set for marking PRs that were merged in a branch, but they still need to be ported to another branch by a cherry-pick:
need-sync/to-development: merged in stabilization, but it needs need to be ported to development;
need-sync/to-stabilization: merged in development, but it needs to be ported to stabilization
- Add a new set for keeping track of which PRs were ported between branches in order to keep them up-to-date with the latest fixes:
sync/to-development: it was ported from stabilization to development;
sync/to-stabilization: it was ported from development to stabilization
This label is mutually exclusive with the previos set need-sync/*. In particular, it has to replace it when the porting operation is completed.
- Split the
feature/<name> set into two hierarchical ones:
category/<category_name> - Describe one main area of the engine (e.g. audio, gameplay, graphics, physics, network)
subcategory/<category_name>/<feature_name> - Describe one specific feature inside a main area (e.g. physics/rigid-body, physics/kinematics-body)
Due to the amount of features that need to be identified, the full list of new labels will be provided at a second time during the approval process of this RFC.
- Deprecate
kind/bug, kind/feature, and others in the kind/* set in favor of the new Types field. The new UI interface for issues already provides a dedicated filter for this new property, which will allow to reduce the number of labels that are displayed near each issue title.
-
New GitHub Actions are activated to help assigning the correct labels without requiring any manual effort. In particular, the following Actions are good candidates for the following user-cases, since they have a permissive license and are already available:
- Advanced Issue Labeler - Assign one or more
branch/* labels to issues according to which versions are set to Yes in the Found in Branch field. In the same way, add one or more need-check/* labels when the value is set to Unknown.
- Pull Request Labeler - Assign one
branch/* label to PRs according to the target branch name. For all features that are self-contained in the codebase, it may be feasible to apply category/* and subcategory/* according to the changed file paths. Otherwise, the Maintainer has to set the correct values manually when reviewing the PR.
-
The Project Board for stabilization (YY.MM Release) is extended to include also the bug issues, rather than only the governance tasks. The loading can be automated using an auto-add workflow that looks for the branch/stabilization label on the new created issues, and automatically add them to the project when it is found.
-
Due to the amount of items that will be displayed. the previous Project Board is split into five dedicated vies that match the different phases of the release process, as they are described in Major Release Process - v1.3 (May 25, 2023):
- Planning
- Stabilization
- Pre-Release
- Release Day
- Post-Release
Each view is shown as dedicated Board with three columns (Todo, In Progress and Done), excepting for the stabilization one that uses List to better display issues as table rows. The closed status can be automated using built-in automations that is provided by GitHub Projects.
-
The Milestone is converted to collect PRs rather than issues. This approach allows to separate the proposal (project board) from the actual implementation (milestone), tracking whether a fix is really part of the final release or not. In fact, after that a bug is found (opening an issue), the following scenarios may happen:
- The issue is not taken by anyone.
- The PR with the fix is open, but it isn't reviewed yet.
- The PR is approved, but it is still waiting to pass AR.
- The PR is merged, but the related issue wasn't closed.
Since we would count only merged PRs in the Milestone, it will be safe to assume that all the planned fixes have successfully reached the stabilization branch when the progression value reaches 100%. Otherwise, there might still be some pending PRs that were created but are waiting to be merged.
-
A new Project Board for development (Next Release) is created alongside the existing one. It contains only the second view that is described at point (5) (i.e Stabilization, which is now renamed to Development). Its purpose is to collect all the issues that are open against the development branch at any time. Moreover, it can also receive those issues that are rejected from the stabilization branch, due to time constraints, lower severity, etc. When a new major release is announced:
- This project board is renamed to
YY.MM + 1 Release
- The required views for governance are created in this project board, with all the required tasks.
- The auto-add workflow for issues is switched from
branch/development to branch/stabilization, in order to collect only new bug issues. Note that all the issues that were previously open during the development phase are still there after the switch.
- A new project board
Next Release is created from scratch to start collecting again new issues from development.
- The Release Manager and SIG Chair/Co-Chairs can postpone the resolution of some bugs by transferring issues between the first board and the second one.
What are the advantages of the suggestion?
The Project Board becomes a single-source-of-truth to monitor the status of the O3DE project. Each actor can easily filter data according to their needs:
- Contributors can see which features are under development, and are planned for the current release or the next one.
- Maintainers can monitor incoming bugs and assign different priorities.
- The Release Manager can extract information for the Feature List, and track the progression of the stabilization process.
What are the disadvantages of the suggestion?
Most of the heavy lifting for labeling issues and PRs can be automated with GitHub Actions, but it is still required that labels for category/subcategory are applied by Maintainers manually. In fact, Users would not have the permissions to add labels on their own PRs, and the process cannot be automated any further since YAML syntax isn't currently supported in PR.
What is the strategy for adoption?
Due to the amount of existing issues (3k+ open / 4k+ closed), the new process will be applied only to new issues and PRs. This means that the new process can be fully effective only at the second major release after that it is activated.
The documentation at SIG-Release Process Docs will be updated in order to describe the new process.
What is the motivation for this suggestion?
We start summarizing the process that is in place for contributing code to the O3DE repositories. In particular, we are going to identify three different phases that happen between two major releases of the engine, in order to highlight the actions that are performed by the involved actors and which of them can become critical for the entire process.
It is important to note that we don't aim to provide here a full description of the contribution process, but just a brief overview of the context in which this RFC is applied. For further details, please refer to the Contribution Guidelines and SIG-Release Process Docs.
Current process
Let's assume that the latest stable release is publicly available. The following steps are expected for enhancing the next version of the engine:
need-triageandneed-siglabels are assigned automatically.need-*labels and assign the issue to the correct SIG(s), by adding the relativesig/<name>andtriage/acceptedlabels.developmentbranch.When a date for the next major release is picked:
stabilization/<version>branch is created fromdevelopmentfor each repository that is part of the release.Found in Branchsection in the issue template, in order to distinguish between this phase and the previous one.stabilizationrather thandevelopment.When the release date is approaching:
stabilizationbranch, according to the severity of the bug.mainbranch and released. Thestabilizationbranch is then cancelled.Please remember that the first phase is always active, even while the other two ones are running. Periodic synchronizations between branches are done by cherry-picking changes back from
stabilizationtodevelopment.Critical points
Suggestion design description:
In the past months, GitHub had launched new features that we can leverage to automate parts of the issue management. They could be used to address the above critical points, introducing only a minimal additional effort for Contributors (see chapter about disadvantages).
The issue template for bugs is enhanced to use issue forms, which provides a validation on input data rather than the classical markdown text. Common widgets (e.g. dropdown, checkbox) are used to restrict the supported values, so that it is simpler to automate them. In particular:
Set the existing Found in Branch field to a set of multiple
radiobuttonsto distinguish between the affected engine versions and the valid ones. Since O3DE doesn't have a Long-Term Support (LTS), the following versions are suggested:<latest_stable_number> (stable)<candidate_stabilization_number> (stabilization)developmentFor each of them, the following values are defined:
yesnounknownExisting labels for code repositories have to be revisited in order to describe the information that are currently available only in the text fields of issues and PRs (e.g. descriptions, titles). In particular:
branch/stablebranch/stabilizationbranch/developmentneed-check/stableneed-check/stabilizationneed-check/developmentneed-sync/to-development: merged instabilization, but it needs need to be ported todevelopment;need-sync/to-stabilization: merged indevelopment, but it needs to be ported tostabilizationsync/to-development: it was ported fromstabilizationtodevelopment;sync/to-stabilization: it was ported fromdevelopmenttostabilizationThis label is mutually exclusive with the previos set
need-sync/*. In particular, it has to replace it when the porting operation is completed.feature/<name>set into two hierarchical ones:category/<category_name>- Describe one main area of the engine (e.g.audio,gameplay,graphics,physics,network)subcategory/<category_name>/<feature_name>- Describe one specific feature inside a main area (e.g.physics/rigid-body,physics/kinematics-body)Due to the amount of features that need to be identified, the full list of new labels will be provided at a second time during the approval process of this RFC.
kind/bug,kind/feature, and others in thekind/*set in favor of the new Types field. The new UI interface for issues already provides a dedicated filter for this new property, which will allow to reduce the number of labels that are displayed near each issue title.New GitHub Actions are activated to help assigning the correct labels without requiring any manual effort. In particular, the following Actions are good candidates for the following user-cases, since they have a permissive license and are already available:
branch/*labels to issues according to which versions are set toYesin the Found in Branch field. In the same way, add one or moreneed-check/*labels when the value is set toUnknown.branch/*label to PRs according to the target branch name. For all features that are self-contained in the codebase, it may be feasible to applycategory/*andsubcategory/*according to the changed file paths. Otherwise, the Maintainer has to set the correct values manually when reviewing the PR.The Project Board for stabilization (
YY.MM Release) is extended to include also the bug issues, rather than only the governance tasks. The loading can be automated using an auto-add workflow that looks for thebranch/stabilizationlabel on the new created issues, and automatically add them to the project when it is found.Due to the amount of items that will be displayed. the previous Project Board is split into five dedicated vies that match the different phases of the release process, as they are described in Major Release Process - v1.3 (May 25, 2023):
Each view is shown as dedicated
Boardwith three columns (Todo,In ProgressandDone), excepting for the stabilization one that usesListto better display issues as table rows. The closed status can be automated using built-in automations that is provided by GitHub Projects.The Milestone is converted to collect PRs rather than issues. This approach allows to separate the proposal (project board) from the actual implementation (milestone), tracking whether a fix is really part of the final release or not. In fact, after that a bug is found (opening an issue), the following scenarios may happen:
Since we would count only merged PRs in the Milestone, it will be safe to assume that all the planned fixes have successfully reached the stabilization branch when the progression value reaches 100%. Otherwise, there might still be some pending PRs that were created but are waiting to be merged.
A new Project Board for development (
Next Release) is created alongside the existing one. It contains only the second view that is described at point (5) (i.eStabilization, which is now renamed toDevelopment). Its purpose is to collect all the issues that are open against thedevelopmentbranch at any time. Moreover, it can also receive those issues that are rejected from the stabilization branch, due to time constraints, lower severity, etc. When a new major release is announced:YY.MM + 1 Releasebranch/developmenttobranch/stabilization, in order to collect only new bug issues. Note that all the issues that were previously open during the development phase are still there after the switch.Next Releaseis created from scratch to start collecting again new issues fromdevelopment.What are the advantages of the suggestion?
The Project Board becomes a single-source-of-truth to monitor the status of the O3DE project. Each actor can easily filter data according to their needs:
What are the disadvantages of the suggestion?
Most of the heavy lifting for labeling issues and PRs can be automated with GitHub Actions, but it is still required that labels for category/subcategory are applied by Maintainers manually. In fact, Users would not have the permissions to add labels on their own PRs, and the process cannot be automated any further since YAML syntax isn't currently supported in PR.
What is the strategy for adoption?
Due to the amount of existing issues (3k+ open / 4k+ closed), the new process will be applied only to new issues and PRs. This means that the new process can be fully effective only at the second major release after that it is activated.
The documentation at SIG-Release Process Docs will be updated in order to describe the new process.