You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 78 Next »

DRAFT FOR REVIEW (please use comments on the page - when selecting text the comment button will appear)

This section gives the overview of the handling of API versions throughout the release management process.

The Release Management process is based on API versions and their associated release assets. It uses

  • work-in-progress API version is used during the development of an the API. This versions is not considered as release and is not usable by API consumers.
  • initial or alpha (-alpha.m) API versions (with version extensions) are used for CAMARA internal API development purposes
  • release-candidate (-rc.n) API versions (with version extensions) are used for CAMARA internal API release management purposes
  • public-release API versions are used for API versions that are part of a meta-release. These API versions only have API version number x.y.z (semver 2.0), no version extension.
  • An API version release is identified by putting an API version tag on the main or on a release branch (the latter in case of changes to a public-released API).
  • An API release consists in creating the related set of API version assets and delivering them in an API version release package.
  • Note 1: People are free to use initial, alpha or release-candidate API versions available in the CAMARA GitHub at their own risk.
  • Note 2: API families are not versioned, nor release-managed. Only API versions are release-managed.

The following sections provide the definitions and the description of the release management processes, and illustrates by examples.

The rest of the text in this section can be removed once the proposal is agreed.

It consolidates inputs from 

This page was discussed on the RM call of 2024-03-26. Feedback was:

  • alpha "-alpha.m" API version shall not be considered as a pre-release, but as not-released.
  • release-candidate "-rc.n" extensions
  • these extension only internally in CAMARA for release management, but not in externally released APIs, which should only have semver numbers.
  • API implementers are recommended to start implementation of an API with the first release-candidate API version in order to give feedback on the API definition. The API definition may change following API implementation feedback on the release-candidate, and result in an updated release-candidate.
  • Only fully tested release-candidate API versions can become part of a meta-release.

This page was discussed on the RM call of 2024-04-02:

  • Feed back on this page was discussed and partially answered. Further discussions on wiki for resolution next week.


Table of Contents

Definitions

API version

The API version is defined in the "version" field of the OAS definition of an API. Its content must follow Semantic Versioning 2.0.0 | Semantic Versioning (semver.org).

An API version has the format:  x.y.z  where x, y and z are numbers corresponding to MAJOR, MINOR and PATCH releases.

The following bullets are extracted of the semver 2.0 specification (and links to the corresponding spec item):

  • Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable. https://semver.org/#spec-item-4
  • Version 1.0.0 defines the public API. The way in which the version number is incremented after this release is dependent on this public API and how it changes. https://semver.org/#spec-item-5
    • Patch version Z (x.y.Z | x > 0) MUST be incremented if only backward compatible bug fixes are introduced. A bug fix is defined as an internal change that fixes incorrect behavior. https://semver.org/#spec-item-6

    • Minor version Y (x.Y.z | x > 0) MUST be incremented if new, backward compatible functionality is introduced to the public API. It MUST be incremented if any public API functionality is marked as deprecated. It MAY be incremented if substantial new functionality or improvements are introduced within the private code. It MAY include patch level changes. Patch version MUST be reset to 0 when minor version is incremented. 

    • Major version X (X.y.z | X > 0) MUST be incremented if any backward incompatible changes are introduced to the public API. It MAY also include minor and patch level changes. Patch and minor versions MUST be reset to 0 when major version is incremented.

Precedence example:  1.0.0 < 2.0.0 < 2.1.0 < 2.1.1 < 3.0.0.

The CAMARA API guidelines describe the applicable versioning strategy. NOTE: if this proposal is accepted, some updates of the guidelines may be needed.

API version extensions 

During the API development and release preparation, alpha (-alpha) or release-candidate (-rc) extensions shall be used to identify intermediate versions of an API.  

The notions of alpha and release-candidate API versions, and their related API version extensions, are INTERNAL to the CAMARA project and used only for the API development and release management process.

The API version extension is added to the "version" field of the OAS definition of an API, as well as to the URL (see below). Its content must follow the here described syntax and semantics.

The following API version extensions shall be used in the API version:

  • alpha API versions: -alpha.m
  • release-candidate API versions: -rc.n
  • no extension - this is allowed only for initial API versions 0.y.z (x=0)

Extensions are post-fixed to the API version numbers and separated from it by a hyphen "-". m and n are numbers.

All extensions must have a number (so just "-alpha" or "-rc" is not allowed and should be "-alpha.1" or "-rc.1")

Precedence example: 1.0.0 < 1.1.0-alpha.1 < 1.1.0-alpha.2 < 1.1.0-rc.1 < 1.1.0-rc.2 < 1.1.0 (public-release)

NOTE: a public-release API version shall have no extension in the API version filed of the OAS definition file, only the major.minor.patch version number as described in the previous section.

API version in URL

The API guidelines contain the following approach for defining the API endpoint URL:

servers:
  - url: "{apiRoot}/qod/v2"
    variables:
      apiRoot:
        default: http://localhost:9091
        description: API root

The apiRoot is to be adapted by the implementer of the API endpoint (the API provider).

Once a public-release API version is created and published as part of a meta-release, the API version in the URL of the public-release API version shall ONLY contain the MAJOR digit of the API version, e.g. "v2" in the above example.

For alpha and release-candidate API versions, the API version extension shall be included in the URL, but without any hyphens or dots.

Example: in the URL of an alpha API version 2.y.z-alpha.1, the version in the URL is v2alpha1.

Exception: For initial API versions 0.y.z, the full version 0.y.z may be include in the URL, e.g. v0.y.z, to simplify testing of API implementations during API development. In this exception case the dot (".") is kept for readability reasons. See initial API version section below for exception examples.

API name

The API name used in this document is the segment in the url field in the OAS definition file before the segment holding the API version.

Example: for the above url: "{apiRoot}/qod/v2", the API name is qod.

initial API version

  • Initial API versions only exist for new APIs. They are API versions with x = 0 (API versions 0.y.z, with or without version extension)
  • An initial API version may exist for several minor version numbers without extensions, but should at some point mature to become an initial alpha API version: api-0.y.z-alpha.1
  • During initial API version development, the API version in the URL shall include the full version number v0.y.z (with dots) to enable testing during rapid development. The guideline is that the y number is increased with breaking changes, the z number is increased with non-breaking changes (see also the exception below).
  • Exception: for initial API versions:  

    • A breaking change results in an API version change from 0.y.z-extension.n to an API version: 0.y+1.0. Example: 0.9.0-alpha.m or 0.9.0-rc.n → 0.10.0

    • A non-breaking change results in an API version change from 0.y.z-extension.n to an API version. 0.y.z+1. Example: 0.9.0-alpha.m or 0.9.0-rc.n → 0.9.1
    • After this, -alpha.m and -rc.n extensions can again be applied throughout the API version development.
  • Once a first public-release API version x.y.z has been created (x > 0), no further initial API versions (x = 0) are allowed.

alpha (alpha) API version

  • An alpha API version (extension  alpha.m) is an intermediate API version with changes with respect to a previous API version.
  • The purpose of an -alpha API version is to support rapid development of an API and testing of its implementation for feedback purposes.
  • An alpha API version provides the relevant alpha items of the readiness checklist.
  • An alpha API version cannot be part of a CAMARA meta-release. 
  • It needs to go through the below API pre-release and release steps first.

release-candidate (rc) API version

  • A release-candidate API version (extension -rc.n) is a pre-release version of an API which is stabilized and intended to become the next public-release API version.
  • The purpose of a pre-release API version is to provide a stable version for implementation and API testing. It shall be used to create the test results and to show it meets the acceptance criteria.
  • A release-candidate API version provides the relevant rc items of the release checklist.
  • A release-candidate API version can only be part of a CAMARA meta-release after approval by the Release Management team.
  • A release-candidate API version proposed for a meta-release needs to be approved by the Release Management team.
  • For a release-candidate API version to be approved for public-release as part of a given meta-release, it needs to provide all the public-release items on the release checklist.
  • Once the release-candidate API version is approved by the Release Management team, the public-release API version is created by the API team for publication as part of the meta-release

public-release API version

  • A public-release API version (x.y.z with x>0) is a major/minor/patch stable version of an API.
  • A public-release API version is published as part of a CAMARA meta-release.
  • A public-release API version provides the relevant public items of the release checklist and meets the acceptance criteria of a meta-release.
  • A next public-release API version is introduced if there are updates to the API definition (major/minor/patch).
  • The update of a public-release API version needs to be carefully announced and discussed with API consumers.

work in progress API version

  • A work in progress API version, with "wip" instead of x.y.z, may exist for an API during the time that one or more Pull Requests (PRs) are committed into the branch of a given API version.
  • The purpose of a work-in-progress API version is to indicate an unstable version due to one or more PRs being committed, possibly resulting in temporary inconsistencies.
  • Between different PR commits, the API version remains "wip".
  • After or with the last PR commit, the next API version is prepared.
  • The maintainers of the API decide on the next API version and the corresponding release assets are created for the next API version.

pre-release

The term pre-release can be used to refer to an alpha API version or a release-candidate API version.

NOTE: all pre-release API versions are publicly available and can be used, but changes may happen to such API versions without notice.

release

The term release can be used to refer to either a pre-release or a public-release version of an API.

meta-release

A meta-release is a set of public-release API versions made available at a given point in time (September and March).

All API versions of a given meta-release shall be aligned to the Commonalities and Identity and Consent Management releases that are part of that same meta-release.

API version tag

An API version tag is a GitHub tag placed on the main or a selected branch to allow locating the corresponding API version in the repository.

API version release package

An API version release package is created using the GitHub release mechanism. It consists in a zip file that has a snapshot of the API Sub-project repository with the content located using the API version's tag.

Releasing API versions

API versioning throughout the release process

During the development, release preparation and release of an API version,

  • multiple intermediate pre-releases for initial, alpha or release-candidate API versions may be created, and
  • a final public-release API version is created.

The following picture gives an overview of the API versions that an API can go through from inception to release.

The following section describe the details on naming, release assets, and the steps to produce a public-release API version as part of a meta-release.

API version assets & naming conventions

For a given API version, its release consists in creating the set of API version assets with naming as indicated in the below table.

API version typeAPI version (OAS file)API version extension (OAS file)API version in URL (OAS file)

API version tag (GitHub)

(api = API name)

API version release package (name = API version tag) (GitHub)

API version release package tag
initial (x=0)0.y.z

 none

-alpha.m

-rc.n

v0.y.z (exception)

v0alpham

v0rcn

api-0.y.z

api-0.y.z-alpha.m

api-0.y.z-rc.n

optional

optional [ pre-release ]
alphax.y.z-alpha.mvxalphamapi-x.y.z-alpha.m

optional

optional [ pre-release ] 
release-candidate x.y.z-rc.nvxrcnapi-x.y.z-rc.nmandatorypre-release
public-releasex.y.znonevxapi-x.y.zmandatorylatest
work-in-progresswipN/AvwipN/AN/AN/A

In the above API release asset table, the column headers mean the following:

  • the API version (OAS file) is the version field of the API OAS definition file
  • the API version extension (OAS file) is the extension that can be added to the version field of the API OAS definition file
  • the API version in URL (OAS file) is the a "v" followed by the API major version number placed in the URL field of the API OAS definition file
  • the API version tag is the GitHub tag put on the main or update branch allowing to retrieve the API version, e.g. api-x.y.z, with extension as applicable
  • the API version release package, tagged "pre-release" or "latest", containing the zipped version of the whole API Sub-project repository.

API version changes

To create an API version (pre-)release, the API (pre-)release assets need to be created with naming rules as indicated in the below table.

This is illustrated in the following figure:

The following rules shall apply: 

  • With the exception of initial API versions, all pre-release API versions must have an API extension.
  • An initial or alpha API version may have an API version release package, which must have the "pre-release" tag
  • A release-candidate and public-release API version must have an API version release package
  • Only the latest release packages of an API version may have the tag "latest".

Special case: initial API versions (0.y.z)

A newly introduced API is in the main branch and has API version "wip", until the first API version is created: api-0.1.0.

While public-release API versions follow the semver standard, initial API versioning uses the version numbers exceptionally as follows:

  • the major version number remains 0 in all cases
  • the minor version numbers is used for breaking changes
  • the patch version number is used for non-breaking changes
  • version extensions can be used but a release candidate API version may go back to an alpha API version or to an initial API version without any extension. 

The below table provides guidelines for the initial API versioning exceptions. The semver numbering sequencing does apply for initial API versions. Examples: 0.1.0 < 0.1.1< 0.2.0 < 0.2.0-alpha.m < 0.2.0-rc.n < 0.2.1 < 0.3.0, etc.

API versionnext API version for breaking changenext API version for non-breaking change
api-0.y.z

api-0.y+1.0

api-0.y.z+1

api-0.y.z–alpha.m

api-0.y+1.0

api-0.y.z-alpha.m+1 / api-0.y.z+1

api-0.y.z-rc.n

api-0.y+1.0

api-0.y.z-rc.n+1 / api-0.y.z+1

In the above table, the choice between 2 proposed next API version options is done by the API maintainers based on the estimated stability of the API with respect to the introduced changes. 

In addition, the normal API version evolution through -alpha.m and -rc.n extensions is applicable throughout the API version development.

Once an initial API version 0.y.z is deemed sufficiently stable, a first alpha API version api-0.y.z-alpha.1 shall be created.

From this point onward, the below API (pre-)release steps apply and further alpha and release-candidate API versions with their corresponding API release assets as per the above table shall be created as needed.

The first public-release API version 1.0.0 is created from the last agreed and accepted API version api-0.x.y-rc.n

Developing an API

During the development of an API several contributions can be made by different people from their private forks or by maintainers of eth API on a development branch.

The contributions are proposed through Pull Request (PRs) and committed to the target branch: main in most cases. 

Exception is where changes are made to a public-release API, in which case a maintenance branch is opened to which contribution through PRs will be committed and on which new API version tags will be put.

While multiple PRs are being committed to the target branch, unstable API versions may exist. To avoid that people use such unstable versions, the following guileing shall be applied:

  • The first PR commit will ensure that the API will get the version "wip" instead of x.y.z. 
  • All subsequent PR commits shall maintain that same API version as "wip"
  • Once all PR commits are done and stability, usability and consistency of the updated API is agreed on, the maintainers create the next API version tag on the ytaret branch.
  • This new version can now be used by API consumers who want to test the new pre-release version.

The following figure illustrates the work-in-progress version of the API created in this process.

Question tdg: do we need wip.1 ... wip.n ? I would not go there but ... 

Here are explanations on the above figure:

  • Vx.y.z:  any API version (with or without extension) to which changes are to be applied through PR(s).
  • Vnext: the tag of the next version with respect to Vx.y.z after the PRs have been committed and API stability is reached

This work-in-progress process can be applied to any Vx.y.z as needed for patches, updates or other evolutions of APIs

  • The first/all PRs shall set the version field of the API OAS definition file(s) to “wip.
  • This wip versions shall remain until the project maintainers decide to tag the API as Vnext
  • If the Vx.y.z has an associated release package, a release packages shall be created for Vnext.
  • Only maintainers can create development branches.
  • Other developers should fork the repo and do PRs from there.
  • All PRs shall be approved by maintainers before being committed.
  • Once all PRs are merged, the last PR shall updated the version field of the API OAS definition file(s) to Vnext
  • The Vnext release tag shall be applied to the branch.

Preparing an API (pre-)release

An API Sub-project can create as many initial or alpha API versions as they want during API development in preparation for the release.

For API versions with x>0, the next API version number is defined and does NOT change during API development and release preparation. Only the API version extensions and their numbers may change. 

To prepare the release of an API version, one or more release-candidate API versions MUST be created as follows:

  • At the M3 release milestone: when the API is agreed stable for release by the API Sub-project.
  • At the M4 release milestone: the final release-candidate API version is delivered for meta-release approval.

Releasing an API

A public-release API version is created when the release-candidate API version is approved for a meta-release.

  • At the M5 release milestone, the final API version (without any extension) is created with its release package, and included in the meta-release.
  • Inclusion in a meta release is done by adding the required information for the API version on the meta-release page.

Updating an API

Updates to a public-release API version need to be carefully planned.

To manage updates of API versions, the semver 2.0 versioning applies to the API version number as follows:

  • changes in the major number when creating non-backward compatible / breaking changes to the API
  • changes in the minor number when creating backward compatible changes to the API
  • changes in the patch number when correcting an error of the API

During the development of an API version update, all pre-release API versions need to get a version extension so its release can be managed properly.

Example for a backward-compatible update of a public-release API version 1.0.0, resulting in API version 1.1.0:

  • Develop the 1.1.0 update on the main branch
  • Once sufficiently stable, create a new API version api-1.1.0-alpha.1 by tagging the main branch
  • Several intermediate alpha branches may be created, with or without release packages
  • Then one or more intermediate release-candidate API versions (rc branches + release packages) may be created (see example table below).
  • The last release-candidate API version will be proposed for meta-release. 
  • After meta-release approval, create the api-1.1.0 branch and release package ("latest") for the new public-release API version 1.1.0.

Meta-release approval for an API version

  • To be approved for meta release, the API version must provide all the public items of the release checklist and meet the meta release acceptance criteria.
  • The API Sub-project shall announce ther intention for public-release API vesion by documenting the references to the relevant release-candidate API version on the meta release page.
  • After check by the release management team, approval is documents there.
  • Once approved the API Sub-project shall create the public-release API version and its API version assets.
  • Finally the API sub-project shall update the meta-release page with the reference to the public-release API version.

API family

The notion of API family will not be managed as part of release management. CAMARA releases only consider API versions.

It is recommended to have one API per API sub-project to facilitate the release management and versioning of APIs.

If multiple API are managed in one API Sub-project, each API file shall have its own folder, such that release packages can be created with a focus on a specific API. The API name and the API version of this API shall be used in the naming of the API version tag and API version release package. However, as the release package will also include all other APIs of the Sub-project, this may lead to confusion.

An API Sub-project may also decided to release all APIs in the same API family always at the same time with the same API version. In this case,

  • all API files in the release must have the same API version.
  • instead of the API name, the API Sub-project name shall be used in the API version tag and the API version release package name.

If later on one API of the API family requires a separate evolution with its own version number, then this API shall be put in its own API Sub-project.

The grouping of APIs into families or other groupings, e.g. by related working groups, can be done easily using a CAMARA wiki page.

This will reduce the number of meetings and reporting load with the increasing number of APIs, and facilitate moving APIs from one family or group to another, or combining APIs from multiple families into into into family.

See also Herbert's proposal here: Proposal to establish API Families as Working Groups across API Sub Projects · Issue #7 · camaraproject/ReleaseManagement (github.com)

API release checklist

NOTE: This proposal can be fed back into Commonalities project as needed or moved here.

The following table identifies the items that need to be provided for an API version for a particular release.

It is intended as a checklist for the API sub-projects to prepare an API version release.

Nr

API release item

alpha

release-candidate

public-release

1

API definition

Y

Y

Y

2

Test results proving API alignment with Commonalities and ICM guidelines

Y

Y

Y

3

API documentation

Y

Y

Y

4

User stories

Y

Y

Y

5

API test cases and documentation

N

Y

Y

6

Test results (API test cases passed)

N

Y

Y

7

API reference implementation

N

N

N

8

Tested in at least 2 operator implementations

N

N

N

In addition the following are the API version assets that need to be provided to support the release of an API version:

Nr

API version asset

alpha

release-candidate

public-release

8

API version tag

Y

Y

Y

9

API version release package with release notes & tag

optional

Y

Y


Examples

The following are examples of the API release asset naming for the various API versions throughout the API version's lifecycle. 

API version 0.y.z (initial API development and first release)

release milestoneAPI version (OAS file)API version extension (OAS file)API version in URL (OAS file)

API version tag (GitHub)

(api = API name)

API version release package (name = API version tag) (GitHub)

API version release package tag
New API introductionwip
vwipnonenone
API devt.0.1.0
v0.1.0api-v0.1.0optionalpre-release
API devt. major change0.2.0
v0.2.0api-v0.2.0optionalpre-release
API devt. minor change0.2.1
v0.2.1api-v0.2.1optionalpre-release
API devt. minor change0.2.1-alpha.1v0.2.1alpha1api-v0.2.1-alpha.1optionalpre-release
API devt. major change0.3.0
v0.3.0api-0.3.0optionalpre-release
....





API devt.0.y.z-alpha.2v0.y.zalpha2api-0.y.0-alpha.2mandatorypre(release
M30.y.z-rc.1v0.y.zrc1api-0.y.z-rc.1mandatorypre-release
M40.y.z-rc.2v0.y.0rc2api-0.y.z-rc.2mandatorypre-release
M51.0.0
v1api-1.0.0mandatorylatest

API version x.y.z (x>0) (public-release API updates)

The following table illustrates the usage of versions and version extensions throughout the API lifecycle for the 3 different types of update: minor, major, patch.

Minor update of API version

release milestoneAPI version (OAS file)API version extension (OAS file)API version in URL (OAS file)

API version tag (GitHub)

(api = API name)

API version release package (name = API version tag) (GitHub)

API version release package tag
API devt.1.1.0-alpha.1v1alpha1api-1.1.0-alpha.1optionalpre-release
API devt.1.1.0-alpha.2v1alpha2api-1.1.0-alpha.2mandatorypre-release
M31.1.0-rc.1v1rc1api-1.1.0-rc.1mandatorypre-release
M41.1.0-rc.2v1rc2api-1.1.0-rc.2mandatorypre-release
M51.1.0
v1api-1.1.0mandatorylatest

  

Patch update of API version

release milestoneAPI version (OAS file)API version extension (OAS file)API version in URL (OAS file)

API version tag (GitHub)

(api = API name)

API version release package (name = API version tag) (GitHub)

API version release package tag
API devt.1.1.1-alpha.1v1alpha1api-1.1.1-alpha.1optionalpre-release
API devt.1.1.1-alpha.2v1alpha2api-1.1.1-alpha.2mandatorypre-release
M31.1.1-rc.1v1rc1api-1.1.1-rc.1mandatorypre-release
M41.1.1-rc.2v1rc2api-1.1.1-rc.2mandatorypre-release
M51.1.1
v1api-1.1.1mandatorylatest

  

Major update of API version

release milestoneAPI version (OAS file)API version extension (OAS file)API version in URL (OAS file)

API version tag (GitHub)

(api = API name)

API version release package (name = API version tag) (GitHub)

API version release package tag
API devt.2.0.0-alpha.1v2alpha1api-2.0.0-alpha.1optionalpre-release
API devt.2.0.0-alpha.2v2alpha2api-2.0.0-alpha.2mandatorypre-release
M32.0.0-rc.1v2rc1api-2.0.0-rc.1mandatorypre-release
M42.0.0-rc.2v2rc2api-2.0.0-rc.2mandatorypre-release
M52.0.0
v2api-2.0.0mandatorylatest

  

  • No labels