디자인 시스템 Lib Maven Central 배포하기

송규빈·2025년 6월 5일

개요

변경사항 버전 관리 목적으로 회사 디자인 시스템을 기존 프로젝트에서 빼내어 라이브러리 형태로 만드는 작업을 했다.

maven central로 배포하는 방법에 대해 다뤄보고자 한다.
샘플 코드는 SDG(Shopl-Design-Guide)를 참고하면 된다.

저장소 이용 등록

메이븐 저장소(Maven Repository)는 프로젝트 관리 도구인 Apache Maven의 서비스 중 하나임

메이븐은 JAR용으로 만들어진 도구지만 메이븐 저장소는 AAR 저장용으로도 많이 사용된다.

서드파티에서 제공하는 GUI 관리도구를 활용하면 편하게 메이븐 저장소를 이용할 수 있다.

기존에는 Sonatype 사가 제공하는 Nexus Repository Manager가 있었다.

Sonatype central-portal

기존에는 OSSRH(HTTP PUT) 퍼블리싱 엔드포인트를 사용했지만,

이제부터는 central-portal을 이용해야한다.

계정 만들기

Namespace(Group ID) 등록/확인

깃허브로 로그인 시 group id는 자동 생성된다.

퍼블리싱용 User Token 생성/확인

토근 생성 시 기존 토큰은 무효화되니, 생성 직후 표시되는 userName/password 값은 반드시 저장해야 한다.

GPG 키 생성 및 관리

Maven Central에 라이브러리를 배포하기 위해서는 GPG 키가 필요하다.

이 키는 라이브러리가 정상적으로 서명되었음을 보증하며, 사용자들이 서명을 검증할 수 있도록 공개 키 서버에 업로드된다.

1. GPG 키 생성

GPG 키를 생성하고 다음 명령어를 사용하여 키 생성 프로세스를 시작한다.

$ gpg --full-generate-key

키 종류 선택

각자의 목적에 맞게 골라서 사용하면 된다

키 생성이 완료되면 다음과 같은 메시지가 나온다.

여기서 pub의 마지막 8자인 47C2E592가 public key이다.

GPG 키 서버에 업로드

public key를 다른 사람들이 사용할 수 있도록 GPG public key를 서버에 업로드한다.

$ gpg --keyserver keyserver.ubuntu.com --send-keys 47C2E592

GPG 키 서명 파일 생성

vanniktech 플러그인에서는 secretKeyRingFile을 통해서 GPG를 검증하여 서명에 사용하기 때문에 다음처럼 서명 파일을 생성해야한다.

gpg --keyring secring.gpg --export-secret-keys > ~/.gnupg/secring.gpg

빌드 설정

Maven Central에 배포하려면 그래들 파일에서 설정을 해줘야한다.

플러그인 적용

플러그인은 다른 것도 있지만 vanniktech Maven Publish 플러그인을 적용했다.

모듈 단위의 build.gradle에 플러그인을 추가한다.

plugins {
  // id("com.vanniktech.maven.publish") version "0.29.0"
  alias(libs.plugins.vanniktech.maven)
}

Maven Central 설정

플러그인을 적용한 후, Maven Central로 배포를 활성화 하려면 대상 저장소를 지정하고 GPG 서명을 활성화해야 한다.

이 설정은 DSL을 통해 추가하거나 Gradle 속성을 설정하여 추가할 수 있다.

import com.vanniktech.maven.publish.SonatypeHost

mavenPublishing {
  // 기본 Maven Central로 배포
  publishToMavenCentral(SonatypeHost.DEFAULT)
  
  // 또는 https://s01.oss.sonatype.org로 배포
  publishToMavenCentral(SonatypeHost.S01)
  
  // 또는 https://central.sonatype.com/를 사용하는 Central Portal로 배포
  publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)

  // 모든 배포에 대해 GPG 서명 활성화
  signAllPublications()
}

위 설정에서 적절한 옵션을 선택하여 배포할 호스트를 지정할 수 있다.

이번에는 publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) 를 사용했다.

POM 구성

mavenPublishing {
    // 프로젝트의 그룹 ID, 아티팩트 ID, 버전 설정
    coordinates("io.github.xxx", "my-library", "1.0.0")

    // POM 정보 설정
    pom {
        name.set("My-Library")  // 라이브러리 이름
        description.set("My Library")  // 라이브러리 설명
        url.set("https://github.com/Songgyubin/My-Library")  // 프로젝트 URL
        inceptionYear.set("2025")  // 프로젝트 시작 연도

        // 라이선스 정보 설정
        licenses {
            license {
                name.set("The Apache License, Version 2.0")
                url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                distribution.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
            }
        }

        // 개발자 정보 설정
        developers {
            developer {
                id.set("Songgyubin")  // 개발자 ID
                name.set("Gyubin")  // 개발자 이름
                url.set("https://github.com/Songgyubin")  // 개발자 URL
            }
        }

        // 소스 코드 관리(SCM) 정보 설정
        scm {
            url.set("https://github.com/SongGyubin/My-Library")
            connection.set("scm:git:git://github.com/Songgyubin/My-Library.git")
            developerConnection.set("scm:git:ssh://git@github.com:Songgyubin/My-Library.git")
        }
    }
}

gradle.properties

프로젝트 루트 단위의 gradle.properties에 다음 내용을 추가한다.

mavenCentralUsername= Maven Central token 의 username 
mavenCentralPassword= Maven Central token 의 password 
signing.keyId=12345678 # key 의 id
signing.password=paswword # key 의 패스워드 
signing.secretKeyRingFile=/Users/guest/.gnupg/secring.gpg # secring.gpg 의 경로

모듈 단위의 build.gradle 내용

import com.vanniktech.maven.publish.SonatypeHost

plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.compose.compiler)
    alias(libs.plugins.vanniktech.maven) // 추가
}

group = "io.github.xxx"
version = "0.0.0"

android {
    . . .
}

dependencies {
. . .
}

mavenPublishing {
    publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)

    signAllPublications()

    coordinates("io.github.xxx", "my-library", "0.0.0")

    pom {
        name = "My-Library"
        description = "My Library"
        url = "https://github.com/Songgyubin/My-Library"
        inceptionYear = "2025"

        licenses {
            license {
                name = "The Apache License, Version 2.0"
                url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
            }
        }
        developers {
            developer {
                id = "Songgyubin"
                name = "Gyubin"
                url = "https://github.com/Songgyubin"
            }
        }

        scm {
            url.set("https://github.com/Songgyubin/My-Library")
            connection.set("scm:git:git://github.com/Songgyubin/My-Library.git")
            developerConnection.set("scm:git:ssh://git@github.com/Songgyubin/My-Library.git")
        }
    }
}

Publish

이제 Maven Central에 배포하면 된다.

배포

./gradlew publishAndReleaseToMavenCentral --no-configuration-cache

로컬 배포

배포 전 테스트용으로 로컬에 배포할 수도 있다.

./gradlew publishToMavenLocal --no-configuration-cache

profile
🚀 상상을 좋아하는 개발자

0개의 댓글