SVN을 사용하는 프로젝트에 Jenkins를 연결하여 자동화 배포를 실행하려고 한다.
SVN Repo 계정 Credentials를 생성한다.
Jenkins Subversion 플러그인 다운로드
Jenkins job 생성(프리스타일 파이프라인)
job - General - 소스코드관리 - Subversion && Build Steps - Invoke top-level Maven targets 설정(Goals clean install, 고급 POM pom.xml(루트 경로))
Triggers - 빌드를 원격으로 유발(token: test) 나중에 적혀있는 데로 사용해야한다.
Jenkins에서 빌드를 실행하기 위해 API TOKEN 생성
ViseualSVN Server - Repo - 프로젝트 우 클릭 후 Hooks - post commit - edit - 5번 젠킨스 url 작성
@echo off
REM 로그 남기기 (실패 원인 확인용)
echo %DATE% %TIME% Starting Jenkins build >> C:\temp\svn-hook.log
REM Jenkins 빌드 트리거
"C:\Windows\System32\curl.exe" -u USERNAME:APITOKEN "http://localhost:8080/job/project/build?token=token" >> C:\temp\svn-hook.log 2>&1
echo %DATE% %TIME% Finished Jenkins build >> C:\temp\svn-hook.log
svn 커밋을 실행하면 Jenkins 빌드가 실행된다.
SVN Repo 계정 Credentials를 생성한다.
Jenkins Subversion 플러그인 다운로드
Jenkins job 생성(단일 파이프라인)
job - Triggers - 빌드를 원격으로 유발 - token 생성
Pipeline - Pipeline script from SCM - 설정
ViseualSVN Server - Repo - 프로젝트 우 클릭 후 Hooks - post commit - edit - 4번 젠킨스 url 작성
@echo off
REM 로그 남기기 (실패 원인 확인용)
echo %DATE% %TIME% Starting Jenkins build >> C:\temp\svn-hook.log
REM Jenkins 빌드 트리거
"C:\Windows\System32\curl.exe" -u USERNAME:APITOKEN "http://localhost:8080/job/project/build?token=token" >> C:\temp\svn-hook.log 2>&1
echo %DATE% %TIME% Finished Jenkins build >> C:\temp\svn-hook.log
Jenkinsfile 생성
pipeline {
agent any
environment {
SVN_URL = credentials('svn-url') // Secret Text ID
}
stages {
stage('Checkout from SVN') {
steps {
echo 'SVN에서 소스 체크아웃 중...'
checkout([
$class: 'SubversionSCM',
locations: [[
credentialsId: 'svn-credential', // SVN 사용자 인증용 Credential
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: env.SVN_URL // Secret Text로 넣은 URL
]],
quietOperation: false,
workspaceUpdater: [$class: 'UpdateUpdater']
])
}
}
stage('Show Changed Files') {
steps {
echo '=== 커밋된 파일 목록 ==='
script {
def changeLogSets = currentBuild.changeSets
if (changeLogSets.size() == 0) {
echo "변경 사항 없음"
} else {
changeLogSets.each { changeSet ->
changeSet.items.each { entry ->
echo "\n커밋 메시지: ${entry.msg}"
echo "변경된 파일:"
entry.affectedPaths.each { path ->
echo " ${path}"
}
}
}
}
}
}
}
}
post {
success {
echo '✅ 빌드 성공!'
}
}
}