글
Maven Central 에 라이브러리 올리기
최근에 오픈 소스 작업 해야겠다! 라고 맘 먹은 것이 있었는데 최종 결과물을 메이븐 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 에 올라가는 라이브러리는 매우 신중히 작업해주시기 바랍니다.
누군가는 그 라이브러리로 작업을 하기 때문에 지원을 더이상 하지 않는다면 공지를 해줘야겠죠.
호기심 반 뿌듯함 반으로 작업을 했는데 생각보다 감당하기 어려운 책임감이 느껴지네요.
'개발 이야기' 카테고리의 다른 글
Maven Central 에 라이브러리 올리기 (3) | 2014.08.08 |
---|---|
Android PlayStore Publisher Sample 동작 (0) | 2014.08.02 |
Android-Gradle-Robolectric 테스트용 iml 파일 자동 설정하기 (0) | 2014.07.23 |
Robolectric 에서 SupoortFragment 사용하기 (0) | 2014.07.10 |
Robolectric 에서 Activity 테스트하기 (0) | 2014.07.10 |
Android-Gradle-Robolectric 에서 Sqlite DB 테스트 하기 (0) | 2014.06.30 |
글
Android PlayStore Publisher Sample 동작
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 를 삭제 후 진행해주시기 바랍니다.
'개발 이야기' 카테고리의 다른 글
Maven Central 에 라이브러리 올리기 (3) | 2014.08.08 |
---|---|
Android PlayStore Publisher Sample 동작 (0) | 2014.08.02 |
Android-Gradle-Robolectric 테스트용 iml 파일 자동 설정하기 (0) | 2014.07.23 |
Robolectric 에서 SupoortFragment 사용하기 (0) | 2014.07.10 |
Robolectric 에서 Activity 테스트하기 (0) | 2014.07.10 |
Android-Gradle-Robolectric 에서 Sqlite DB 테스트 하기 (0) | 2014.06.30 |
글
Android-Gradle-Robolectric 테스트용 iml 파일 자동 설정하기
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
를 통해 공유됩니다.
'개발 이야기' 카테고리의 다른 글
Maven Central 에 라이브러리 올리기 (3) | 2014.08.08 |
---|---|
Android PlayStore Publisher Sample 동작 (0) | 2014.08.02 |
Android-Gradle-Robolectric 테스트용 iml 파일 자동 설정하기 (0) | 2014.07.23 |
Robolectric 에서 SupoortFragment 사용하기 (0) | 2014.07.10 |
Robolectric 에서 Activity 테스트하기 (0) | 2014.07.10 |
Android-Gradle-Robolectric 에서 Sqlite DB 테스트 하기 (0) | 2014.06.30 |
좋은 글 감사합니다! 퍼가도 될까요?
네 ^^ 출처만 밝혀주시면 괜찮습니다.
좋은 글 감사합니다.