공통 라이브러리 CI/CD 개선 건
2025. 12. 14. 15:52ㆍCICD
개선 계기 :
사내 시스템들을 MSA 구조로 변경하면서 여러 API에서 공통적으로 쓰는 라이브러리를 공통라이브러리로 Repository화 하고, Artifact(jar) 형태로 사내 Nexus Repository 에 배포하여 사용하고 있다.
여기서 2가지 이슈가 있었다.
- 라이브러리 개발자의 개인 PC 에서 Nexus 로 직접 배포가 가능한 구조이다보니, 인적실수로 인해 의도하지 않은 소스 배포가 가능한 구조
- 라이브러리 사용자가 버전 업그레이드 요청을 받았을때 변경 사항 확인이 어려움.


해결 방법
과정은 크게 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
'CICD' 카테고리의 다른 글
| 밑천 드러난 6년차, 모르는 이슈 앞에서 쓰는 '변수 격리' 생존법 (3) | 2026.08.08 |
|---|---|
| 한 달에 42시간 절약한 개선 건 (React 빌드 속도 개선 feat.Tekton) (0) | 2025.01.25 |
| submodule 빌드 프로세스 개선 ( conflict 수 줄이는법! ) (0) | 2024.08.30 |
| Hmall 빌드 속도 개선 건 (21분 -> 9분) (0) | 2024.08.17 |
| 새로운 repo 에 git commit이력까지 복사하기 (0) | 2023.05.02 |