프로그래밍/Android

[안드로이드] MyMavenRepo로 Private Repository 라이브러리 무료 배포하기

Lou Park 2024. 4. 24. 12:10

Jitpack에서 MyMavenRepo로...

안드로이드 SDK 프로토 타입을 개발중인데, 개발한 SDK를 프로덕트에 붙이려니 aar 파일로 직접 배포하는 방식은 아무래도 귀찮았다. 처음엔 자료가 많은 jitpack으로 시작을 했었는데 jitpack은 Private Repository에 대해서는 요금을 부과한다. 무료체험이 끝나니 최소 월 $12를 지불해야했다. 회사에 청구할까 고민했지만 이런 문제를 해결하는 것도 재미있겠다 싶어서 짧게 서치하니 MyMavenRepo라는 무료 플랜이있는 MavenRepository를 발견했다.

MyMavenRepo의 요금제

 

Step 1. 가입하고 인증하기

세상에서 가장 심플한 Register

 

먼저 Register를 눌러 유효한 이메일 주소와 MyMavenRepo에서 사용할 Password를 입력해서 가입한다.

비밀번호 확인? Username? 그딴거 없고 딱 두개만 적으면 된다. 

그러면 해당 이메일 주소로 확인 이메일이 날아올 것이다. 여기서 "here"를 눌러 인증을 완료해야 Repository를 사용할 수있는 권한이 활성화된다. 처음에 인증 안하고 바로 사용하려 했다가 403 Forbidden 떠서 도대체 왜일까... 오래 헤맸다. ㅋㅋㅋ

 

Step 2. Repo에 라이브러리를 업로드

티스토리 모자이크나 블러하면 오류걸리네요...어쩔수없지만 어피치로 가립니다.

 

처음에 무료로 제공되는 Repo로 들어가게 되면 Read Url과 Write Url이 각각 제공된다.

업로드는 WriteUrl로, 다운로드는 Read Url로 하며, Enable HTTP Auth를 활성화 하게 되면 해당 credential을 이용하여 인증된 곳에서만 사용가능하도록 제한할 수 있다. 예시로 Write Url에 대한 Auth를 활성화 시켜보겠다.

Enable HTTP Auth를 클릭하고, Add User를 해서 CRUD 권한이있는 myMavenRepo라는 User를 등록해두었다.

 

 

이제 라이브러리 프로젝트의 gradle.properties에 다음과 같이 등록해준다.

꼭 gradle.properties는 아니어도 되고, 본인이 편한 곳에...

 

 

다음은 업로드할 라이브러리의 build.gradle.kts 세팅이다.

afterEvaluate {
    publishing {
        repositories {
            maven {
                url = uri(providers.gradleProperty("myMavenRepoWriteUrl"))
                credentials {
                    username = providers.gradleProperty("myMavenRepoUsername").get()
                    password = providers.gradleProperty("myMavenRepoPassword").get()
                }
            }
        }
        publications {
            create<MavenPublication>("release") {
                groupId = "com.sample"
                artifactId = "loki"
                version = "0.0.8"
                from(components["release"])
            }
        }
    }
}

 

아까 등록한 gradle.properties 값을 읽어 업로드할 MavenRepository에 대한 세팅을 해준다.

적절한 groupId, artifactId, version을 설정해주게 되면 "com.sample:loki:0.0.8"과 같은 식으로 라이브러리를 사용할 수 있다.

 

세팅이 완료되면 publish Task를 통해 Publish를 할 수 있다.

그리고 라이브러리 배포시 샘플 앱 모듈을 빼는 꿀팁을 하나 드리자면 settings.gradle.kts에서 특정 ENV 값이 없을때만 샘플 앱을 include하는 식으로 바꿔두면 된다. "PUBLISH"는 그냥 임의로 내가 세팅해둔것.

include("your-library-module")

if (System.getenv("PUBLISH") == null) {
    include("your-sample-app-module")
}
$ ./gradlew publish // 샘플앱이 포함됨
$ PUBLISH=1 ./gradlew publish // 샘플앱이 포함되지 않음

 

각자의 상황에 맞게 publish를 수행해주면 업로드 완료-!

 

Step 3. 라이브러리 사용하기

이제 Read Url을 확인해보면 버전별로 내 라이브러리가 업로드 된 것을 확인할 수 있다.

 

해당 라이브러리를 사용하려는 프로젝트의 gradle.properties에도 Read Url을 등록해주고, (원한다면 Auth까지...)

repositories {
    google()
    mavenCentral()
    // ...
    maven {
        url = uri(providers.gradleProperty("myMavenRepo.readUrl"))
    }
}

 

참조할 Repositories에다가 나의 MavenRepo를 추가 등록해주고, 사용할 모듈에서 implement하면 끝-!

dependencies {
	implementation("com.sample:loki:0.0.8")
}

 

 

심화 : 배포 스크립트 작성

매번 ./gradlew publish 치고~ git tag 만들어주고~ 귀찮은 작업을 일일이 해줄 수 없으니 모든 걸 한번에 해주는 스크립트를 작성해두면 편하다. 특히 Jitpack은 배포를 위해서 반드시 tag를 생성하도록 강제하는데, MyMavenRepo는 그렇지 않기때문에 tag를 만드는 것 까지 자동화 해두면 나중에 문제가 생겼을때 보기 쉽다.

 

Github Release까지 해주는 gh를 이용하면 더 편해질거다.

tasks.register("getVersionName") {
    doLast {
        println(libs.versions.sdk.version.get().toString())
    }
}
#!/usr/bin/env bash
versionName=$(./gradlew :<your module>:getVersionName -q | tail -1)
echo "versionName: $versionName"

if PUBLISH=1 ./gradlew clean publish; then
    echo "Publish successful. Creating Git tag..."
    git tag -a "$versionName" -m "Release version $versionName"
    git push origin "$versionName"
else
    echo "Publish failed. Git tag will not be created."
fi