- Git タグが作成されたらリリースを作成
- コミットがデフォルトブランチにマージされたときにリリースを作成します。
- カスタムスクリプトでのリリースメタデータの作成
- リリースを作成する際に複数のパイプラインをスキップします。
リリース CI/CD の例
GitLabのリリース機能は柔軟で、ワークフローに合わせて設定することができます。このページではCI/CDリリースジョブの例を紹介します。それぞれの例はCI/CDパイプラインでリリースを作成する方法を示しています。
Git タグが作成されたらリリースを作成
この CI/CD の例では、リリースは次のイベントのいずれかがきっかけとなります:
- Git タグをリポジトリにプッシュします。
- UI での Git タグの作成
Git タグを手動で作成し、その結果としてリリースを作成したい場合は、この方法を使うことができます。
.gitlab-ci.yml
ファイルの例を_抜粋_します:
-
rules
スタンザは、ジョブがパイプラインに追加されるタイミングを定義します。 - Git タグはリリースの名前と説明に使われます。
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created
script:
- echo "running release_job"
release: # See https://docs.gitlab.com/ee/ci/yaml/#release for available properties
tag_name: '$CI_COMMIT_TAG'
description: '$CI_COMMIT_TAG'
コミットがデフォルトブランチにマージされたときにリリースを作成します。
この CI/CD の例では、デフォルトブランチにコミットをマージしたときにリリースが発生します。リリースのワークフローでタグを手動で作成しない場合に、この方法を使うことができます。
.gitlab-ci.yml
ファイルの例を_抜粋_します:
- Git タグ、説明、参照はパイプラインで自動的に作成されます。
- 手動でタグを作成した場合、
release_job
ジョブは実行されません。
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_COMMIT_TAG
when: never # Do not run this job when a tag is created manually
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
script:
- echo "running release_job for $TAG"
release: # See https://docs.gitlab.com/ee/ci/yaml/#release for available properties
tag_name: 'v0.$CI_PIPELINE_IID' # The version is incremented per pipeline.
description: 'v0.$CI_PIPELINE_IID'
ref: '$CI_COMMIT_SHA' # The tag is created from the pipeline SHA.
カスタムスクリプトでのリリースメタデータの作成
このCI/CDの例では、リリースの準備は柔軟性を高めるために別々のジョブに分割されています:
-
prepare_job
ジョブはリリースのメタデータを生成します。ジョブの実行には、カスタムイメージを含む任意のイメージを使用できます。生成されたメタデータは変数ファイルvariables.env
に格納されます。このメタデータはダウンストリームジョブに渡されます。 -
release_job
は変数ファイルの内容を使い、変数ファイルで渡されたメタデータを使ってリリースを作成します。このジョブにはリリースCLIが含まれているため、registry.gitlab.com/gitlab-org/release-cli:latest
イメージを使用する必要があります。
prepare_job:
stage: prepare # This stage must run before the release stage
rules:
- if: $CI_COMMIT_TAG
when: never # Do not run this job when a tag is created manually
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
script:
- echo "EXTRA_DESCRIPTION=some message" >> variables.env # Generate the EXTRA_DESCRIPTION and TAG environment variables
- echo "TAG=v$(cat VERSION)" >> variables.env # and append to the variables.env file
artifacts:
reports:
dotenv: variables.env # Use artifacts:reports:dotenv to expose the variables to other jobs
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
needs:
- job: prepare_job
artifacts: true
rules:
- if: $CI_COMMIT_TAG
when: never # Do not run this job when a tag is created manually
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
script:
- echo "running release_job for $TAG"
release:
name: 'Release $TAG'
description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION and the $TAG
tag_name: '$TAG' # variables must be defined elsewhere
ref: '$CI_COMMIT_SHA' # in the pipeline. For example, in the
milestones: # prepare_job
- 'm1'
- 'm2'
- 'm3'
released_at: '2020-07-15T08:00:00Z' # Optional, is auto generated if not defined, or can use a variable.
assets:
links:
- name: 'asset1'
url: 'https://example.com/assets/1'
- name: 'asset2'
url: 'https://example.com/assets/2'
filepath: '/pretty/url/1' # optional
link_type: 'other' # optional
リリースを作成する際に複数のパイプラインをスキップします。
CI/CDジョブを使ってリリースを作成すると、関連するタグがまだ存在しない場合、複数のパイプラインがトリガーされる可能性があります。これがどのように起こるかを理解するために、以下のワークフローを考えてみましょう:
-
まずタグ、次にリリース:
- タグはUIまたはプッシュによって作成されます。
- タグパイプラインがトリガーされ、
release
ジョブが実行されます。 - リリースが作成されます。
-
リリースが先、タグが後:
- デフォルトブランチにコミットがプッシュまたはマージされると、パイプラインが起動します。パイプラインは
release
ジョブを実行します。 - リリースが作成されます。
- タグが作成されます。
- タグのパイプラインが起動します。パイプラインは
release
ジョブも実行します。
- デフォルトブランチにコミットがプッシュまたはマージされると、パイプラインが起動します。パイプラインは
2番目のワークフローでは、release
ジョブが複数のパイプラインで実行されます。これを防ぐには、workflow:rules
キーワード を使用して、リリースジョブをタグパイプラインで実行するかどうかを決定します:
release_job:
rules:
- if: $CI_COMMIT_TAG
when: never # Do not run this job in a tag pipeline
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
script:
- echo "Create release"
release:
name: 'My awesome release'
tag_name: '$CI_COMMIT_TAG'