마지막 포스팅엔 파이프라인 스크립트를 공유하며 마무리 짓는다
젠킨스 플러그인 중 ssh-agent나 Publish Over SSH가 있지만 플러그인에
의존하는 것이 왠지 마음에 들지 않아 사용하지 않고 구성했다
현재 프로젝트는 변경 파일 하나하나 배포해야 했기 때문에 빌드경로나 배포경로 잡는데 시간이 좀 걸렸다
ssh 통신을 위해 sshkey를 생성하고 이를 배포할 서버에 등록한다
ssh-keygen
-> 비밀번호 없이 엔터
생성한 .ssh\id_rsa.pub을 원격 서버(dev서버) /root/.ssh/authorized_keys 에 입력
scp -r .ssh\id_rsa.pub root@호스트IP:/root/.ssh/authorized_keys
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
node {
def lastDeployCommitId // 지난번 최종 반영됐던 커밋 ID (lastDeployCommitId 파일에 저장되어 있음)
def nowDeployCommitId // 현재 반영할 git HEAD 의 커밋 ID
def workDir = 'D:\\jenkins\\deploy\\' // 로컬 실제 파일이 배포될 경로
def libDir = 'sgerp.war\\WEB-INF\\lib' // 로컬 빌드 환경
def classesDir = 'D:\\jenkins\\build\\classes' // 로컬 빌드파일 경로
def logDir = 'D:\\jenkins\\log' // log dir
def target_server = 'jbossnatg@192.168.50.222'
def target_server_root = 'root@192.168.50.222'
def wasPath = '/oradata/jbossnatg/jboss6.1.0/server/NATGERP/deploy/sgerp.war/' //NATGERP를 wasList로 변경
//def wasList = ['natgerp1', 'natgerp2', 'natgpos1', 'natgpos2', 'natgint1', 'natgint2', 'natgwms1', 'natgwms2']
def wasList = ['natgerp1']
def wasBinPath = '/oradata/jbossnatg/jboss6.1.0/bin/NATGERP.sh' //NATGERP를 wasList로 변경
def username
def commitmsg
// 1. 저장소 소스 가져오기
stage('소스 연결') {
// Get some code from a GitHub repository
// git 저장소에서 소스를 가져온다
git url: 'http://192.168.0.111/natgerp/natgerp.git', branch: 'develop', credentialsId: 'GITLAB_ROOT'
}
// 2. 기존 반영소스와 비교하여 변경점 찾기
stage('변경점 조회') {
// Check file exists
// 최종 반영됐던 커밋 ID를 보관하는 파일이 있는지 검사한다.
def existsFile = fileExists 'lastDeployCommitId'
if( existsFile ) {
lastDeployCommitId = (readFile(file: 'lastDeployCommitId', encoding: 'UTF-8')).trim()
} else {
lastDeployCommitId = powershell(script:'git rev-parse HEAD', returnStdout: true).trim()
}
nowDeployCommitId = powershell(script:'git rev-parse HEAD', returnStdout: true).trim()
username = powershell(script:' git log -1 --pretty=format:"%an"', returnStdout: true).trim()
commitmsg = powershell(script:' git log -1 --pretty=format:"%s"', returnStdout: true).trim()
println('최종커밋='+lastDeployCommitId)
println('현재커밋='+nowDeployCommitId)
// Make file to modified file list
// 수정된 내용을 감지하여 파일로 저장한다.
bat(script: """
git diff --name-only --output=modifiedList --diff-filter=AM ${lastDeployCommitId}..${nowDeployCommitId}
""")
// Make file to deleted file list
// 삭제된 내용을 감지하여 파일로 저장한다.
bat(script: """
git diff --name-only --output=deletedList --diff-filter=D ${lastDeployCommitId}..${nowDeployCommitId}
""")
}
// 3. java파일은 빌드 및 배포폴더에 복사
stage('빌드&배포파일 복사') {
// Process modefied files
// 파일을 읽어 수정된 내용을 반영한다.
isModified = (readFile(file: 'modifiedList', encoding: 'UTF-8')).trim()
if(isModified) {
println("변경된 파일 존재")
dir("""${classesDir}""") {
withAnt(jdk: 'jdk1.6') {
def lines = isModified.readLines()
// 더존 배치 작업 서비스끼리 배포하기위한 예외처리
// bat(script: """
// javac -d D:\\jenkins\\build\\classes -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;C:\\ProgramData\\Jenkins\\.jenkins\\workspace\\NATGERP_TEST\\sgerp.war\\WEB-INF\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; C:\\ProgramData\\Jenkins\\.jenkins\\workspace\\NATGERP_TEST\\sgerp.war\\WEB-INF\\src\\com\\schedule\\Schedule.java
// javac -d D:\\jenkins\\deploy\\ -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;C:\\ProgramData\\Jenkins\\.jenkins\\workspace\\NATGERP_TEST\\sgerp.war\\WEB-INF\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; C:\\ProgramData\\Jenkins\\.jenkins\\workspace\\NATGERP_TEST\\sgerp.war\\WEB-INF\\src\\com\\schedule\\Schedule.java
//
// """
// )
for(line in lines) {
line = line.replace('/', '\\')
if(line.substring(line.length()-5) == '.java' && line.substring(line.length()-12) != 'Command.java' && line.substring(line.length()-12) != 'Service.java'){
println("코어자바파일 빌드")
bat(script: """
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
"""
)
}
}
for(line in lines) {
line = line.replace('/', '\\')
println(line)
if(line.length() > 12 && line.substring(line.length()-12) == 'Command.java'){
println("자바파일 빌드")
def service = line.replace('\\command\\', '\\service\\').replace('Command.java', 'Service.java')
//emerge
bat(script: """
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\sgerp.war\\WEB-INF\\src\\com\\erp\\service\\commonDS\\CommonDsService.java
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\sgerp.war\\WEB-INF\\src\\com\\erp\\service\\commonDS\\CommonDsService.java
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\sgerp.war\\WEB-INF\\src\\com\\erp\\service\\fs\\dsdv\\Dsdv0010Service.java
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\sgerp.war\\WEB-INF\\src\\com\\erp\\service\\fs\\dsdv\\Dsdv0010Service.java
"""
)
bat(script: """
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${service}
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${service}
"""
)
bat(script: """
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
"""
)
}
else if(line.substring(line.length()-5) == '.java'){
println("자바파일 빌드")
bat(script: """
javac -d ${classesDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
javac -d ${workDir} -encoding UTF8 -cp D:\\NG_PROJECT\\bin\\jdk1.6\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\*;D:\\NG_PROJECT\\bin\\jdk1.6\\jre\\lib\\ext\\*;${env.WORKSPACE}\\${libDir}\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\common\\lib\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\server\\natgerp\\deployers\\resteasy.deployer\\*;D:\\NG_PROJECT\\bin\\jboss-6.1.0.Final\\client\\*; ${env.WORKSPACE}\\${line}
"""
)
}
else{
println('자바파일 아님')
bat(script: """
echo f | xcopy /i /y "${env.WORKSPACE}\\${line}" "${workDir}${line}"
"""
)
}
}
}
}
}
}
// 4. 반영할 내용을 배포 경로에 반영한다.
stage('배포경로 반영') {
// Process deleted files
// 파일을 읽어 삭제된 내용을 반영한다.
isDeleted = (readFile(file: 'deletedList', encoding: 'UTF-8')).trim()
if(isDeleted) {
println("삭제 반영 파일 존재")
def lines = isDeleted.readLines()
for(line in lines) {
def deployFile = line.replace('\\', '/').replace('sgerp.war/', '')
//println(line)
for(was in wasList){
def wasName = wasPath.replace('NATGERP', was)
if(line.substring(line.length()-5) == '.java'){
def classDeployFileServer = deployFile.replace('src', 'classes').replace('.java', '.class')
bat(script: """
ssh ${target_server} "rm -vf ${wasName}/${classDeployFileServer}"
"""
)
}else{
bat(script: """
ssh ${target_server} "rm -vf ${wasName}/${deployFile}"
"""
)
}
}
}
} else {
println("삭제 반영 파일 미존재")
}
// Process modefied files
// 파일을 읽어 수정된 내용을 반영한다.
isModified = (readFile(file: 'modifiedList', encoding: 'UTF-8')).trim()
if(isModified) {
println("변경 반영 파일 존재")
def lines = isModified.readLines()
for(line in lines) {
def deployFile = line.replace('\\', '/').replace('sgerp.war/', '')
def splitPath = deployFile.split("/")
def filename = splitPath[splitPath.length-1]
def exceptFilename = deployFile.replace(filename, '')
for(was in wasList){
def wasName = wasPath.replace('NATGERP', was)
if(line.substring(line.length()-5) == '.java'){
def classDeployFile = deployFile.replace('WEB-INF/src/', '').replace('src', 'classes').replace('.java', '.class')
def classDeployFileServer = deployFile.replace('src', 'classes').replace('.java', '.class')
def classSplitPath = classDeployFileServer.split("/")
def classFilename = classSplitPath[classSplitPath.length-1]
def exceptClassFilename = classDeployFileServer.replace(classFilename, '')
bat(script: """
ssh ${target_server} "mkdir -p ${wasName}/${exceptClassFilename}"
scp -r ${workDir}\\${classDeployFile} ${target_server}:${wasName}/${classDeployFileServer}
"""
)
}else{
bat(script: """
ssh ${target_server} "mkdir -p ${wasName}/${exceptFilename}"
scp -r "${workDir}\\${line}" "${target_server}:${wasName}${deployFile}"
"""
)
}
}
}
} else {
println("변경 반영 파일 미존재")
}
}
// 5. 최종 반영한 커밋 ID를 파일로 저장한다.
stage('커밋 최종값 입력') {
writeFile(file: 'lastDeployCommitId', text:nowDeployCommitId, encoding: 'UTF-8')
bat(script: """
rd /s /q ${workDir}
md ${workDir}
"""
)
}
// 6. restart was
stage('WAS 재시작') {
// Process modefied files
// 파일을 읽어 수정된 내용을 반영한다.
isModified = (readFile(file: 'modifiedList', encoding: 'UTF-8')).trim()
if(isModified) {
println("WAS 재시작 필요")
for(was in wasList){
def wasName = wasBinPath.replace('NATGERP', was)
def wasStopName = wasBinPath.replace('NATGERP', was+'stop')
bat(script: """
ssh ${target_server_root} "su - jbossnatg -c ${wasStopName};su - jbossnatg -c ${wasName}"
"""
)
}
println("complete")
} else {
println("WAS 재시작 필요 없음")
}
}
// 7. 로그 기록
stage('로그 기록') {
isDeleted = (readFile(file: 'deletedList', encoding: 'UTF-8')).trim()
if(isDeleted) {
def lines = isDeleted.readLines()
dir("""${logDir}""") {
for(line in lines) {
bat(script: """
echo ${nowDeployCommitId}, %date% %time%, ${username}, [DEL], ${line}, ${commitmsg} >> natgerp_develop.txt
"""
)
}
}
}
isModified = (readFile(file: 'modifiedList', encoding: 'UTF-8')).trim()
if(isModified) {
def lines = isModified.readLines()
dir("""${logDir}""") {
for(line in lines) {
bat(script: """
echo ${nowDeployCommitId}, %date% %time%, ${username}, [MOD], ${line}, ${commitmsg} >> natgerp_develop.txt
"""
)
}
}
}
}
}