Release naming conventions

Last updated on
12 February 2024

Release branches and tags

While there are no naming restrictions for branch and tag names in Git itself, when you want to make a release available for use by the community on Drupal.org, your branch and tag name need to follow the conventions below. If you fail to do so, you will not be able to add a new release from your project page

Release branches

Release branches for modern Drupal projects follow the format {major}.x or {major}.{minor}.x. Drupal 8 and earlier used {API compatibility}-{major}.x. Examples are:

Branch name Description Packaged files
9.1.x 9.1.x-dev release (core) drupal-9.1.x-dev.tar.gz,
drupal-9.1.x-dev.zip
8.x-1.x 8.x-1.x-dev release (contrib) myproject-8.x-1.x-dev.tar.gz,
myproject-8.x-1.x-dev.zip
8.x-2.x 8.x-2.x-dev release (contrib) myproject-8.x-2.x-dev.tar.gz,
myproject-8.x-2.x-dev.zip
1.x 1.x-dev release (contrib) myproject-1.x-dev.tar.gz,
myproject-1.x-dev.zip
2.1.x 2.1.x-dev release (contrib) myproject-2.1.x-dev.tar.gz,
myproject-2.1.x-dev.zip

Release tags

Release tags for modern Drupal projects follow the format {major}.{minor}.{patch}. Drupal 8 and earlier used {API compatibility}-{major}.{minor}. Both formats can have a pre-release suffix, like {major}.{minor}.{patch}-(alpha|beta|rc){N}, see Stable releases and pre-releases below for details. Examples are:

Tag name Description Packaged files
9.0.0 9.0.0 release (core) drupal-9.0.0.tar.gz,
drupal-9.0.0.zip
8.x-2.0-alpha6 8.x-2.0-alpha6 release (contrib) myproject-8.x-2.0-alpha6.tar.gz,
myproject-8.x-2.0-alpha6.zip
9.0.0-beta1 9.0.0-beta1 release (core) drupal-9.0.0-beta1.tar.gz,
drupal-9.0.0-beta1.zip
8.x-2.3 8.x-2.3 release (contrib) myproject-8.x-2.3.tar.gz,
myproject-8.x-2.3.zip
1.0.0 1.0.0 release (contrib) myproject-1.0.0.tar.gz,
myproject-1.0.0.zip
1.0.0-beta1 1.0.0-beta1 release (contrib) myproject-1.0.0-beta1.tar.gz,
myproject-1.0.0-beta1.zip

Releases are packaged soon after a release is created, or a new commit is pushed to a dev release’s branch. Usually within 10 minutes, up to an hour delay can happen if the packaging queue is busy.

Both {major}.x and {major}.{minor}.x branches are supported for creating dev releases. However, tagged releases must have all 3 components, {major}.{minor}.{patch}.A tag for a stable release will consists solely of numbers and full stops, i.e. 1.1.0. Only stable releases will be prominently displayed on the module page.

For example, this allows you to use 1.x as HEAD for all releases in the 1.* series. Once you’ve made tagged releases in the 1.1.* series, if you are back-porting to 1.0.*, then you can also make the 1.0.x branch for those commits, if needed.

If you are new to Git and/or module and theme contribution, please see Creating a branch or tag in Git. If you are looking to publish your release, please view Creating a project release for more information.

Transitioning from 8.x-* to semantic versioning

Since Drupal 8, projects can be compatible with any range of Drupal core versions. So 8.x-* releases and releases using semantic versioning occupy the same space for version numbers. Put another way, a 8.x-1.0 release is effectively the same as 1.0.0

When your project switches to using semantic versioning, you must increment your major version. For example, if the latest release is 8.x-3.5, your next stable release will be 4.0.0

(The converse is also restricted, once 4.0.0 is released, you can’t release 8.x-4.0 or 8.x-5.0)

8.x-* projects can be compatible with Drupal 9, so you don’t need to switch right away if you aren’t ready to start a new major version release series.

Most versions of Drupal 8 are not compatible with semantic versioning. If your project supports Drupal 8.8.3 or lower, don’t switch to semantic versioning.

9.x-* and later releases can not be made. Since most releases made now are likely to be compatible with multiple versions of Drupal core, the API compatibility prefixes don’t make sense to keep. Use semantic versioning for any release only compatible with Drupal 9 or higher.

With semantic versioning, composer.json and core_version_requirement are used to define a release’s requirement for Drupal core.

Stable releases and pre-releases

Tags ending in -alpha, -beta, and -rc, followed by a number, are pre-releases. Read more about the distinctions between Alpha, Beta and RC. Tags which end in a number, without the -…N suffix, are stable releases.

All pre-release tags must end with a number. The first is numbered 1 (as in …-alpha1), the next 2 (as in …-alpha2), and so on. When you make a release with the next stability, reset the number - following the previous example, …-beta1 would be next.

For example, 8.x-1.0-rc1 is valid for making a release, but the following are NOT:

  • 8.x-1.0-release1 wrong word
  • 8.x-1.0-rc doesn’t end in a digit
  • 8.x-1.0-ALPHA1 uppercase

alpha: Most reported errors are resolved, but there may still be serious outstanding known issues, including security issues. Project is not thoroughly tested, so there may also be many unknown bugs. There is a README.txt/README.md that documents the project and its API (if any). The API and DB schema may be unstable, but all changes to these are reported in the release notes, and hook_update_N is implemented to preserve data through schema changes, but no other upgrade/update path. Not suitable for production sites. Target audience is developers who want to participate in testing, debugging and development of the project.

beta: All critical data loss and security bugs are resolved. If the module offers an API, it should be considered frozen, so that those using the API can start upgrading their projects. If it is an upgrade or update of a project, an upgrade/update path should be offered, and it should be possible for existing users to upgrade/update to the new version without loss of data. All documentation should be up to date. Target audience is developers who want to participate in testing, debugging and development of the project, and developers of other projects that interfaces the project. Not generally suitable for production sites, but may be used on some production sites if the site administrator knows the project well, and knows how to handle any outstanding issues.

rc: A release candidate should only be created when all reported critical bug type issues are fixed in the project's issue queue. This tag should only be used when the developer believes that the project is ready for use on a production site. There is no official best practice for how long a project should be a release candidate before creating a official .0 release, but it is suggested that it should be out for at least a month with status set to "needs review". If something (e.g. a new critical bug is reported) makes it necessary to create a new release during this period, a new release candidate should be created and this should remain for at least a month with status set to "needs review".

Feature branches

In a distributed version control system workflow, like Git, it’s common to spin off separate branches for features, bug fixes, and anything else you want to try out. You are free to name your branches whatever you like for your day-to-day work. awesome-new-feature, experimental-redesign, performance-bugfix are all acceptable branch names.

If you prefix a branch name with a Drupal.org issue number, like 1234-improve-situation, it will be associated with that issue.

Git’s default master branch should be avoided and no downloadable releases can be tied to that branch. Master branch cleanup information here. Use a release branch like 7.x-1.x, 8.x-1.x, or 1.x as your main development branch (see below).

Tags

Help improve this page

Page status: No known problems

You can: