본문 바로가기

개발/오픈소스

오픈소스 라이브러리 맛보기

오늘은 sonatype 공식 문서를 참고하여 라이브러리를 Maven Central Repository에 배포해보려고 해요!

목차

0. Sonatype OSSRH

1. 초기 셋업

2. Requirements

3. 배포

0. Sonatype OSSRH

 

Sonatype OSSRH는 오픈 소스 프로젝트 바이너리에 대해 repository 호스팅 서비스를 제공하려 Sonatype Nexus Repository Manager를 사용한다고 설명되어 있어요.

1. 초기 셋업

 

먼저 첫 번째 링크에서 JIRA 계정을 생성하고, 두 번째 링크를 통해 지라 티켓을 등록해야 해요.

 

 

위 사진이 지라 티켓 등록 화면이에요. 위와 같이 작성하여 등록을 하면

 

 

위와 같은 화면으로 넘어가게 됩니다.

후에 확인 절차가 하나 있는데, 간단하니 절차대로 따르면 무사히 티켓을 등록할 수 있어요 :)

2. Requirements

 

이제 Central 에서 요구하는 사항들을 살펴보고 필요한 것들을 해봅시다!

  • GPG 서명

Requirements 내에 모든 파일들에 GPG 혹은 PGP 를 이용하여 사인이 필요하고 명시되어 있어요.

GPG란 ? GnuPG 공식 문서를 살펴보면

GnuPG allows you to encrypt and sign your data and communications

라는 구문이 있어요. 즉 GPG 는 data와 communication에 대하여 보안과 사인을 제공해준다는 의미로 해석할 수 있어요.

→ 즉, GPG를 사용하여 보다 신뢰성 있는 파일, 나아가 라이브러리를 제공할 수 있어요!

지금 글쓴이는 windows 환경이므로, 위 사이트에서 Gpg4Win을 받아 설치하려고 해요.

Gpg4Win Setup

설치를 하다 보면 중간에 Components를 고를 수 있어요. GnuPG만 설치해서 명령어로 키 관리를 해도 되지만, 글쓴이는 키를 GUI로 편리하게 관리할 수 있게 해주는 Kleopatra도 같이 설치해주었어요.

gpg --gen-key

설치 후 cmd 내에서 위 명령어를 사용하여 key를 생성해요.

그러면 Kleopatra에서 위와 같이 내가 생성한 키를 볼 수 있어요. 이 공개키를 키 서버에 배포해야 해요.

키 내보내기

키를 우클릭하고 내보내기를 진행해요.

그러면 위와 같은 .asc 파일이 생성돼요. 이제 이 파일을 키서버에 업로드 하면 됩니다!

sonatype에서 확인해보면 현재 Central Server에서 지원하는 키 서버는 위 세가지 사이트에요.

keys.openpgp.org

키 사이트에 접속하게 되면 위와 같은 화면이 나와요. 그 중 '올리' 라는 링크를 클릭해볼까요?

그러면 이렇게 키를 업로드 할 수 있는 화면이 나오고, 아까 만든 키의 .asc 파일을 선택해서 올리면 돼요.

  • 배포를 위한 pom.xml 설정(Maven)

프로젝트의 이름, 설명, url

라이선스 정보

필자는 가장 제약이 덜 한 MIT 라이센스를 명시했어요.

개발자 정보

 

SCM 정보

 

 

3. 배포

우리는 Maven을 사용하여 배포하기 때문에 공식 문서를 참고하여 필요한 플러그인들을 추가해줄 것이다.

마지막으로

mvn clean deploy

를 통해 배포를 할 수 있어요.

윈도우 기준 위와 같은 INFO와 함께 배포가 성공적으로 이루어졌다는 안내 문구를 확인할 수 있어요.

저장소의 모습

 

번외 - Gradle로 배포하기

위 글에서는 지금까지 Maven을 사용하여 배포를 진행했어요! 그리고 한 번 gradle도 사용해서 배포해보려 해요.

여기서 중요한 점은 현재 자신이 사용하는 gradle 버전이에요.

gradle -version

을 통해 자신이 쓰고 있는 gradle의 버전을 확인할 수 있어요.

버전 확인 예시

위와 같은 버전 확인이 꼭 필요한 이유는 gradle은 버전별로 문법이 다르기 때문에 버전에 맞는 문법으로 build.gradle을 작성해야 하기 때문이에요.

publishing에 관한 gradle docs

자신의 gradle 버전에 맞게 위 빨간 네모 박스 부분에 집어넣으면 각 버전에 맞는 publishing 에 관한 gradle의 docs를 확인할 수 있어요. 글쓴이의 gradle 버전은 7.6 이기 때문에 7.0 docs를 참고하여 build.gradle을 작성해보겠습니다.

plugins {
    id 'java-library'
    id 'maven-publish'
    id 'signing'
}

repositories {
    mavenLocal()
    maven {
        url = uri('<https://repo.maven.apache.org/maven2/>')
    }
}

group = 'io.github.yg0585'
version = '1.0.1'
description = 'Test Library'
java.sourceCompatibility = JavaVersion.VERSION_1_8

java {
    withSourcesJar()
    withJavadocJar()
}

publishing {
    repositories {
        maven {
            if (version.toString().endsWith("SNAPSHOT")) {
                url "<https://s01.oss.sonatype.org/content/repositories/snapshots>"
            }
            else {
                url "<https://s01.oss.sonatype.org/content/repositories/releases/>"
            }
            credentials {
                username ossrhUsername
                password ossrhPassword
            }
        }
    }

    publications {
        maven(MavenPublication) {
            groupId = 'io.github.yg0585'
            artifactId = 'opensource-test'
            version = '1.0.1'

            pom {
                name = 'opensource-test'
                description = 'Create Repository'
                url = '<https://github.com/yg0585/opensource-test>'
                licenses {
                    license {
                        name = 'The MIT License'
                        url = '<https://opensource.org/licenses/MIT>'
                    }
                }
                developers {
                    developer {
                        id = 'yg0585'
                        name = 'YoungGwang'
                        email = 'yg0585@naver.com'
                    }
                }
                scm {
                    connection = 'scm:git:git://github.com/yg0585/opensource-test'
                    developerConnection = 'scm:git:ssh://github.com/yg0585/opensource-test.git'
                    url = '<https://github.com/yg0585/opensource-test>'
                }
            }

            from(components.java)
        }
    }
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

tasks.withType(Javadoc) {
    options.encoding = 'UTF-8'
}

signing {
    sign publishing.publications.maven
}

pom 의 관련한 부분의 maven과 마찬가지로 작성해주면 돼요. 여기서 눈 여겨 보아야 할 부분은 repositories 부분과 signing부분이에요.

  • repositories

url 부분에는, 자신의 repo를 지정해주면 돼요. 그리고 ossrhUsername 과 ossrhPassword는 gradle.properties에

ossrhUsername=your_jira_id
ossrhPassword=your_jira_pw

와 같은 형식으로 넣어주면 됩니다.

  • signing
signing.keyId=key_id
signing.password=key_pw
signing.secretKeyRingFile=~/.gnupg/secring.gpg

gpg 부분도 역시 위와 같이 작성하여 gradle.properties에 넣어주면 돼요. 그런데 여기서 주의할 점은, 본문에 maven으로 빌드할 때 사용한 .asc 파일의 키는 사용할 수 없어요.

gpg --export-secret-keys -o secring.gpg

위 명령어로 .asc 파일이 아닌 .gpg 파일로 추출한 후 gradle에서 서명을 진행하면 돼요 !

이제 build.gradle 설정이 끝났어요! 이제 배포만 하면 됩니다.

gradle publish

 

배포 결과

 


번외. Jitpack

번외로 Jitpack 에도 한 번 업로드를 해보려고 합니다. Jitpack은 maven central에 올리는 것보다 훨씬 간단해요! 공식 문서를 참고해서 진행해볼게요. 사실 Jitpack은 문서를 참고해서 할 필요도 없어요. 단지, Github로 push만 진행하면 됩니다.

그리거 Jitpack.io 에서 검색을하면 ?

아래와 같이 성공적으로 업로드가 된 것을 볼 수 있습니다. maven central보다 훨씬 간단하죠...?

그리고 사용은 아래와 같이할 수 있습니다.

먼저 JitPack maven repository를 추가해주고, dependency 정보를 추가해주면 끝이라고 하네요. 너무 간단하지 않나요?

    allprojects {
        repositories {
            mavenCentral()
            maven { url "<https://jitpack.io>" }
        }
    }
    dependencies {
        implementation 'com.github.User:Repo:Version'
    }


참고 자료

https://central.sonatype.org/publish/publish-guide/

 

OSSRH Guide - The Central Repository Documentation

Getting started Introduction Sonatype OSSRH (OSS Repository Hosting) uses Sonatype Nexus Repository Manager to provide repository hosting service for open source project binaries - be sure to review the full terms of service. OSSRH uses the Maven repositor

central.sonatype.org

https://gnupg.org/

 

The GNU Privacy Guard

We are pleased to announce the availability of a new stable GnuPG release: version 2.4.2. This version fixes some minor bugs and improves the performance on Windows. {more} We are pleased to announce the availability of a new stable GnuPG release: version

gnupg.org

https://central.sonatype.org/publish/publish-gradle/

 

Gradle - The Central Repository Documentation

Gradle Deploying to OSSRH with Gradle - Introduction Just like Gradle can be easily configured to consume components from the Central Repository, it can be configured to publish to OSSRH. In order to deploy your components to OSSRH with Gradle, you have to

central.sonatype.org

https://docs.gradle.org/7.0/userguide/publishing_maven.html#publishing_maven

 

Maven Publish Plugin

Prior to Gradle 5.0, the publishing {} block was (by default) implicitly treated as if all the logic inside it was executed after the project is evaluated. This behavior caused quite a bit of confusion and was deprecated in Gradle 4.8, because it was the o

docs.gradle.org