본문 바로가기

IT

gitlab-ci.yml release version tag ( multi pomfile )

728x90

라이브러리 master 업로드 시 태그 붙이기.

gitlab job stage에 release를 제공해줌
https://docs.gitlab.com/ee/ci/yaml/#releasetag_message

파이프라인 tag를 만들어주는 스크립트는 다음과 같다.

tagging:
stage: release
script:
- echo "running release_job"
allow_failure: true
rules:
- if: "$CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == 'master'"
tags:
- prods
release:
tag_name: 'Pipeline.$CI_PIPELINE_ID'
description: 'Pipeline.$CI_PIPELINE_ID'
ref: '$CI_COMMIT_SHA'

두가지 이슈가 존재, 해결 방법

1. version을 어떻게 받아올 것인지

VERSION_TAG=$(awk '/<version>/ && ++count == 2 {gsub(/<\/*version>/, ""); print; exit}' pom-prod.xml)

pom-prod.xml에서 두번째로 나오는 version 태그를 찾아서 변수에 넣어줌, 필자의 경우 version 태그가 부모 pom에 대해 선언 되어있는 것이 있어 두번째 version 명을 찾음, 하지만 이 방법은 version 태그 추가에 대한 제약이 생김

TAG_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)

해당 프로젝트 버전을 찍어보면 0.0.1-SNAPSHOT이 찍힌다.

필자는 멀티 pom을 사용하기에 다른 pom을 지정 -f pom-prod.xml

TAG_VERSION=$(mvn help:evaluate -f pom-prod.xml -Dexpression=project.version -q -DforceStdout )

VERSION_TAG를 잘 받아옴



2. version을 release step에 넣을 수가 없음

https://docs.gitlab.com/ee/user/project/releases/release_cicd_examples.html

release는 script, beforescript 다 안타서 변수로 선언해주어도 release에서 사용할 수가 없었음
https://stackoverflow.com/questions/77899654/gitlab-ci-use-a-job-variable-in-release-section
mpolitze 이 사람덕에 해결했다고 한다. 감사합니다.
TAG_VERSION을 그대로 파일에 복사하고 파일에서 cat해서 쓰니 된다고하여 적용해보았다.

tagging:
stage: release
variables:
VERSION_TAG: "v0.0.0"
VERSION_TAG_FILE: "version.txt"
script:
#    - VERSION_TAG=$(awk '/<version>/ && ++count == 2 {gsub(/<\/*version>/, ""); print; exit}' pom-prod.xml)  
     - VERSION_TAG=$(mvn help:evaluate -f pom-prod.xml -Dexpression=project.version -q -DforceStdout )   
     - echo "Running release job for version VERSION_TAG"   
     - echo $VERSION_TAG > $VERSION_TAG_FILEallow_failure: true
only:
- master
tags:
- prod
release:
    tag_name: $(cat $VERSION_TAG_FILE)
#    tag_message: "Release $(cat $VERSION_TAG_FILE)"
    name: "Release $(cat $VERSION_TAG_FILE) of $CI_PROJECT_NAME"#    description: "Pipeline.$CI_PIPELINE_ID.$VERSION"
    description: "Release $(cat $VERSION_TAG_FILE) at $CI_PIPELINE_CREATED_AT based on $CI_COMMIT_SHORT_SHA"    ref: "$CI_COMMIT_SHA"

버전 태그 생성 완료

 


주의할 점

태그 만들때도 동일 버전이면 Job이 fail하게 되니

allow_failure 를 true 값을 주는 것도 좋을 듯 하다.