자작 라이브러리를 서버에 올려 앱 개발에 사용하기 위해 처음으로 Maven에 배포를 해 보았다. 나중에 잊어버렸을 때를 대비해서 그 과정을 기록해 놓으려 한다.

1. 저장소 이용 등록

메이븐 저장소 (Maven Repository) 는 프로젝트 관리 도구인 Apache Maven의 서비스 중 하나이다. 메이븐은 Java프로젝트 (JAR) 용으로 만들어진 도구지만 메이븐 저장소는 Android 라이브러리 (AAR) 저장용으로도 아주 많이 쓰이고 있다. 메이븐 저장소는 원래 CLI환경에서 컨트롤하도록 되어 있지만, 서드파티에서 제공하는 GUI 관리도구를 활용하면 편하게 메이븐 저장소를 이용할 수 있다. 나는 그 중에서 Sonatype 사가 제공하는 Nexus Repository Manager를 이용했다.

Nexus Repository Manager는 바로 이용할 수 없고 별도의 사이트에서 이용 등록부터 해야 한다. 이 등록은 Sonatype Jira 사이트에서 할 수 있다. (Jira란 오픈소스 협업 툴로 자세한 설명은 링크로 대신한다.)
먼저 회원가입을 진행한다.

여기서 작성한 Username과 Password가 Nexus Repository Manager의 ID와 비밀번호가 된다. Username은 추후 변경할 수 없다고 하니 주의.

사이트 회원가입을 하고 메인화면 상단의 만들기 (create) 버튼을 클릭하면 Jira 이슈를 생성할 수 있다. 아래와 같이 작성한다.

  • 프로젝트: Community Support - Open Source Project Repository Hosting (OSSRH)
  • 이슈 유형: New Project
  • 요약: 프로젝트 제목
  • Group Id: 배포시 패키지명 앞에 붙을 그룹ID. 본인 도메인이나 깃헙 도메인을 사용할 수 있다. 자세한 것은 링크 참고. 깃헙 도메인 사용시 반드시 io.github.* 형태로 적어야 한다.
    ex) io.github.maratangsoft
  • Project URL: 프로젝트를 올린 깃헙 레포지토리 URL (private으로 해놔도 상관없는 듯하다)
    ex) https://github.com/maratangsoft/MyLibrary
  • SCM url: git으로 소스코드에 접근할 수 있는 URL
    ex) https://github.com/maratangsoft/MyLibrary.git

이슈를 생성하면 봇이 자동으로 입력 내용을 검증하며, Group Id가 본인 소유가 맞는지 입증하는 절차를 댓글을 통해 진행한다. 나는 io.github을 사용했는데, 이슈 id (ex.OSSRH-88382) 와 같은 이름의 레포지토리를 해당 깃헙 레포지토리에 추가하는 식으로 입증 절차가 진행되었다.

절차가 끝나서 이슈의 상태가 '해결됨(RESOLVED)' 이 되면 이제 Nexus Manager를 통해 메이븐 저장소를 이용할 수 있다.
Nexus Repository Manager 링크에 접속해서 아까 적은 username과 password로 로그인한다.

2. GPG키 생성 및 키 서버 전송

메이븐 저장소에 라이브러리를 배포하려면 인증용 GPG키가 필요하다. Mac 사용자는 링크를 참고하고, 여기서는 윈도우 사용자를 위해 GPG4Win 툴을 사용할 것이다.

GPG4Win 다운로드

GnuPG 하나만 깔면 된다. Kleopatra는 GUI로 키를 관리해 주는 툴인데, 우리가 만들어야 하는 .gpg파일은 어차피 CLI를 써서 만들어야 하니 설치할 필요 없다. cmd창을 켜고 (환경변수는 자동 추가됨) 아래와 같이 키를 생성한다.

gpg --full-gen-key

그러면 키 옵션 설정이 이어진다. 이 중 키 암호는 코드에 적어넣어야 하므로 기억해둘 것.

  • 암호화 방식: 1 (RSA and RSA)
  • 키 길이: 4096
  • 키 유효기간: 0 (무기한)
  • 이름, 이메일, 코멘트(필수 아님)
  • 키 암호 (passphrase)

키 생성이 완료되면 아래 명령어로 키를 확인한다.

gpg --list-keys --keyid-format short

그러면 아래처럼 공개키가 표시되는데, 첫 줄의 rsa4096/ 뒤에 오는 8자리 문자열을 앞으로 이 키의 식별자로 사용할 것이다.

pub   rsa4096/ASDF1234 2023-01-31 [SC]
      2134KHJKSFGHSHFASDF1234 (예시)
uid         [ultimate] maratangsoft <maratangsoft@gmail.com>
sub   rsa4096/QWER5678 2023-01-31 [E]

이제 이 키를 .gpg파일로 내보내기하면 현재 cmd에서 가리키는 디렉토리에 파일이 생성된다.

gpg --export-secret-keys ASDF1234 > secring.gpg

마지막으로 이 공개키를 키 서버에 등록한다.

gpg --keyserver keyserver.ubuntu.com --send-keys ASDF1234

3. 배포 스크립트 작성

업로드할 프로젝트의 Local.properties

1,2에서 얻은 인증 정보를 기입한다. 이 정보는 공개되면 안 되므로 git으로 관리되지 않게(==gitignore로) 만들어야 한다. (Android Studio는 기본적으로 Local.properties를 gitignore 시킨다)

signing.keyId=[GPG공개키(8자리)]
signing.password=[GPG키 암호]
signing.secretKeyRingFile=[.gpg 파일 위치]
ossrhUsername=[Nexus Manager 유저네임]
ossrhPassword=[Nexus Manager 암호]

업로드할 모듈의 build.gradle

배포 작업의 세부사항을 지시하는 스크립트를 추가해 준다. Groovy 언어와 Kotlin 언어를 쓸 수 있는데 나는 Groovy로 코드를 작성했다. Kotlin 코드는 링크 참고.

plugins {
	...
    id 'com.android.library'	// 안드로이드 라이브러리임을 나타내는 플러그인
    id 'maven-publish'			// 메이븐 배포용 플러그인
    id 'signing'				// 서명용 플러그인
}

// 프로젝트 정보
group 'io.github.maratangsoft'
version '0.1'

// Local.properties에 기입한 인증 정보를 받아오기 위한 extra변수 선언
ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''

// 메이븐 배포 작업 지시사항
afterEvaluate {

	// Local.properties 파일에 기입한 인증 정보를 가져와서 extra변수에 넣기
    File secretPropsFile = project.rootProject.file("local.properties")
    if (secretPropsFile.exists()){
        Properties p = new Properties()
        new FileInputStream(secretPropsFile).withCloseable { fis -> p.load(fis)}
        p.each { key, value -> ext[key.toString()] = value }
    }
	
    // 배포하기
    publishing {
    
    	// 배포할 레포지토리 지정
        repositories {
            maven {
                name 'sonatype'
                url 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
                
                // 인증 정보 기입 (nexus manager 계정)
                credentials {
                    username ossrhUsername
                    password ossrhPassword
                }
            }
        }
        
		// 배포할 아티팩트의 정보
        publications {
            release(MavenPublication){
                from components.release
				
                // dependencies로 표시될 문자열 (ex. io.github.maratangsoft:maratangsdk:0.1)
                groupId 'io.github.maratangsoft'
                artifactId 'maratangsdk'
                version '0.1'

				// 상세정보
                pom {
                    name = 'maratangsdk'
                    description = 'SDK for Android Mobile Games'
                    url = 'https://github.com/maratangsoft/MyLibrary'
                    licenses {
                        license {
                            name = 'Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            id = 'maratandsoft'
                            name = 'Jonghwan Choi'
                            email = 'maratangsoft@gmail.com'
                        }
                    }
                    scm {
                        url = 'https://github.com/maratangsoft/MyLibrary.git'
                    }
                }
            }
        }
    }
}

// 서명 작업 지시사항
signing {
    sign publishing.publications
}

4. 라이브러리 파일 업로드

터미널 (윈도우는 cmd 등) 창에서 cd 명령어로 업로드할 프로젝트 폴더로 이동한다.
ex)

cd C:\Users\maratangsoft\AndroidStudioProjects\MyLibrary

그리고 아래와 같이 배포 명령을 내리면 3의 배포 스크립트에 작성한 대로 메이븐 저장소에 모듈이 자동으로 업로드된다. 전체 프로젝트가 아니라 지정한 모듈 하나만 업로드되는 점에 주의.

./gradlew 모듈명:publishReleasePublicationToSonatypeRepository

5. Maven에 배포

업로드했다고 바로 배포가 되는 건 아니다. 1에서 로그인한 Nexus Repository Manager 사이트로 돌아간다. 업로드한 모듈이 Staging Repository (임시 저장소) 에 올라가 있고 Open 상태로 되어 있을 것이다.

상단 메뉴의 Close 를 누르면 업로드한 모듈의 검증 절차가 시작된다. 몇 분 정도 걸릴 수 있으니 기다렸다가 Refresh를 누르고 하단 메뉴에서 상태를 확인한다. 뭔가 이상이 있다면 하단 메뉴에 나오는 메시지를 읽고 조치를 취해야 한다.

Close가 성공적으로 끝났다면 이제 상단 메뉴의 Release 를 눌러서 최종적으로 배포를 마친다. 배포 결과는 1에서 Nexus Manager 회원가입할 때 썼던 이슈 페이지의 댓글로 확인할 수 있다.

이런 식으로 댓글이 달리면 배포가 성공한 것이다. 댓글에 달려 있는 링크에서 배포된 라이브러리를 확인할 수 있다. 배포한 라이브러리를 실제로 사용하려면 몇 시간 정도 기다려야 한다.

번외: 라이브러리 업데이트

3에서 버전 값을 원하는 대로 바꾼 뒤 4,5를 수행하면 된다.

참고 링크

Gradle 배포 스크립트를 Groovy언어로 작성
Gradle 배포 스크립트를 Kotlin언어로 작성

profile
유니티 게임 클라이언트 개발자를 꿈꾸는 뉴비

0개의 댓글

Powered by GraphCDN, the GraphQL CDN