오픈소스를 수정 배포하게 된 배경
저는 사내에서 로그 모니터링 서비스를 만들고 있습니다.
위 사진에서 파란색 태그는 임의의 로그(문자열)에서 semantic(의미를 가지는) 키워드로 추출된 값들입니다. 이렇게 추출된 태그를 기반으로 인덱스가 생성되고 로그를 조회할 수 있습니다.
임의의 형태로 수집되는 로그에서 유의미한 형태의 키워드를 추출하기 위해서 thekrakken/java-grok 라는 라이브러리를 사용하고 있었습니다. 직접 만들고 있는 로그 모니터링을 사용해서 운영환경에서 발생하는 문제를 분석하다보니 크게 2가지 문제의식을 갖게 되었습니다.
1. 다양한 환경에서 수집되는 로그와 인덱스를 체계적으로 관리할 필요성이 있다.
2. 로그를 메트릭스로 변환해서 메트릭스 기반으로 개발된 다양한 기능들을 사용자가 직접 활용할 수 있도록 도와주는 기능이 필요하다.단, 사용자가 직접 메트릭스의 이름을 지정하도록 해야한다. 이 때 log.status.error.4xx.count 처럼 메트릭스의 이름을 계층적으로 구성할 수 있도록 제공해야 편리하고 원활한 사용성을 제공할 수 있다.
그런데 기존에 사용하던 라이브러리는 semantic 키워드에 '.'과 '_' 의 특수문자를 사용할 수 없다는 문제가 있었습니다.
// io.krakens:java-grok
public static final Pattern GROK_PATTERN = Pattern.compile(
"%\\{"
+ "(?<name>"
+ "(?<pattern>[A-z0-9]+)"
+ "(?::(?<subname>[A-z0-9_:;,\\-\\/\\s\\.']+))?"
+ ")"
+ "(?:=(?<definition>"
+ "(?:"
+ "(?:[^{}]+|\\.+)+"
+ ")+"
+ ")"
+ ")?"
+ "\\}");
위 코드에서 pattern과 subname 부분이 결과적으로 태그로 생성되는 문자열입니다. 보시다시피 pattern에는 '.'과 '_'를 입력할 수 없도록 정규표현식이 정의되어 있습니다.
- pattern : [A-z0-9]+
- subname : [A-z0-9_:;,-/\s.']
결론적으로는 아래와 같이 정규표현식을 수정해서 배포했습니다.
- pattern : [a-zA-Z][a-zA-Z0-9_-.]*[a-zA-Z0-9]
- subname : [a-zA-Z][a-zA-Z0-9_:;,-/\s.']*[a-zA-Z0-9]
수정된 라이브러리는 https://github.com/whatap/java-grok 에서 확인하실 수 있습니다.
아래는 오픈소스를 수정 배포하는 과정에서 겪었던 문제와 해결 방법을 간략히 정리해둔 내용입니다. 크게 2가지 문서를 참고해서 진행했습니다.
- 공식 가이드 문서 : https://central.sonatype.org/publish/publish-guide/#introduction
- sonatype nexus repository로 배포를 도와주는 플러그인 : https://github.com/gradle-nexus/publish-plugin
오픈소스 배포하는 방법 (with gradle 8.*)
전체적인 내용은 아래의 링크에 더 잘 정리되어 있습니다.
https://shanepark.tistory.com/458
본 문서는 '위 링크의 내용' + 'gradle 8.*을 사용할 때 고려할 사항들'을 다루고 있습니다.
'gradle 8.*을 사용할 때 고려할 사항들'은 아래 목차에 포함되어 있습니다.
7. { PROJECT_ROOT}/build.gradle 파일 생성
7.1. 수정된 버그 사항 1
7.2. 수정된 버그 사항 2
7.3. 수정된 버그 사항 3
0. 필요한 정보들
오픈 소스 배포를 위해서는 크게 3가지 정보를 담은 gradle.properties 파일이 필요합니다.
# ~/.gradle/gradle.properties
# jira account
ossrhUsername=
ossrhPassword=
# https://s01.oss.sonatype.org
sonatypeStagingProfileId=
# gpg
signing.keyId=
signing.password=
signing.secretKeyRingFile=
아래의 내용은 이 정보를 얻는 방법들을 설명하고 있습니다.
1. issues.sonatype.org > 회원가입 및 로그인
오픈소스를 배포하기 위한 첫 번째 과정은 신기하게도 JIRA 티켓을 만드는 것으로 시작합니다.
https://issues.sonatype.org/secure/Dashboard.jspa
위 링크에서 계정을 만들고 로그인합니다.
로그인 정보가 gradle.properties에 들어가야하는 ossrhUsername, ossrhPassword 정보입니다.
2. issues.sonatype.org > 이슈 생성하기
아래 링크를 통해서 오픈소스 기여를 위한 repository를 생성해달라는 이슈를 생성합니다
https://issues.sonatype.org/secure/CreateIssue.jspa?pid=10134&issuetype=21
만약 GroupId가 잘못되었으면 1-2분 기다리면 봇이 Group Id 포멧의 오류를 알려줍니다.
지라 이슈의 댓글로도 알려주고 이메일로도 알려줍니다.
지라 이슈의 댓글에서는 기록이 사라져서 이메일을 캡쳐했습니다.
io.whatap로 등록하고 싶지만 규칙에 따라서 io.github.whatap로 수정했습니다.
3. github.com > 관련 이슈 번호로 repository 생성하고 기다리기
4. issues.sonatype.org > 요청한 repository 생성 안내 확인하기
최대 2일정도 걸린다고 했는데 저는 30분정도 기다리니, 요청한 repository가 생성되었다는 안내를 받았습니다.
5. s01.oss.sonatype.org > stagingProfileId 확인하기
https://s01.oss.sonatype.org 에서 생성된 repository 정보를 확인할 수 있습니다.
Build Promotion > Stagin Profiles > URL의 profileId 확인하시면 됩니다.
URI의 profileId 정보가 gradle.properties에 들어가야하는 sonatypeStagingProfileId 입니다.
6. gpg key 설정
6.1. Installing GnuPG
gpg --version
6.2. Generating a Key Pair
이 과정에서 `GPG 비밀번호`를 입력하게 됩니다. `JIRA 계정 비밀번호`랑 달라도 됩니다.
여기서 입력하는 정보가 gradle.properties에 들어가야하는 signing.keyId, signing.password입니다.
gpg --gen-key
6.3. Listing Keys
hwanseok@hwanseoks-MacBook-Pro .gradle % gpg --list-keys
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2026-08-15
[keyboxd]
---------
pub ed25519 2023-08-16 [SC] [expires: 2026-08-15]
###############################################
uid [ultimate] hwanseok <hwanseok@whatap.io>
sub ######## 2023-08-16 [E] [expires: 2026-08-15]
6.4. Distributing Your Public Key
gpg --keyserver keyserver.ubuntu.com --send-keys ##############################
6.5. check key server
6.6. create gpg key ring file
private keys 1개 이상을 저장하고 있는 파일 생성
여기서 입력하는 정보가 gradle.properties에 들어가야하는 signing.secretKeyRingFile 입니다.
gpg --keyring secring.gpg --export-secret-keys > ~/.gnupg/secring.gpg
7. { PROJECT_ROOT}/build.gradle 파일 생성
파라미터로 지정한 값을 제외하면 https://github.com/whatap/java-grok/blob/master/build.gradle 의 파일을 그대로 사용해도 됩니다. 위 파일에는 공식문서에는 아직 수정되지 못한 아래의 버그 사항들이 수정된 상태입니다.
7.1. 수정된 버그 사항 1
# apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'signing'
7.2. 수정된 버그 사항 2
task javadocJar(type: Jar) {
# classifier = 'javadoc'
archiveClassifier = 'javadoc'
from javadoc
}
task sourcesJar(type: Jar) {
# classifier = 'sources'
archiveClassifier = 'sources'
from sourceSets.main.allSource
}
관련 정보 : https://docs.gradle.org/current/userguide/upgrading_version_7.html#abstractarchivetask_api_cleanup
7.3. 수정된 버그 사항 3
# uploadArchives {
# repositories {
# mavenDeployer {
# ...
publishing {
publications {
mavenJava(MavenPublication) {
...
- Deprecated : https://docs.gradle.org/current/userguide/upgrading_version_6.html#removal_of_the_uploadarchives_task
- maven-publish docs for Gradle 8.2 https://docs.gradle.org/current/userguide/publishing_maven.html#sec:modifying_the_generated_pom
8. sonatypeRepository에 배포하기
./gradlew publishReleasePublicationToSonatypeRepository
9. sonatypeRepository에서 정상인 경우 mavenRepository에 배포하기
'DEV > JAVA' 카테고리의 다른 글
Java Thread Tutorial (1) | 2024.04.04 |
---|---|
jevn 설정 (JDK 버전 변경하기) (0) | 2024.01.26 |