: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. == Overview diagram [mermaid] .... graph TB .gitlab-ci.yml-->release-template.gitlab-ci.yml release-template.gitlab-ci.yml-- release-->release.gitlab-ci.yml release.gitlab-ci.yml-->pipelines/update-version-pipeline.gitlab-ci.yml release.gitlab-ci.yml-->container-publish.gitlab-ci.yml .gitlab-ci.yml--test-->container-scan.gitlab-ci.yml subgraph project .gitlab-ci.yml-->release.gitlab-ci.yml end subgraph Gitlab-CI-templates release-template.gitlab-ci.yml pipelines/update-version-pipeline.gitlab-ci.yml-->push-tag-and-version-template.gitlab-ci.yml pipelines/update-version-pipeline.gitlab-ci.yml-->set-version-template.gitlab-ci.yml set-version-template.gitlab-ci.yml-->exxcellent-increase-version-tool/increase-version container-publish.gitlab-ci.yml-->.publish-image-kaniko container-scan.gitlab-ci.yml end .... == 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].