2023. 1. 24. 23:15ㆍDevelopment
Maven repo
Maven repo는 library를 집합소이며, gradle, maven 빌드 타임에 해당 필요한 의존성을 Download해서 프로젝트 빌드할 때 사용됩니다.
실제 빌드시 다운받은 library들은 해당 위치(linux, mac)에 cache의 형태로 저장 되어있습니다.
~/.m2/repository
간혹 팀내에서 자체 라이브러리를 만들어서 공유하며 사용해야할 일이 있습니다. 오픈소스 라이브러리로 특별히 오픈할 의도는 아니었기에 계정을 등록하고해야하는 maven repo(https://mvnrepository.com) 에 직접 올리기는 뭔가 애매했습니다.
찾다보니 개인용 github계정에 public repo를 maven repo로 활용할 수 있는 방안이 있어 이를 적용하여 보았습니다.
Library project 빌드하기
library 배포는 github actions를 이용하도록 셋업을 진행했습니다.
library/build.gradle
plugins {
id 'java'
id 'java-library'
id 'maven-publish'
}
maven-publish 라는 plugin을 이용하면 편리하게 셋업이 가능합니다.
library/build.gradle
publishing {
publications {
maven(MavenPublication) {
groupId = 'com.company.team'
artifactId = 'my-lib'
version = '0.0.4'
from components.java
}
}
repositories {
maven {
url = uri("${buildDir}/publishing-repository")
}
}
}
그리고 위와 같이 publishing task를 정의해주면
gradle task로 publishing이 추가된 것을 확인할 수 있습니다.
위 화면은 Intellij IDE에서 확인을 하기 위환 것이고, 실제 trigger는 github actions에서 command로 하게 될 것입니다.
Local에서 command line으로 해당 task를 수행시키기 위해선 아래와 같이 하면 됩니다.
./gradlew :library:publish
생성한 프로젝트의 구조가 아래와 같이 멀티프로젝트로 생성되어있기 때문에 task path가 위와 같이 되었습니다.
library에 해당하는 코드는 library 프로젝트에 들어가 있으며, test-application은 이를 가져와서 테스트 하는 구조의 멀티프로젝트로 구성했기 때문입니다.
test-application/build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation project(':library')
//test
testImplementation ('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.mockito:mockito-inline:3.6.0'
testImplementation 'software.amazon.awssdk:ssm:2.15.0'
}
test-application 입장에서의 library 프로젝트는 내부의 프로젝트이기 때문에 위와 같이 dependency로 추가해서 기능 테스트를 해볼 수 있습니다.
library를 다 작성했고, test도 모두 끝났으면 이제 배포를 해야할 단계입니다.
publish task를 수행하면 위에 '${buildDir}/publishing-repository' 해당 위치에 배포가 이루어집니다.
정상적으로 배포를 위한 File들이 생성되었음을 확인할 수 있습니다.
정해진 버전의 디렉토리가 생성되어있고, jar들과 이를 검수하기 위한 checksum용 파일들이 함께 생성됩니다.
Github에 올려보기
실제 배포는 library source를 위한 github repo(여기서 github action이 동작할 것이고) 배포된 library가 올라갈 github레포가 하나 더 필요합니다.
먼저 library가 올라갈 repo를 셋업하는 건 public repo를 별도로 생성해두고
그 배포를 위한 library 소스를 관리할 repo push를 하고 actions를 셋업해줍니다.
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
build-root-directory: source
arguments: ":library:publish"
gradle/gradle-build-action action을 이용해서 build command를 실행하면 심플하게 할 수 있습니다.
아마 위의 action이 동작했다면 로컬에서 확인했던 것 처럼 build/publish-repository에 산출물이 나왔을 것입니다.
- name: Checkout maven repo
uses: actions/checkout@v3
with:
repository: my/maven-repository
path: repo
token: ${{ secrets.MAVEN_REPO_DEPLOY_TOKEN }}
- name: Publish library
run: |
cp -r ./source/library/build/publishing-repository/* ./repo
cd repo
git config user.email "wenys@gmail.com"
git config user.name "wenys"
git add .
git commit -m "update"
git push origin main
이렇게 Git actions에서 github용 maven repo로 신규버전을 배포할 수 있습니다.
동일한 버전이 다시 publish되면 overwritting 된다고 보면 됩니다.
위에서 token을 이용하여 push를 하는 것을 볼 수 있는 데, 이는 maven repo의 권한이 있는 유저의 토큰을 생성하여 사용하였습니다.
토큰은 maven repo에서 권한을 발급받는 것이며, 위에서 쓰인 "secrets.MAVEN_REPO_DEPLOY_TOKEN" 변수는 github action이 trigger될 쪽에 등록을 하는 것입니다. 등록 같은 경우 설정에 Github의 Secrets의 actions 메뉴를 찾아보면 등록할 수 있는 UI가 있으므로 손쉽게 가능합니다.
이렇게 배포까지 정상적으로 되었으면 실제로 해당 라이브러리를 타 프로젝트에서 가져오는 지 확인이 필요할 것입니다.
repositories {
mavenCentral()
.
.
.
maven {
url "https://raw.githubusercontent.com/my/maven-repository/main"
metadataSources {
gradleMetadata()
}
}
.
.
.
implementation 'com.company.team:my-lib'
}
이와 같이 maven repo를 추가 등록하고 의존성을 넣어주면 정상적으로 library를 잘 가져옴을 확인할 수 있습니다.
'Development' 카테고리의 다른 글
Spring cloud gateway에서 허가되지 않은 url character 사용하기 (0) | 2024.02.07 |
---|---|
bytebuddy로 Java class 일부 method 교체하기 (해킹) (0) | 2023.01.24 |
Spring cloud gateway response body cache (0) | 2023.01.24 |
Spring cloud gateway request body cache (0) | 2023.01.24 |
Server test용 General Mock server 만들기 (0) | 2023.01.24 |