リリース CI/CD の例

GitLabのリリース機能は柔軟で、ワークフローに合わせて設定することができます。このページではCI/CDリリースジョブの例を紹介します。それぞれの例はCI/CDパイプラインでリリースを作成する方法を示しています。

Git タグが作成されたらリリースを作成

この CI/CD の例では、リリースは次のイベントのいずれかがきっかけとなります:

  • Git タグをリポジトリにプッシュします。
  • UI での Git タグの作成

Git タグを手動で作成し、その結果としてリリースを作成したい場合は、この方法を使うことができます。

note
UI で 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.
note
before_script またはscript で設定された環境変数は、同じジョブでは展開できません。変数を展開できるようにする可能性についての詳細はこちらをご覧ください。

カスタムスクリプトでのリリースメタデータの作成

この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ジョブを使ってリリースを作成すると、関連するタグがまだ存在しない場合、複数のパイプラインがトリガーされる可能性があります。これがどのように起こるかを理解するために、以下のワークフローを考えてみましょう:

  • まずタグ、次にリリース:

    1. タグはUIまたはプッシュによって作成されます。
    2. タグパイプラインがトリガーされ、release ジョブが実行されます。
    3. リリースが作成されます。
  • リリースが先、タグが後:

    1. デフォルトブランチにコミットがプッシュまたはマージされると、パイプラインが起動します。パイプラインはrelease ジョブを実行します。
    2. リリースが作成されます。
    3. タグが作成されます。
    4. タグのパイプラインが起動します。パイプラインは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'