릴리스 CI/CD 예제
GitLab 릴리스 기능은 유연하여 워크플로우에 맞게 구성할 수 있습니다. 이 페이지에는 릴리스 작업의 예시 CI/CD가 특징화되어 있습니다. 각 예시는 CI/CD 파이프라인에서 릴리스를 생성하는 방법을 보여줍니다.
Git 태그가 생성될 때 릴리스 생성
이 CI/CD 예시에서 릴리스는 다음 이벤트 중 하나로 트리거됩니다:
- 리포지토리에 Git 태그를 푸시합니다.
- UI에서 Git 태그를 생성합니다.
UI에서 Git 태그를 생성하는 경우 Git 태그를 수동으로 생성하고 결과로 릴리스를 생성하는 경우 이 방법을 사용할 수 있습니다.
NOTE: UI에서 Git 태그를 생성할 때 릴리스 노트를 제공하지 마십시오. 릴리스 노트를 제공하면 파이프라인이 실패합니다.
다음은 예시 .gitlab-ci.yml
파일의 추출 중 주요 포인트입니다:
-
rules
stanza는 작업이 파이프라인에 추가되는 조건을 정의합니다. - Git 태그는 릴리스의 이름과 설명에 사용됩니다.
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'
커밋이 기본 브랜치에 병합될 때 릴리스 생성
이 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 # 수동으로 태그를 만들 때 이 작업을 실행하지 않습니다
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # 커밋이 푸시되거나 기본 브랜치에 병합될 때 이 작업을 실행합니다
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에서 생성됩니다.
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 # 이 스테이지는 릴리스 스테이지보다 먼저 실행해야 합니다
rules:
- if: $CI_COMMIT_TAG
when: never # 수동으로 태그가 생성될 때 이 작업을 실행하지 않습니다
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # 커밋이 푸시되거나 기본 브랜치에 병합될 때 이 작업을 실행합니다
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 # 커밋이 푸시되거나 기본 브랜치에 병합될 때 이 작업을 실행합니다
script:
- echo "running release_job for $TAG"
release:
name: '릴리스 $TAG'
description: '릴리스-cli를 사용하여 생성된 $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION 및 $TAG 환경 변수는 다른 곳에서 정의되어 있어야 합니다.
tag_name: '$TAG' # 예를 들어, prepare_job에서 정의됩니다.
ref: '$CI_COMMIT_SHA' # 파이프라인에서.
milestones: # 사용 가능한 속성에 대해서는 prepare_job에서 정의됩니다.
- '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 작업을 사용하여 릴리스를 생성하면 연결된 태그가 이미 존재하지 않은 경우 여러 파이프라인이 트리거될 수 있습니다. 이런 일이 일어나는 방법을 이해하기 위해 다음 워크플로를 살펴보세요:
-
먼저 태그를 지정하고, 그 다음 릴리스하기:
- UI를 통해 태그를 생성하거나 push합니다.
- 태그 파이프라인이 트리거되고
릴리스
작업을 실행합니다. - 릴리스가 생성됩니다.
-
먼저 릴리스하고, 그 다음 태그 지정하기:
- 커밋이 푸시되거나 기본 브랜치로 병합될 때 파이프라인이 트리거됩니다. 파이프라인에서
릴리스
작업을 실행합니다. - 릴리스가 생성됩니다.
- 태그가 생성됩니다.
- 태그 파이프라인이 트리거됩니다. 해당 파이프라인은
릴리스
작업도 실행합니다.
- 커밋이 푸시되거나 기본 브랜치로 병합될 때 파이프라인이 트리거됩니다. 파이프라인에서
두 번째 워크플로에서 릴리스
작업은 여러 파이프라인에서 실행됩니다. 이를 방지하려면 workflow:rules
키워드를 사용하여 태그 파이프라인에서 릴리스 작업을 실행해야 하는지 여부를 결정할 수 있습니다:
release_job:
rules:
- if: $CI_COMMIT_TAG
when: never # 태그 파이프라인에서 이 작업을 실행하지 않습니다
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # 커밋이 기본 브랜치로 푸시되거나 병합될 때 이 작업을 실행합니다
script:
- echo "릴리스 생성"
release:
name: '내 멋진 릴리스'
tag_name: '$CI_COMMIT_TAG'