Maven Central 에 라이브러리 올리기

개발 이야기 2014. 8. 8. 00:21

최근에 오픈 소스 작업 해야겠다! 라고 맘 먹은 것이 있었는데 최종 결과물을 메이븐 Central 저장소에 올리는 것이 목표였습니다.

역시나 작업은 쉽지 않더군요. 우여곡절 끝에 업로드 완성했고 생각보다 폭발적인 반응을 얻어왔는데요.

오늘은 그 고생한 이야기를 털어보고자 남깁니다.


1. 작업환경

언어 : 자바 6 +Groovy
IDE : Intellij 13+
빌드 툴 : Gradle

2. gradle 을 활용한 maven pom 파일 생성하기



groupId = com.nobrain.gradle
artifactId = gradle-play-publisher

로 설정하였습니다.

maven 이라는 플러그인을 통해서 pom 작성하는데

저장소, 라이센, 개발자 정보 등을 작성하였습니다.

참고로 mavenDeployer 에 저장된 정보들 중 일부는 maven central 업로드시 반드시 작성되어야 하는 정보가 있습니다.
(https://docs.sonatype.org/display/Repository/Central+Sync+Requirements)

uploadArchives.repositories.mavenDeployer.repository(url : uri('../repo')

라는 설정이 있는데 이는 local disk 의 ../repo 에 라이브러리를 만들겠다는 의미입니다.


이렇게 하면 가장 기본적인 작업은 완료 되습니다. 이제부터는 외부의 작업이 필요한대요...

3. PGP 등록 및 Signing 하기

maven 프로젝트는 각각이 보안이 유지되기 위해서 PGP 라는 정보를 통해서 올바른 업데이트인지를 확인하는 것으로 보입니다.
그래서 반드시 PGP 를 생성하고 서버에 등록하여야 합니다.

3-1 PGP 생성하기

https://www.gnupg.org/download/index.html 에 접속하시면 PGP 를 생성할 수 있는 툴들을 굉장히 많이 제공하고 있습니다.
그중에서 저는 PGP KeyChain Access (Only Mac) 라는 툴을 이용하여 Public 키를 생성하였습니다.
(이메일과 Full Name 을 작성하여야 합니다.)


3-2 PGP 등록하기

생성한 PGP 키는 http://pgp.mit.edu/ 사이트를 통해서 등록하여야 하는데요.
(일부 잘 되어진 툴은 업로드도 함께 제공해줍니다.)

방법은 PGP KeyChain Access 기준으로 export 시 ASCII 로 추출하시면 됩니다.
추출된 ASCII 형태의 PGP 를 메모장으로 열게 되면 


---BEGIN...---

---END...--- 

 형식으로 되어 있는데 [Submit a Key] 란에 복사 붙여넣기 후 Submit 하시면 됩니다.

3-3 PGP 로 Signing 하기

Maven Central 로 업로드시 PGP 로 Signing 하지 않으면 절대로 업로드가 안되니 반드시 진행해주시기 바랍니다.


위와 같이 작성해주시면 빌드시 자동으로 signing 이 진행됩니다.


4. jar 생성하기

./gradlew uploadArchives

를 실행하면 1 에서 설명한 '../repo' 에 jar 파일이 생성되어 있습니다.


5. maven central upload 대행 서비스 이용하기

제가 이용한 서비스는 https://bintray.com/ 라는 서비스를 통해서 mavenCentral 에 업로드를 진행하였습니다.

해당 서비스에 가입하신 후 maven repository 에 package 를 추가 -> version 을 추가 순으로 진행하시면 됩니다.

6. bintray 에 jar 파일 업로드 하기

생성된 version 에 Files 에 들어가시면 해당 웹 페이지 UI 를 통해서 업로드가 가능하도록 되어 있습니다.

먼저 $groupId/$artifactId/$version/메이븐 파일 + jar 파일 이 되어 있는데
$version/메이븐파일 압축을 합니다. 

파일 업로드시에 Target Path 를 $groupId/$artifactId/ 로 지정 후 압축 파일을 업로드하면

업로드된 file 이 $groupId/$artifactId/$version/메이븐 파일 에 된 것을 확인 하실 수 있습니다.


6. maven cetral 업로드 준비

6-1. sonatype 저장소 가입하기

5 에서 얘기한 bintray 서비스는 sonatype 을 통해서 maven central 에 sync 를 합니다. 그러기 위해서는 sonatype 에 가입이 되어야 하는데요

https://issues.sonatype.org/secure/Signup!default.jspa 을 통해서 가입을 하실 수 있습니다.


6-2. 프로젝트 생성 요청하기

로그인 후 https://issues.sonatype.org/secure/CreateIssue!default.jspa 에 접속하시면 새로운 프로젝트를 생성할 수 있도록 요청할 수 있습니다. groupId, 소스 저장소나 이슈를 프로젝트를 관리하는 URL등은 필수 사항이니 꼭 적어주시기 바랍니다.

프로젝트 생성을 요청하면 빠르면 10분 안에 생성이 되었음을 알려줍니다.
(생각보다 피드백이 빠르고 댓글로 질문시 바로바로 대답해주니 잘못된 부분은 직접 질문하는게 빠릅니다.)


7. bintray <-> maven central Sync 하기

다시 bintray 로 돌아와서 5 에서 업로드한 버전으로 이동합니다.
메뉴 중에 Maven Central 을 보실 수 있는데 sync 를 요청하면 bintray 의 자체 repository 에 업로드를 진행 한 후
maven central 에 업로드 됩니다.
maven central 에 업로드시 6-1 에서 가입한 정보를 물어보니 꼭 6-1 을 진행 후 해주시기 바랍니다

promote 권한이 없다는 오류 : 6-2 가 정상 진행되지 않은 것입니다.
3-3 이 없을 시 오류 발생 할 수 있습니다.
source.jar, docs.jar 가 미작성시에도 오류가 날 수 있습니다.


8. 업로드와 sync 가 모두 완료되면

https://oss.sonatype.org/ 의 search 에서 검색하실 수 있습니다. :)



처음 해본 것인데 국내 자료가 그다지 없어서 직접 작성해보았습니다.

그림도 없고 대략적으로 작성한거라 부족함이 많지만 그래도 라이브러리 등록에 큰 도움이 되었으면 합니다.


위의 동작은

https://github.com/ZeroBrain/gradle-play-publisher 을 업로드하는 과정에서 얻은 경험을 토대로 작성하였습니다.


Maven Central 에 올라가는 라이브러리는 매우 신중히 작업해주시기 바랍니다.
누군가는 그 라이브러리로 작업을 하기 때문에 지원을 더이상 하지 않는다면 공지를 해줘야겠죠.

호기심 반 뿌듯함 반으로 작업을 했는데 생각보다 감당하기 어려운 책임감이 느껴지네요.

설정

트랙백

댓글

Android PlayStore Publisher Sample 동작

개발 이야기 2014. 8. 2. 11:29

1. 개발환경

- 개발언어 : Java 7

- IDE : Intellij 13.+

- 환경 : Maven

- 샘플코드 저장소 (Play Publisher api sample for Java Code)

Git : https://github.com/googlesamples/android-play-publisher-api


2. Maven Dependency




3. Project SDK



 


4. Project Code Struct


 


 확인 사항

1) 샘플코드 복사 (자바 파일만..)

2) APK 파일

3)0Auth 정보

4) 메이븐 의존성 라이브러리


5. Google Developer Console (https://console.developers.google.com/project)

1) 새로운 프로젝트나 기존의 프로젝트 선택

2) APIs -> Google Play Android Developer API [ON] 으로 변경




 


3) OAuth 정보 만들기

- [OAuth - Create New Client ID] 선택




 


- Json 파일 다운로드




 


6. Project Code

1) APK 파일과 OAuth 정보 준비


 $prj.dir/src/main/resources 에 복사해두세요.




2) ApplicationConfig.java



3) AndroidPublisherHelper.java


7. Run BasicUploadApk.main()


8. Play Store Developer API <-> Google Developer API연결하기



 


API 는 구글 개발자 콘솔 뿐만 아니라 플레이스토어 콘솔에서도 연동을 허가 해야 가능합니다.


project ID 가 연결되지 않았다는 콘솔 에러가 뜬다면 반드시 연결을 확인해보시기 바랍니다.





성공하시면 아래와 같은 화면을 보실 수 있습니다.





PS API 연동을 새로 작성하시거나 인증 정보를 새로 설정하신 경우에는

$HOME/.store 를 삭제 후 진행해주시기 바랍니다.



설정

트랙백

댓글

Android-Gradle-Robolectric 테스트용 iml 파일 자동 설정하기

개발 이야기 2014. 7. 23. 00:38

Robolectric 테스트 코드를 위해서 매번 iml 을 설정해줘야 하는 번거로움이 있어서
오늘은 작정하고 테스트용 iml 을 자동 설정하도록 했습니다.


1. iml 수정용 Task 생성

task initGradleTest << {

    def imlFile = project.name + '.iml'

    def parse = new XmlParser().parse(imlFile)

    def modulePath = parse.@'external.linked.project.path'

    // It's Robolectric Default ouputPath
    def outputTestPath = "file://$modulePath/build/test-classes"
    def moduleComponent = parse.component.find { it.@name == 'NewModuleRootManager' }
    def outputTest = moduleComponent.find {it.name() == 'output-test'}

    if (outputTest != null) {
        outputTest.@url = outputTestPath
    } else {
        moduleComponent.appendNode('output-test', [url : outputTestPath])
    }

    // jdk orderEntry must be last
    def orderEntry = moduleComponent.orderEntry
    def jdkOrderEntry = orderEntry.find { it.@type == 'jdk' }
    moduleComponent.remove(jdkOrderEntry)
    moduleComponent.append(jdkOrderEntry)

    // rewrite $project.iml file
    FileWriter fileWriter = new FileWriter(imlFile)
    new XmlNodePrinter(new PrintWriter(fileWriter)).print(parse)


}


2. Gradle 빌드시 Task 동작하도록 하기

tasks.preBuild.dependsOn initGradleTest

prebuild 는 모든 Task 동작시 최초의 Android Gradle Task 입니다.

3. JUnit 테스트때마다 test-code compile 하도록 하기

 

테스트 코드가 동작할 때 Run 설정에서 Defaults -> JUnit -> Before Launch 설정에 Make 보다 compileTestDebugJava 가 동작하도록 해주십시요.

(Robolectric 에서 생성한 Task 로 1번 설정에서 해주었던 output-test 경로에 맞춰서 test-class 가 compile 됩니다)


이리 하면 이제부터 JUnit 으로 하는 Robolectric 테스트는 별다른 오류 없이 동작하는 것을 확인하실 수 있습니다.


게을러터져서는 조금만 섬세하면 되는 것을 전부 자동화 하려는 욕심에 이런것까지 하게 되었네요.
원래는 idea.module 을 손대서 아예 자동 생성하도록 하려고 했는데
아무래도 그건 무리였나보더군요. 그거 하려다가 Android-Gradle 원소스를 통째로 보고 있는 제 스스로가 느껴지니 이걸 왜 하나 싶어서 이정도만으로 만족하려고 합니다.


위의 코드는 
Github : https://github.com/ZeroBrain/Android-Sqlite-Object-Convert
를 통해 공유됩니다.

설정

트랙백

댓글