[Gradle] github repo 라이브러리로 임포트하기

정지수 JisooJung·2022년 7월 26일
1

Gradle 프로젝트로 간단한 라이브러리를어 SpringBoot + Kotlin 프로젝트에 디펜던시로 등록해보자. 작업은 Intellij IDEA 2022.1.4 (Ultimate Edition) 에서 진행하였다. 미리 말하자면 그닥 추천하지는 않는 방법이다. (아래 여담 참조)

Public Repository


1. Gradle 프로젝트 github에 푸시

  • 예시로 Gradle + Kotlin 으로 yaml 파일에서 데이터를 불러와 출력하는 간단한 프로젝트를 생성하였다. 코드는 아래와 같다.

    import com.fasterxml.jackson.databind.ObjectMapper
    import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
    import com.fasterxml.jackson.module.kotlin.KotlinModule
    import java.io.File
    
    val mapper: ObjectMapper = ObjectMapper(YAMLFactory()).registerModule(KotlinModule.Builder().build())
    val data = mapper.readValue(File("src/main/resources/application.yml"), HashMap::class.java)
    
    fun greeting() = "Hello ${data["name"] ?: "everybody"}!"

    전체 코드는 여기서 볼 수 있다.

  • 레포에 푸시 후 아래와 같이 릴리즈 버전을 등록해주어야 한다.

2. settings.gradle.kts 설정

  • 라이브러리를 임포트 하려는 프로젝트의 settings.gradle.kts에 아래 코드를 추가한다.
    sourceControl {
        gitRepository(uri("https://github.com/jiso0jung/gradle-gitrepo-dependencies-test")) {
            producesModule("org.jisoo:gradle-gitrepo-dependencies-test")
        }
    }

3. build.gradle.kts 설정

  • 위 코드에서 정의한 모듈을 디펜던시에 추가한다.
    dependencies {
        ...
        implementation("org.jisoo:gradle-gitrepo-dependencies-test:1.0")
        ...
    }

4. 빌드

  • gradle 빌드 후 좌측 바에 있는 External Libraries를 확인하면 아래와 같이 임포트 된 것을 확인할 수 있다. 만약 임포트 되지 않는다면 gradle clean 후 다시 빌드해보자.

5. 임포트한 라이브러리 사용

  • 아래와 같이 파일 내에서 라이브러리의 메소드를 임포트해 사용할 수 있다.

    import greeting
    import org.assertj.core.api.Assertions.assertThat
    import org.junit.jupiter.api.Test
    
    class IntegrationTest {
    
        @Test
        fun `인사한다`() {
            assertThat(greeting()).isEqualTo("Hello everybody!")
        }
    }
    



Private Repository


private repository도 라이브러리로 임포트 할 수 있지만, 별도 github 키 설정이 필요하다.

1. ssh 키 생성

  • 타입을 rsa가 아니라 ecdsa로, 구버전으로 지정하여 생성해야 한다. ~/.rsa 경로에서 생성하며, 명령어는 다음과 같다. ssh-keygen -t ecdsa -m pem

    • 참고) 왜 구버전 ecdsa 키를 사용해야 하는걸까?
      github 레포를 불러올 때 jgit이라는 라이브러리를 사용하는데, jgit에서는 새로운 키 포맷을 해석하지 못한다(지원이 끝났기 때문에 앞으로도 못할 예정..😭). 구버전, 신버전 포맷은 키 파일 헤더에서 구분할 수 있다.

      ## 신버전 헤더
      -----BEGIN OPENSSH PRIVATE KEY----- 
      
      ## 구버전 헤더
      -----BEGIN RSA PRIVATE KEY-----

      그렇다고 구버전 RSA 키를 사용할 수는 없다. 깃헙이 구버전 키를 허용하지 않기 때문이다. 따라서 구버전 ecsdsa 키를 별도로 생성해 설정이 필요하다. 이와 관련된 이슈는 여기를 참고하자.

2. github에 키 등록

  • ~/.rsa/id_ecdsa.pub 내용을 복사해, Github > Settings > SSH and GPG Keys > New SSH key 에 들어가 등록한다. Settings는 깃헙 페이지 우측 상단 아이콘을 누르면 확인할 수 있다.

3. config 생성

  • ~/.rsa 경로에 config 파일을 생성한다. 여러 방법이 있겠지만 나는 vi config 명령어로 파일 생성 및 편집을 하였다. 파일 내용은 아래와 같다.
    Host github.com
        User git
        IdentityFile ~/.ssh/id_ecdsa

4. settings.gradle.kts 설정

  • 라이브러리를 임포트 하려는 프로젝트의 settings.gradle.kts에 아래 코드를 추가한다. 경로 앞에 ssh://가 붙는다는 점과, git@github.com 뒤에 콜론이 아닌 슬래시가 온다는 점을 확인하자.
    sourceControl {
        gitRepository(uri("ssh://git@github.com/jiso0jung/gradle-gitrepo-dependencies-test.git")) {
            producesModule("org.jisoo:gradle-gitrepo-dependencies-test")
        }
    }

나머지는 public repository 과정과 같다!


여담)
간단한 방법 같아서 깃헙 레포로 임포트 해보기는 했는데, 지원이 끝난 라이브러리를 사용하는 방법이라 실무에 적용하면 안될 것 같다...그래도 삽질한 시간이 아까워 작성해 보았다. 좋은 경험 했다 치고 웬만하면 jcenter를 써 보자!

참고링크
https://stackoverflow.com/questions/18748436/is-it-possible-to-declare-git-repository-as-dependency-in-android-gradle/56787382#56787382
https://stackoverflow.com/questions/53134212/invalid-privatekey-when-using-jsch/55740276#55740276
https://www.eclipse.org/forums/index.php/t/1110330/

profile
Study&Work&Log

0개의 댓글