일반적으로 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)로 접속할 수 있도록 터널을 뚫습니다.
-
PowerShell 또는 **명령 프롬프트(CMD)**를 엽니다.
-
아래 명령어를 입력합니다.
# 형식: 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)
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 계정 정보를 저장하는 것이 좋습니다.
-
경로:
C:\Users\[사용자명]\.gradle\gradle.properties파일을 엽니다 (없으면 생성). -
다음 내용을 추가합니다.
nexusUsername=my_nexus_id
nexusPassword=my_nexus_password
4단계: 배포 실행

이제 터널링이 켜져 있는 상태에서 Gradle 명령어를 실행하여 배포합니다.
-
새로운 터미널 창을 엽니다 (SSH가 실행 중인 창은 놔둡니다).
-
프로젝트 경로로 이동하여 배포 명령을 실행합니다.
./gradlew publish
성공 확인:
-
빌드가
BUILD SUCCESSFUL로 끝나야 합니다. -
SSH 터미널 창을 보면 데이터가 전송되는 로그나 반응이 있을 수 있습니다.
-
Nexus 웹 콘솔(
http://localhost:8888또는 실제 원격 주소)에 접속하여 아티팩트가 올라갔는지 확인합니다.
요약: 작동 원리
-
Windows(Local): Gradle이
http://localhost:8888로 JAR 파일을 보냄. -
SSH Tunnel: 이 요청을 암호화하여
22번 포트(SSH)를 통해 원격 리눅스 서버로 전송. -
Linux(Remote): SSH 데몬이 패킷을 받아 복호화한 뒤, 서버 내부의
localhost:8081(Nexus)로 전달. -
Nexus: 일반적인 HTTP 요청으로 인식하고 파일 저장.
(참고) 만약 “SFTP 프로토콜” 자체를 사용하려는 경우
Nexus가 아닌 단순 파일 서버에 업로드하거나, Nexus가 파일 시스템을 감지하도록 설정된 특수한 경우에는 Gradle에서 wagon-ssh를 사용할 수 있습니다. 하지만 이는 표준적인 Nexus 사용법이 아니며, Nexus는 보통 REST API(HTTP)를 통한 업로드를 권장합니다. 위 터널링 방식이 가장 표준적이고 안전한 방법입니다.
이 과정 중 SSH 접속이 거부되거나 포트가 막혀있다면 방화벽 설정을 먼저 확인해보시기 바랍니다.