윈도우 11 사용자 홈의 gradle 레포지토리를 ssh를 이용하여 nexus서버에 올리는 방법

일반적으로 Nexus Repository Manager는 HTTP/HTTPS 프로토콜을 통해 아티팩트(Artifact)를 업로드하도록 설계되어 있습니다. “SSH를 이용한다”는 것은 보통 보안상의 이유로 방화벽 뒤에 있는 Nexus 서버에 접근해야 하거나, 전송 계층을 암호화하기 위해 **SSH 터널링(Port Forwarding)**을 사용한다는 의미가 가장 큽니다.

Windows 11 환경에서 SSH 터널링을 통해 로컬 포트를 원격 Nexus 서버로 연결하고, Gradle이 이를 통해 배포(Publish)하는 단계를 정리해 드립니다.


1. 사전 준비 사항

  • Windows 11 OpenSSH 클라이언트: Windows 11은 기본적으로 터미널(PowerShell/CMD)에서 ssh 명령어를 지원합니다.

  • Nexus 접속 정보:

    • Nexus 서버 IP (예: 192.168.0.100)

    • Nexus 포트 (보통 8081)

    • SSH 접속 계정 (예: linux_user)

    • Nexus 로그인 계정 (예: admin / password)


2. 단계별 설정 가이드

1단계: SSH 터널링 연결 (PowerShell)

먼저 윈도우 터미널을 열고, 내 컴퓨터의 특정 포트(예: 8888)를 통해 원격 Nexus 서버의 포트(8081)로 접속할 수 있도록 터널을 뚫습니다.

  1. PowerShell 또는 **명령 프롬프트(CMD)**를 엽니다.

  2. 아래 명령어를 입력합니다.

PowerShell

# 형식: ssh -L [로컬포트]:localhost:[원격Nexus포트] [SSH계정]@[원격서버IP]
ssh -L 8888:localhost:8081 user@192.168.0.100

설명:

  • -L 8888:localhost:8081: 내 컴퓨터의 8888 포트로 들어오는 신호를 SSH 터널을 타고 원격 서버의 localhost:8081(Nexus)로 전달합니다.

  • 만약 Nexus가 원격 서버 내부의 Docker 등에서 다른 IP로 돌고 있다면 localhost 대신 해당 내부 IP를 적어야 합니다.

  • 명령어 입력 후 SSH 비밀번호를 입력하여 접속 상태를 유지합니다 (창을 끄지 마세요).


2단계: Gradle 빌드 스크립트 설정 (build.gradle)

이제 Gradle은 원격 서버 주소가 아닌, **내 컴퓨터의 로컬 포트(8888)**로 아티팩트를 쏘면 됩니다.

프로젝트의 build.gradle (또는 build.gradle.kts) 파일에 maven-publish 설정을 추가합니다.

Groovy DSL (build.gradle)

Groovy

plugins {
    id 'java'
    id 'maven-publish'
}

group = 'com.example'
version = '1.0.0'

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            // 중요: SSH 터널링을 통해 연결된 로컬 포트를 지정합니다.
            // Nexus 리포지토리 URL 경로는 실제 Nexus 설정에 따라 다를 수 있습니다 (보통 /repository/[리포지토리명]/)
            url = uri("http://localhost:8888/repository/maven-releases/")
            
            // 만약 스냅샷 버전이라면 분기 처리 가능
            // url = version.endsWith('SNAPSHOT') 
            //       ? uri("http://localhost:8888/repository/maven-snapshots/") 
            //       : uri("http://localhost:8888/repository/maven-releases/")

            allowInsecureProtocol = true // 로컬호스트(http) 전송 허용

            credentials {
                username = project.findProperty("nexusUsername") ?: "admin"
                password = project.findProperty("nexusPassword") ?: "admin123"
            }
        }
    }
}

3단계: 인증 정보 보안 설정 (gradle.properties)

소스 코드에 ID/PW를 노출하지 않기 위해, 사용자 홈 디렉토리의 gradle.properties에 Nexus 계정 정보를 저장하는 것이 좋습니다.

  1. 경로: C:\Users\[사용자명]\.gradle\gradle.properties 파일을 엽니다 (없으면 생성).

  2. 다음 내용을 추가합니다.

Properties

nexusUsername=my_nexus_id
nexusPassword=my_nexus_password

4단계: 배포 실행

윈도우 11 사용자 홈의 gradle 레포지토리를 ssh를 이용하여 nexus서버에 올리는 방법

이제 터널링이 켜져 있는 상태에서 Gradle 명령어를 실행하여 배포합니다.

  1. 새로운 터미널 창을 엽니다 (SSH가 실행 중인 창은 놔둡니다).

  2. 프로젝트 경로로 이동하여 배포 명령을 실행합니다.

PowerShell

./gradlew publish

성공 확인:

  • 빌드가 BUILD SUCCESSFUL로 끝나야 합니다.

  • SSH 터미널 창을 보면 데이터가 전송되는 로그나 반응이 있을 수 있습니다.

  • Nexus 웹 콘솔(http://localhost:8888 또는 실제 원격 주소)에 접속하여 아티팩트가 올라갔는지 확인합니다.


요약: 작동 원리

  1. Windows(Local): Gradle이 http://localhost:8888로 JAR 파일을 보냄.

  2. SSH Tunnel: 이 요청을 암호화하여 22번 포트(SSH)를 통해 원격 리눅스 서버로 전송.

  3. Linux(Remote): SSH 데몬이 패킷을 받아 복호화한 뒤, 서버 내부의 localhost:8081(Nexus)로 전달.

  4. Nexus: 일반적인 HTTP 요청으로 인식하고 파일 저장.

(참고) 만약 “SFTP 프로토콜” 자체를 사용하려는 경우

Nexus가 아닌 단순 파일 서버에 업로드하거나, Nexus가 파일 시스템을 감지하도록 설정된 특수한 경우에는 Gradle에서 wagon-ssh를 사용할 수 있습니다. 하지만 이는 표준적인 Nexus 사용법이 아니며, Nexus는 보통 REST API(HTTP)를 통한 업로드를 권장합니다. 위 터널링 방식이 가장 표준적이고 안전한 방법입니다.


이 과정 중 SSH 접속이 거부되거나 포트가 막혀있다면 방화벽 설정을 먼저 확인해보시기 바랍니다.