릴리스 CI/CD 예시

GitLab 릴리스 기능은 유연하며 워크플로우에 맞게 구성할 수 있습니다. 이 페이지에는 CI/CD 릴리스 작업의 예시가 표시됩니다. 각 예시는 CI/CD 파이프라인에서 릴리스를 만드는 방법을 보여줍니다.

Git 태그가 생성될 때 릴리스 생성

이 CI/CD 예시에서 릴리스는 다음 중 하나의 이벤트로 트리거됩니다.

  • 리포지터리에 Git 태그를 푸시하는 경우
  • UI에서 Git 태그를 생성하는 경우

이 방법은 Git 태그를 매뉴얼으로 생성한 후 릴리스를 만들고자 하는 경우 사용할 수 있습니다.

참고: UI에서 Git 태그를 만들 때 릴리스 노트를 제공하지 마세요. 릴리스 노트를 제공하면 파이프라인이 실패합니다.

다음은 예시 .gitlab-ci.yml 파일의 일부입니다.

release_job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: $CI_COMMIT_TAG                 # 태그가 생성될 때 이 작업 실행
  script:
    - echo "running release_job"
  release:                               # 사용 가능한 속성에 대한 자세한 내용은 https://docs.gitlab.com/ee/ci/yaml/#release 참조
    tag_name: '$CI_COMMIT_TAG'
    description: '$CI_COMMIT_TAG'

기본 브랜치에 커밋이 Merge될 때 릴리스 생성

이 CI/CD 예시에서 릴리스는 기본 브랜치로 커밋을 Merge할 때 트리거됩니다. 이 방법은 릴리스 워크플로우가 매뉴얼으로 태그를 만들지 않는 경우에 사용할 수 있습니다.

다음은 예시 .gitlab-ci.yml 파일의 일부 중요한 포인트입니다.

release_job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: $CI_COMMIT_TAG
      when: never                                  # 태그가 매뉴얼으로 생성된 경우 이 작업 실행하지 않음
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH  # 커밋이 기본 브랜치로 푸시되거나 Merge될 때 이 작업 실행
  script:
    - echo "running release_job for $TAG"
  release:                                         # 사용 가능한 속성에 대한 자세한 내용은 https://docs.gitlab.com/ee/ci/yaml/#release 참조
    tag_name: 'v0.$CI_PIPELINE_IID'                # 버전은 파이프라인마다 증가됨
    description: 'v0.$CI_PIPELINE_IID'
    ref: '$CI_COMMIT_SHA'                          # 태그는 파이프라인 SHA에서 생성됨

참고: before_script 또는 script에서 설정한 환경 변수는 동일 작업에서 확장할 수 없습니다. 확장 가능한 변수를 만드는 데 관련된 자세한 내용은 가능한 변수 확장을 참조하세요.

사용자 지정 스크립트에서 릴리스 메타데이터 생성

이 CI/CD 예시에서 릴리스 준비를 유연하게 하기 위해 릴리스 메타데이터를 생성하는 작업을 별도로 분할합니다.

  • prepare_job 작업은 릴리스 메타데이터를 생성합니다. 사용자 지정 이미지를 포함한 모든 이미지를 사용하여 작업을 실행할 수 있습니다. 생성된 메타데이터는 variables.env라는 변수 파일에 저장됩니다. 이 메타데이터는 하류 작업에 전달됩니다.
  • release_job은 변수 파일에 있는 내용을 사용하여 릴리스를 생성합니다. 이 작업은 릴리스 CLI를 포함하는 registry.gitlab.com/gitlab-org/release-cli:latest 이미지를 사용해야 합니다.
prepare_job:
  stage: prepare                                              # 이 스테이지는 릴리스 스테이지보다 먼저 실행해야 함
  rules:
    - if: $CI_COMMIT_TAG
      when: never                                             # 태그가 매뉴얼으로 생성된 경우 이 작업 실행하지 않음
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH             # 커밋이 기본 브랜치로 푸시되거나 Merge될 때 이 작업 실행
  script:
    - echo "EXTRA_DESCRIPTION=some message" >> variables.env  # EXTRA_DESCRIPTION 및 TAG 환경 변수 생성
    - echo "TAG=v$(cat VERSION)" >> variables.env             # 그리고 variables.env 파일에 추가
  artifacts:
    reports:
      dotenv: variables.env                                   # 변수를 다른 작업에 노출하려면 artifacts:reports:dotenv 사용
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                                  # 태그가 매뉴얼으로 생성된 경우 이 작업 실행하지 않음
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH  # 커밋이 기본 브랜치로 푸시되거나 Merge될 때 이 작업 실행
  script:
    - echo "running release_job for $TAG"
  release:
    name: '릴리스 $TAG'
    description: '릴리스 CLI를 사용하여 생성됨 $EXTRA_DESCRIPTION'  # $EXTRA_DESCRIPTION 및 $TAG 변수는 다른 곳에서 정의되어야 함 (예: prepare_job에서)
    tag_name: '$TAG'                                                 
    ref: '$CI_COMMIT_SHA'                                            
    milestones:                                                      
      - 'm1'
      - 'm2'
      - 'm3'
    released_at: '2020-07-15T08:00:00Z'  # 선택 사항, 정의되지 않은 경우 자동 생성되거나 변수 사용 가능
    assets:
      links:
        - name: 'asset1'
          url: 'https://example.com/assets/1'
        - name: 'asset2'
          url: 'https://example.com/assets/2'
          filepath: '/pretty/url/1' # 선택 사항
          link_type: 'other' # 선택 사항

릴리스 생성 시 여러 파이프라인 건너뛰기

CI/CD 작업을 사용하여 릴리스를 생성하면 연결된 태그가 이미 존재하지 않는 경우 여러 파이프라인이 트리거될 수 있습니다. 이런 경우를 이해하기 위해 다음 워크플로우를 고려해 보세요.

  • 먼저 태그를 만들고, 그 후에 릴리스 생성:

    1. UI를 통해 태그를 생성합니다.
    2. 태그 파이프라인이 트리거되고 release 작업을 실행합니다.
    3. 릴리스가 생성됩니다.
  • 릴리스를 먼저 만들고, 그 후에 태그를 만듦:

    1. 커밋이 기본 브랜치로 푸시되거나 Merge될 때 파이프라인이 트리거됩니다. 파이프라인이 release 작업을 실행합니다.
    2. 릴리스가 생성됩니다.
    3. 태그가 생성됩니다.
    4. 태그 파이프라인이 트리거됩니다. 이 파이프라인도 release 작업을 실행합니다.

두 번째 워크플로우에서는 release 작업이 여러 파이프라인에서 실행됩니다. 이를 방지하려면 workflow:rules 키워드를 사용하여 태그 파이프라인에서 release 작업이 실행되어야 하는지 여부를 결정할 수 있습니다.

release_job:
  rules:
    - if: $CI_COMMIT_TAG
      when: never                                  # 태그 파이프라인에서 이 작업 실행하지 않음
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH  # 커밋이 기본 브랜치로 푸시되거나 Merge될 때 이 작업 실행
  script:
    - echo "릴리스 생성"
  release:
    name: ' 멋진 릴리스'
    tag_name: '$CI_COMMIT_TAG'