:sourcedir: ../../../pipelines

ifndef::imagesdir[]
:imagesdir: ../../images
endif::[]

= update-version-pipeline

This pipeline provides the jobs to increase the version, create a new tag and updates the changed files (version) the repository.

It can be extended to push a docker image to a docker registry.

== Setup

This pipeline should be included as a child-pipeline in your gitlab-ci pipeline.
You then can add an individual release job for each kind of version bump.

NOTE: You only need the variable `PARENT_PIPELINE_ID` , if you use an https://docs.gitlab.com/ee/ci/yaml/README.html#artifact-downloads-to-child-pipelines[artifact of you parent-pipeline in your child pipeline]

In your gitlab-ci.yml include the following

.gitlab-ci.yml
[source, yaml]
----
stages:
  - release

include:
  - project: 'gilden/ci/gitlab-ci-templates'
    ref: 'master'
    file:
    - 'release-template.gitlab-ci.yml'

a.major-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "major"

b.minor-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "minor"

c.patch-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "patch"

d.prerelease-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "prerelease"

e.build-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "build"

----

Create a child-pipeline file called `release.gitlab-ci.yml` and include the following:

.release.gitlab-ci.yml
[source, yaml]
----
stages:
  - set-version
  - push-tag-and-version
  - release

include:
  - project: 'gilden/ci/gitlab-ci-templates'
    ref: 'master'
    file:
    - 'pipelines/update-version-pipeline.gitlab-ci.yml'
    - 'push-image.yml'

# This is optional
push-docker-image:
  extends: .publish-image-kaniko
  stage: release
  # You only need NEED if you use a artifact from your parent pipeline to build the image
  needs:
    - pipeline: $PARENT_PIPELINE_ID
      job: Build
    - job: increase-version
    - job: push-tag-and-version
  rules:
    - when: always
  before_script:
    - "[ -f ./version ] && export LATEST_VERSION=$(cat ./version)"
    - export PARSED_VERSION=$(echo $LATEST_VERSION | sed -r 's/\+/_/g') # Replace + sign since this is not valid in a docker tag
    - export IMAGE_NAME=$CI_REGISTRY_IMAGE:$PARSED_VERSION
----

You pipeline then looks like the following:

.Release Pipeline
image::Release-Docker-Image-Pipeline.png[]

== Pipeline

.update-version-pipeline
[source, yaml]
----
include::{sourcedir}/update-version-pipeline.gitlab-ci.yml[]
----

== Usage with release branches

The `update version template` can be used to create a pipeline which supports releasing of artifacts from a release branch instead of the master branch. The https://gitlab.exxcellent.de/gilden/ci/exxcellent-increase-version-tool[exxcellent-versioning-tool] takes care of creating the next reasonable version numbers.

If you want to realise this topic you can use the template the following way:

.gitlab-ci.yml
[source, yaml]
----
stages:
  - release

include:
  - project: 'gilden/ci/gitlab-ci-templates'
    ref: 'master'
    file:
    - 'release-template.gitlab-ci.yml'

# Creates next major prerelease on master (e.g.: 2.0.0-rc.1 --> 3.0.0-rc.1)
a.major-prerelease:
  extends: .release-template
  variables:
    BUMP_VERSION: "major prerelease"
    MODE: "bump"

# Creates next minor prerelease on master (e.g.: 2.0.0-rc.1 --> 2.1.0-rc.1)
b.minor-prerelease:
  extends: .release-template
  variables:
    BUMP_VERSION: "minor prerelease"
    MODE: "bump"

# Creates release on release branch (e.g.: 2.0.0-rc.1 --> 2.0.0)
a.create-release:
  extends: .release-template
  variables:
    BUMP_VERSION: "patch"
    MODE: "next_version"
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /^release/
      when: manual
    - when: never

# Creates next prerelease on release branch (e.g.: 2.0.0 --> 2.0.1-rc.1 or 2.0.0-rc.1 --> 2.0.1-rc.2)
b.create-prerelease:
  extends: .release-template
  variables:
    BUMP_VERSION: "prerelease"
    MODE: "next_version"
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /^release/
      when: manual
    - when: never

----

.release.gitlab-ci.yml
[source, yaml]
----
stages:
  - set-version
  - push-tag-and-version
  - release

include:
  - project: 'gilden/ci/gitlab-ci-templates'
    ref: 'master'
    file:
    - 'pipelines/update-version-pipeline.gitlab-ci.yml'
    - 'push-image.yml'

# This is optional
push-docker-image:
  extends: .publish-image-kaniko
  stage: release
  # You only need NEED if you use a artifact from your parent pipeline to build the image
  needs:
    - pipeline: $PARENT_PIPELINE_ID
      job: Build
    - job: increase-version
    - job: push-tag-and-version
  rules:
    - when: always
  before_script:
    - "[ -f ./version ] && export LATEST_VERSION=$(cat ./version)"
    - export PARSED_VERSION=$(echo $LATEST_VERSION | sed -r 's/\+/_/g') # Replace + sign since this is not valid in a docker tag
    - export IMAGE_NAME=$CI_REGISTRY_IMAGE:$PARSED_VERSION
----

More information on this topic and a more detailed instructions can be found in our https://gitlab.exxcellent.de/gilden/ci/exxcellent-branching-template[exxcellent-branching-template].


