본문 바로가기
개발

내부망 Nexus 저장소 이용하여 gradle & springboot 의존성 구성

by Allonsy 2022. 8. 27.
반응형

이번에 내부망(폐쇄망) Nexus 저장소에 gradle과 springboot 관련 라이브러리를 올려서 새 프로젝트를 구성했다

눈물의 여정이었던 그 과정을 한번 남겨보려고한다

기나긴 여정이지만 이 글을 끝까지 따라오신다면 성공하실 것입니다!! 저처럼 고생하지마십쇼

(그리고 더 나은 방법을 알고 계신다면 제발 이 가여운 무지렁이에게 가이드를 주십사 간곡히 청하옵니다)

 

1. Nexus Repository

maven 저장소와 동일한데, 서버에 직접 설치해서 라이브러리도 직접 올려놓고 쓴다고 보면 된다

pom.xml(maven) 또는 build.gradle(gradle) 파일에 명시해놓은 라이브러리들을 다운 받을 때 이용한다

[Nexus]

 

Nexus Repository Manager - Artifiactory Repository | Sonatype

Get repository management with Nexus Repository - manage binaries and build artifacts across your software supply chain. Learn more today.

www.sonatype.com

[Maven]

https://mvnrepository.com/repos/central

 

우리가 메이븐이나 그레이들로 빌드를 하기 위해서는 의존하는 라이브러리를 다운받아야 하는데

넥서스저장소 또는 메이븐저장소를 이용한다고 위에서 설명했다

외부망 이용이 어려운 내부망의 경우 라이브러리를 내부망으로 옮겨서 넥서스 서버에 올려줘야한다

 

2. Nexus 저장소에 라이브러리 올리기

2-1. 넥스서 저장소 ui에서 하나하나 올리기

넥스서 저장소 관리 페이지에 들어가서 한땀 한땀 올릴 수 있다

그런데 절대 그러지 말자 이 멍청한 녀석은 벌크업로드 같은 기능을 찾아볼수 없고,

우리에게 너무나 좋은 편의성을 제공하는 스프링부트는 내부적으로 너무나도 많은 의존성을 가지고 있어서 아주아주아주아주아주 많은 라이브러리들을 옮겨야한다(한땀한땀 올리려는 멍청한 노력 덕분에 스프링부트에 대해 더 잘 알게 되었다 삽질을 했으니 하나라도 배웠으면 됐다)

하지만 하나씩 올려야만 하는 아이들도 있다

(왜냐면 난 메이븐 플젝을 구성해서 그 라이브러리 기반으로 올릴 건데 그렇게하면 그레이들 라이브러리가 없거둔요..)

- gradle-7.5-bin.zip

- gradle 관련 각종 라이브러리(화이팅!!)

org.springframework.boot.gradle.plugin-2.7.2.pom

spring-boot-gradle-plugin-2.7.2.jar

gradle-enterprise-gradle-plugin-3.10.2.jar

등등등.. 다 기억이 나지 않사옵니다.. 필요한거 찾아서 옮기십시오 응원하겠슴다

 

2-2. API와 스크립트를 이용하여 벌크업로드 하기

다행히도 Nexus는 업로드 API를 제공하고 있고, 이를 이용하여 스크립트를 작성해서 폴더째로 업로드를 할 수 있다

먼저 앞서간 선구자들의 스크립트를 인터넷에서 구할 수 있다

[주의사항]

1. gradle의 라이브러리 폴더(C:₩Users/user/.gradle/caches/modules-2/files-2.1) 안에는 이상한 해시값?으로 된 이름의 폴더가 중간에 낑겨있다 아주 쓸모없는 녀석이다 난 멍청하게도 그걸 업로드했고 한땀한땀 찾아서 삭제해주는 번거로운 수고를 주말에 해야했다

 

2. .m2 폴더의 repository 폴더(C:₩Users/user/.m2/repository)를 압축해서 내부망으로 옮긴 후 그 repository 폴더 안에 스크립트를 넣고 실행하자

.m2 폴더는 내가 올려야하는 구조 그대로 폴더가 잘 되어있다 굿굿

하지만 이렇게 올리면 gradle 관련한 의존들은 직접 올려야했다

나는 샘플로 메이븐프로젝트를 하나 구성해서 내가 필요로 하는 라이브러리들을 pom.xml에 넣어서 메이븐 저장소에서 다운 받게 해준다. 이렇게 .m2에 해당 라이브러리가 들어가게끔한 후 .m2 폴더 하위의 repository 폴더를 압축했다. 이 때 필요하다 싶은 라이브러리들을 모두 넣어서 다운받아줘야지 여러번 반복하는 번거로운 짓을 하지 않아도된다(나는 했다는 이야기이다)

 

요약

1. 외부망이 가능한 곳에서 샘플 메이븐 프로젝트를 만들고 pom.xml에 필요로 하는 라이브러리 몽땅 집어넣기

2. 메이븐저장소에서 다운이 완료되면 .m2 폴더 하위의 repository 폴더 압축

3. 외부망으로 repository 파일 옮겨서 압축 해제

4. 벌크 업로드 스크립트를 작성해서 실행

 

파일명 : mavenimport.sh

#!/bin/bash

while getopts ":r:u:p" opt; do
	case $opt in
    	r) REPO_URL="$OPTARG"
        ;;
        u) USERNAME="$OPTARG"
        ;;
        p) PASSWORD="$OPTARG"
        ;;
    esac
done

find . -type f -not -path './mavenimport\.sh*' -not -pash '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml*' -not -path '*/\^maven\-metadata\-deployment*\.xml*' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;

스크립트 실행 명령어 

./mavenimport.sh -u 넥서스아이디 -p 넥서스비밀번호 -r 넥서스저장소주소

 

3. gradle.properties 파일 생성 및 작성

프로젝트 루트 경로 또는 gradle 홈 경로 하위에 gradle.properties 파일을 생성하고 아래 내용을 채워준다

단계를 더 진행하면서 계속 설명하겠지만

systemProp은 gradle-wrapper.properties에서 사용할 프라퍼티이고,

repoUser, repoPassword는 플러그인과 라이브러리를 받을 때 사용할 프라퍼티다.

물론 해당하는 위치에 프라퍼티를 사용하지 않고, 인증 정보를 플레인텍스트로 넣어도 되지만, 그 파일을 git에 올리는 것은 깨름칙한 일이다

인증정보는 개개인의 properties 파일에 작성해서 사용하고, gradle.properties 파일은 git에 올리지 않도록 하자!!!!!!!

#wrapper authentication
systemProp.gradle.wrapperUser=넥서스아이디
systemProp.gradle.wrapperPassword=넥서스비밀번호
#repository authentication
repoUsername=넥서스아이디
repoPassword=넥서스비밀번호

인증 관련 프라퍼티 설정을 하는데도 기나긴 삽질을 하였는데, 퍼블릭 저장소라면 이런 삽질을 하지 않아도 될듯하다

4. gradle-wrapper.properties 파일 수정

내부망(폐쇄망)의 경우 gradle-7.5-bin.zip 파일을 외부에서 받아올 수 없으므로 넥서스 저장소에서 내려받도록 수정해줘야한다

gradle-7.5-bin.zip 파일을 올려준 경로로 수정수정! 상세주소는 각자 다를 수 있다

 

distributionUrl=http\://넥서스저장소주소/gradle-7.5-bin.zip

 

이 때 해당 파일을 올려둔 경로가 퍼블릭한 곳이 아니라 계정정보가 필요하다면 별도로 시스템 프라퍼티를 추가해줘야한다

1. 자바 옵션으로 넣어준다(난 이렇게 하지 않아서 패쓰 찾아보면 나옴)

2. 프로젝트 루트 경로 또는 그레이들 홈 경로 하위에 gradle.properties 파일을 만들어서 정보를 적어준다(바로 위에 있는 그것)

 

gradle-wrapper.properties에서 사용하는 프라퍼티는 시스템 프라퍼티라는 점이 특이했다

#wrapper authentication
systemProp.gradle.wrapperUser=넥서스아이디
systemProp.gradle.wrapperPassword=넥서스비밀번호

 

4. settings.gradle 파일 수정

build.gradle 파일 최상단 plugins 부분에는 필요한 플러그인을 명시한다

예를들어 querydsl을 사용할 예정이라면 해당 플러그인을 plugins에 적어주고, 넥서스 저장소에도 해당 플러그인을 업로드해둬야한다

[plugins 부분]

plugins {
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
    id 'java'
}

이 때 너무나도 당연하게도 우리가 이 삽질을 하는 모든 원인인 내부망!!!에서 플러그인을 내려받아야만 하므로

setting.gradle 파일에 넥서스 저장소 관련 설정을 추가해준다

이 때 credentials에 필요한 계정 정보는 우리가 제일 처음 작성해둔 gradle.properties에서 가져온다

넥서스 저장소가 http 프로토콜을 사용한다면 allowInsecureProtocl을 true 값으로 설정해준다

pluginManagement {
    repositories {
    	maven {
        	allowInsecureProtocol true
            credentials {
            	username repoUsername
                password repoPassword
            }
            url '넥서스저장소 url'
        }
    }
}
rootProject.name = 'projectname'

5. build.gradle 파일 수정

repositories 부분은 아래와 같이 수정해준다

기존에는 reporitories에 mavenCentral()이라고 되어있을 것이다

이것을 우리의 넥서스를 바라보게끔 설정해준다(지금 보니 setting.gradle에 적어둔것과 동일하군..)

authentication의 basic(BasicAuthentication)은 아이디/비밀번호를 이용한 인증이라는 뜻이다

repositories {
    maven {
        allowInsecureProtocol true
        credentials {
            username repoUsername
            password repoPassword
        }
        url '넥서스저장소 url'
        authentication {
            basic(BasicAuthentication)
        }
    }
}

라이브러리야 원하는 것들을 적어주면 되고 이제 빌드를 했을 때 성공을 하면 된 것이다!!

제발 부디 이 글을 읽고 따라하신 모든 분들이 모두 한번에 성공하길 기원하며 포스팅을 마친다🙏

 

해피해피하십시오😊

반응형

댓글