공통 라이브러리 CI/CD 개선 건

2025. 12. 14. 15:52CICD

개선 계기 : 
사내 시스템들을 MSA 구조로 변경하면서 여러 API에서 공통적으로 쓰는 라이브러리를 공통라이브러리로 Repository화 하고, Artifact(jar) 형태로 사내 Nexus Repository 에 배포하여 사용하고 있다.
여기서 2가지 이슈가 있었다. 
 

  1. 라이브러리 개발자의 개인 PC 에서 Nexus 로 직접 배포가 가능한 구조이다보니, 인적실수로 인해 의도하지 않은 소스 배포가 가능한 구조
  2. 라이브러리 사용자가 버전 업그레이드 요청을 받았을때 변경 사항 확인이 어려움.

 

 

해결 방법

과정은 크게 3단계로 나뉜다.
1. gradle publish 로 Artifact 를 Nexus에 배포 
2. 아래 version.py 실행하여 Nexus 에 배포된 Artifact 버전 명을 가져옴(데이터 전처리를 위해 python을 사용하였습니다.)

# 사용 예: python version.py dev co-core

nx_repo = sys.argv[1] # nexus repository 명 (ex: test, dev, core)
ms_profile = sys.argv[2] # Bitbucket 상의 branch = CI/CD상의 profile
ms_name = sys.argv[3] # Bitbucket repo 명

file_path = f"./{ms_profile}/{ms_name}/build.gradle" # build.gradle 파일 경로
lib_version = extract_lib_version(file_path)

# 1) 공통라이브러리 소스 내 lib_version 추출

def extract_lib_version(file_path):
with open(file_path, 'r') as file:
content = file.read()


# 정규 표현식을 사용하여 buildscript 블록 안의 ext.lib_version 값 추출
match = re.search(r"ext.lib_version\\s*=\\s*['\"]([^'\"]+)['\"]", content)

if match:
return match.group(1) # lib_version 값을 반환
else:
return None # 값을 찾지 못한 경우

# 2) Nexus REST API 로 Artifact 정보를 파싱해서 가져옴
nexus_url = f"http://{nexus IP}:{PORT}/service/rest/v1/search?repository={nx_repo}&version={lib_version}" # 예시

# 3) version 값 추출
versions = [item['version'] for item in data.get('items', [])]
print(versions[-1])

 
2-1. OUTPUT 변수에 위의 결과물을 담음. 

OUTPUT=$(python version.py
$(params.NX_REPO)
$(params.MS_PROFILES)
$(params.MS_NAME)
)

 
3. 2-1 에서 가져온 OUTPUT(최신 라이브러리 버전명)값을 Git Commit에 Tagging 

git checkout ${params.MS_BRANCH}
git tag $OUTPUT
git push origin ${params.MS_BRANCH} --tags