Lots of changes for draft 3

- Master branch is no longer required to always be release/production
  ready, only releases are truely stable, but it's highly recommended
  to try and keep the master branch as near to release/production
  ready as possible.
- Various mentions of test suites should pass before doing X.
- Restructured requirements into distinct sections making it easier to
  read and reason about.
This commit is contained in:
2017-07-02 18:36:09 +01:00
parent 71e5a7aae8
commit 6016742c2d

View File

@@ -13,38 +13,22 @@ into account how a lot of open source projects use git.
Terminology:
- Master Branch - Should always be deployable/usable, is considered bleeding
- Master Branch - Must always have passing tests, is considered bleeding
edge, and must be named `master`.
- Change Branches - Any branch that introduces changes (new feature, bug fix,
etc), should be created off of the master branch, and must have a descriptive
name.
- Maintenance Branches - Used to maintain old versions, and should follow a
`stable-X.Y` naming pattern, where `X` is MAJOR version and `Y` is MINOR
version.
- Pull Request - A means of requesting that a change branch is merged in to the
master branch, allowing others to review, discuss and approve the changes.
- Change Branches - Any branch that introduces changes like a new feature, a bug
fix, etc.
- Maintenance Branches - Used for maintaining old versions and releasing PATCH
updates when the master branch has moved on. Should follow a `stable-X.Y`
naming pattern, where `X` is MAJOR version and `Y` is MINOR version.
- Merge Target - A branch that is the intended merge target for a change
branch. Typically the merge target will be the branch that a change branch was
created from.
- Pull Request - A means of requesting that a change branch is merged in to its
merge target, allowing others to review, discuss and approve the changes.
- Release - Consists of a version bump commit directly on the master branch, and
a git tag named according to the new version number placed on said commit.
Basics:
- The "master" branch should always be deployable/usable, while also considered
to be bleeding edge.
- New work must be done on a descriptively named change branch created off of
the master branch.
- Commit to the change branch locally, and regularly push your work to the same
named branch on the remote server.
- The change branch MUST be kept up to date with the master branch by rebasing
it on top of the remote master branch.
- When you need feedback, help, or think the branch is ready for merging, open a
pull request.
- After someone else has reviewed and signed off on the change, you can merge it
in to the master branch.
- New releases are created by committing a version bump commit directly to the
master branch, and then tagging that commit with the version.
- Maintenance branches are updated by cherry picking relevant changes if
possible, otherwise use a change branch created from the maintenance branch,
and have the pull request target the maintenance branch instead of the master
- Maintenance Release - Just like a regular release, except the version bump
commit and release tag are on a maintenance branch instead of the master
branch.
Git Common-Flow Specification (Common-Flow)
@@ -54,64 +38,110 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
1. A branch named "master" MUST exist, and it SHOULD be referred to as the
"master branch". The master branch MUST always be in a non-broken state, but
MUST be considered to be bleeding edge. That means the master branch MUST
always be in a good enough state that a new release can always be built from
master, or that master can always be safely deployed to production.
2. Changes MUST be performed on a separate branch that SHOULD be referred to as
a "change branch". All change branches SHOULD be created off of the master
branch, and they MUST have descriptive names. You SHOULD commit often
locally, and you SHOULD regularly push your work to the same named branch on
the remote server.
3. Change branches MUST be regularly updated with any changes on the master
branch. This MUST be done by rebasing the change branch on top of the remote
master branch ("git rebase origin/master"). To be clear you MUST NOT merge
the master branch into a change branch.
4. To merge a change branch back in to the master branch, you MUST open a "pull
request" (or equivalent) so others can review and approve your changes. A
change branch MUST only be merged in to the master branch when you and others
are certain that it is ready for release and/or deployment to production.
5. To get feedback, help, or generally just discuss a change branch with others,
you SHOULD also create a pull request and discuss the changes with others
there.
6. The project MUST have its version hard-coded somewhere in the code-base. It
is RECOMMENDED that this is done in a file called "VERSION" located in the
root of the project, and that it only contains the exact version string.
7. The version string SHOULD follow the Semantic Versioning (http://semver.org/)
format. Use of Semantic Versioning is OPTIONAL, but the version string MUST
NOT have a "v" prefix. For example "v2.11.4" is bad, and "2.11.4" is good.
8. To create a new release, you MUST create a "version bump" commit directly on
the master branch which changes the hard-coded version value of the
project. The version bump commit MUST have a lightweight git tag created on
it and named as the exact version string.
9. A version bump commit MUST have a commit message title of "Bump version to
VERSION". For example, if the new version string is "2.11.4", the first line
of the commit message MUST read: "Bump version to 2.11.4"
10. The release tag on the version bump commit MUST be named exactly the same as
the version string. And its name MUST NOT have a "v" prefix.
11. OPTIONALLY you can create the release tag as a annotated tag where the
annotation message is the changelog since the last release.
12. If a change branch which has been merged in to master is found to have a bug
in it, the bug fix work MUST be done as a new separate change branch and
MUST follow the same workflow as any other change branch.
13. If a change branch is wrongfully merged in to master, or for any other
reason the merge must be undone, you MUST undo the merge by reverting the
merge commit self. Effectively creating a new commit that reverses all the
relevant changes. The master branch MUST NOT under any circumstance be
rewound to a earlier commit.
14. Maintenance branches are used for managing new releases for older
versions. Typically this is used to provide security updates for older
versions when the master branch has moved on. A maintenance branch SHOULD
follow a "stable-X.Y" naming pattern, where "X" is the MAJOR version and "Y"
is the minor version.
15. Updating a maintenance branch is done by cherry picking the relevant commits
if possible. If not possible it MUST be done via a change branch created off
of the maintenance branch, and reviewed through a pull request like any
other change request.
16. Creating a release from a maintenance branch is done the same way as a
normal release, except everything is done on the maintenance branch instead
of the master branch.
1. The Master Branch
1. A branch named "master" MUST exist and it MUST be referred to as the
"master branch".
2. The master branch MUST be considered bleeding edge.
3. The master branch MUST always be in a non-broken state with its test
suite passing.
4. The master branch SHOULD always be in a "as near as possible ready for
release/production" state to reduce the friction of creating a new
release.
2. Changes
1. Changes MUST be performed on a separate branch that SHOULD be referred to
as a "change branch". All change branches MUST have descriptive
names. You SHOULD commit often locally, and you SHOULD regularly push
your work to the same named branch on the remote server.
2. When a change branch is created, the branch that it is created from
SHOULD be referred to as the "source branch". Each change branch also
needs a designated "merge target branch", typically this will be the same
as the source branch.
3. Change branches MUST be regularly updated with any changes from their
source branch. This MUST be done by rebasing the change branch on top of
the source branch. To be clear you MUST NOT merge a source branch into a
change branch.
4. To merge a change branch into its merge target branch, you MUST open a
"pull request" (or equivalent) so others can review and approve your
changes.
5. A pull request MUST only be merged when the test suite is passing, and
you and others are happy with the change. This is especially important if
the merge target is the master branch.
6. To get feedback, help, or generally just discuss a change branch with
others, you SHOULD also create a pull request and discuss the changes
with others there.
3. Versioning
1. The project MUST have its version hard-coded somewhere in the
code-base. It is RECOMMENDED that this is done in a file called "VERSION"
located in the root of the project.
2. If you are using a "VERSION" file in the root of the project, this MUST
only contain the exact version string.
3. The version string SHOULD follow the Semantic Versioning
(http://semver.org/) format. Use of Semantic Versioning is OPTIONAL, but
the version string MUST NOT have a "v" prefix. For example "v2.11.4" is
bad, and "2.11.4" is good.
4. Releases
1. New releases SHOULD be created whenever the master branch has changed
enough since the last release that it is worthwhile to push those changes
out for wider use. It is RECOMMENDED to create new releases very often to
reduce the amount of change in each release.
2. Because the master branch is considered bleeding edge, before a new
release is created, the state of the master branch MUST be confirmed to
be release ready by ensuring all test suites pass and relevant people
are confident in delivering a new release.
3. To create a new release, you MUST create a "version bump" commit directly
on the master branch which changes the hard-coded version value of the
project. The version bump commit MUST have a git tag created on it and
named as the exact version string.
4. A version bump commit MUST have a commit message title of "Bump version
to VERSION". For example, if the new version string is "2.11.4", the
first line of the commit message MUST read: "Bump version to 2.11.4"
5. The release tag on the version bump commit MUST be named exactly the same
as the version string. The tag name can OPTIONALLY be prefixed with
"v". For example the tag name can be either "2.11.4" or "v2.11.4".
6. It is RECOMMENDED that release tags are lightweight tags, but you can
OPTIONALLY use annotated tags if you want to include changelog
information in the release tag itself.
7. If you use annotated release tags, the first line of the annotation MUST
read "Release VERSION". For example for version "2.11.4" the first line
of the tag annotation would read "Release 2.11.4". The second line must
be blank, and the changelog MUST start on the third line.
5. Commit Messages
1. All commit messages SHOULD follow the Commit Guidelines and format from
the official git documentation: http://git-scm.com/book/ch5-2.html
6. Bug Fixes & Rollback
1. You MUST NOT under any circumstance force push to the master branch.
2. If a change branch which has been merged in to the master branch is found
to have a bug in it, the bug fix work MUST be done as a new separate
change branch and MUST follow the same workflow as any other change
branch.
3. If a change branch is wrongfully merged in to master, or for any other
reason the merge must be undone, you MUST undo the merge by reverting the
merge commit self. Effectively creating a new commit that reverses all
the relevant changes.
7. Maintenance Releases
1. Any branch that has a name starting with "stable-" SHOULD be referred to
as a "maintenance branch".
2. Maintenance branches are used for managing new releases of older
versions. Typically this is used to provide security updates for older
versions when the master branch has moved on to a point that a new
release for the old version cannot be made from the master branch.
3. A "maintenance release" is identical to a regular release, except the
version bump commit and the release tag are placed on the maintenance
branch instead of on the master branch.
3. A maintenance branch SHOULD follow a "stable-X.Y" naming pattern, where
"X" is the MAJOR version and "Y" is the minor version.
4. A maintenance branch MUST be created from the relevant release tag. For
example if there is a security fix for all 2.9.x releases, the latest of
which is "2.9.7", we create a new branch called "stable-2.9" off of the
"2.9.7" release tag. The security fix release will then end up being
version "2.9.8".
5. When working on a maintenance release, the relevant maintenance branch
MUST be thought of as the master branch for that maintenance work.
6. Changes in a maintenance branch SHOULD typically come from work being
done against the master branch. Meaning changes SHOULD only trickle
downwards from the master branch. If a change needs to trickle back up
into the master branch, that work should have happened against the master
branch in the first place.
About
-----