2025. 2. 4. 18:08ㆍJenkins
이전 1부에서 젠킨스를 설치해보고 2부에서는 깃허브에서 젠킨스로 클론해오는것까지 진행 하였습니다.
이번 3부에서는 깃허브에서 받아온 소스를 빌드하여 jar 파일로 만들고 개발서버에 배포 하는 부분을 진행 하겠습니다.
받아진 개발소스를 gradle 을 사용하여 빌드해주기 위하여 파이프라인에 stage 를 추가해줍니다.
pipeline {
agent any
environment {
GIT_CREDENTIALS_ID = 'jenkins-test-key'
GIT_REPO = 'git@github.com:han1399kr/jenkins-test.git'
}
stages {
stage('Clone Repository') {
steps {
git branch: 'master', credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO}"
}
}
stage('Build') {
steps {
sh './gradlew clean build'
}
}
}
}
실행 하니까 오류가 나버리네요...

확인해 보니 권한이 없다는 내용이였습니다. 파이프라인에 권한을 추가해주고 다시 빌드 해봅시
pipeline {
agent any
environment {
GIT_CREDENTIALS_ID = 'jenkins-test-key'
GIT_REPO = 'git@github.com:han1399kr/jenkins-test.git'
}
stages {
stage('Clone Repository') {
steps {
git branch: 'master', credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO}"
}
}
stage('Grant Permission') {
steps {
sh 'chmod +x ./gradlew'
}
}
stage('Build') {
steps {
sh './gradlew clean build'
}
}
}
}
jenkins 빌드가 성공하였습니다. 그러면 jar 파일이 만들어졌을텐데 확인해 보러가시죠
/var/jenkins_home/workspace/hd/build/lib 해당 폴더에 jar 파일이 2개 만들어졌습니다. 뒤에 plain 이 붙은건 왜만들어졋는지 확인해보니 hd-0.0.1-SNAPSHOT- plain .jar 은 해당 JAR 파일이 특별한 라이브러리나 의존성 없이 오직 프로젝트 소스 코드만 포함되어져있다고 합니다. 우린 해당파일은 필요없으니 이제 hd-0.0.1-SNAPSHOT.jar 해당 파일을 개발서버 쪽으로 보내봅시다.

우선 scp 를 통해서 1차적으로 파일을 전달할 것이고 ssh 를 통해서 2차적으로 jar 파일을 실행할 예정 입니다.
둘다 id , pw 입력 보다는 기존에 GIT 로그인 과정에서 만들어 놓은 ras 키를 id , pw 입력 없이 개발서버로 접속하는 방법을 사용합시다. 처음 키를 복사해서 전달하는과정에서는 비밀번호를 입력하는과정이 한번 있습니다.
그러면 현재 젠킨스 서버에서 개발서버로 키를 복사해 봅시다.
ssh-copy-id -i ~/.ssh/id_rsa.pub test@123.456.78.90
(test에 위치한 값은 개발서버의 접속 id 를 적어주시면됩니다.)
(해당 ip는 보여드리기위해서 임의로 적은 ip 입니다.)
아래와 같이 키가 추가 되었다고 뜨면 성공한 것입니다.

그러면 실제 개발 서버에 키가 추가되었는지도 확인해봅시다.
cat ~/.ssh/authorized_keys
기존 1개만 존재하던 키가 아래와 같이 1개가 추가 된것을 확인할수 있습니다.

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

이제 부터는 별도의 id , pw 입력 없이 scp 와 ssh 를 사용할수 있습니다.
scp /var/jenkins_home/workspace/hd/build/libs/hd-0.0.1-SNAPSHOT.jar test@123.456.78.90:/home/hd-jenkins/
scp 를 사용하여 파일을 전달 하였습니다. 이미 키를 등록했기때문에 비밀번호 입력창은 나오지 않았습니다.
그러면 개발서버에 파일이 올라갔는지 확인해봐야겟죠?

정상적으로 파일이 올라간것을 확인하였습니다. 여기에 미리 만들어놓은 파일 run-dev.sh , stop-dev.sh 파일은 해당 hd-0.0.1-SNAPSHOT.jar 파일을 시작과 종료를 할수있도록 미리 파일로 만들어 놓았습니다.
이제 그러면 파이프라인을 통하여 일련의 과정을 작성해보도록 하겠습니다.
pipeline {
agent any
environment {
GIT_CREDENTIALS_ID = 'jenkins-test-key'
GIT_REPO = 'git@github.com:han1399kr/jenkins-test.git'
}
stages {
stage('Clone Repository') {
steps {
git branch: 'master', credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO}"
}
}
stage('Grant Permission') {
steps {
sh 'chmod +x ./gradlew'
}
}
stage('Build') {
steps {
sh './gradlew clean build'
}
}
stage('Deploy') {
steps {
sh 'scp build/libs/hd-0.0.1-SNAPSHOT.jar test@123.456.78.90:/home/hd-jenkins/'
sh 'sleep 5'
sh 'ssh test@123.456.78.90 "chmod +x /home/hd-jenkins/stop-dev.sh"'
sh 'ssh test@123.456.78.90 "/home/hd-jenkins/stop-dev.sh"'
sh 'sleep 5'
sh 'ssh test@123.456.78.90 "chmod +x /home/hd-jenkins/run-dev.sh"'
sh 'ssh test@123.456.78.90 "/home/hd-jenkins/run-dev.sh"'
}
}
}
}
빌드도 성공한 것을 확인 했고 이제 홈페이지에 접속을 해보니 접속이 안되고 있었습니다.

무엇때문인지 확인하기 위하여 개발서버의 로그를 확인해보니 젠킨스 서버에서 빌드될때 버전의 문제가 있는것을 확인할수 있었습니다. 젠킨스 서버의 java 버전은 17 버전 프로젝트의 버전은 1.8 버전 ...
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/hihi/hd/HdApplication has been compiled by a more recent version of the Java Runtime ( class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
그리하여 젠킨스 서버에 java 1.8 버전을 추가 하여 1.8 버전으로 빌드 될수 있도록 바꿔줄 예정입니다.
우선 jdk 1.8 버전을 받아줍니다.
https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html
Java Archive Downloads - Java SE 8 | Oracle 대한민국
www.oracle.com
리눅스에 설치를 하기위해 jdk-8u202-linux-x64.tar.gz 를 받아줍니다.
로컬에 받은 파일을 리눅스 서버로 옮겨주고 해당 파일을 다시 docker 쪽으로 옮겨준후 압축을 풀어줍니다.
1. 리눅스 서버에서 도커 똑으로 파일 전송
docker cp jdk-8u202-linux-x64.tar.gz jenkins-docker:/home
2. 도커 접속 (압축 해제를 위하여 root 권한으로 접속)
docker exec -it -u root jenkins-docker /bin/bash
3. 압축 풀기
tar -xzvf jdk-8u202-linux-x64.tar.gz

압축 까지 풀어졌으면 다시 젠킨스로 돌아갑니다.

죄측의 Jenkins 관리를 누른후 Tools 를 누릅니다.

Add JDK 를 눌러서 1.8 버전을 선택하여 추가해줍시다.

Name 과 JAVA_HOME 을 적어주고 SAVE 버튼을 눌러서 저장합니다.
이제 다시 파이프라인으로 돌아와서 environment > JAVA_HOME , tools , stage('Build') 부분을 수정하였습니다.
pipeline {
agent any
environment {
GIT_CREDENTIALS_ID = 'jenkins-test-key'
GIT_REPO = 'git@github.com:han1399kr/jenkins-test.git'
JAVA_HOME = '/home/jdk1.8.0_202'
}
tools {
jdk 'jdk-1.8'
}
stages {
stage('Clone Repository') {
steps {
git branch: 'master', credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO}"
}
}
stage('Grant Permission') {
steps {
sh 'chmod +x ./gradlew'
}
}
stage('Build') {
steps {
sh './gradlew clean build -Dorg.gradle.java.home=$JAVA_HOME'
}
}
stage('Deploy') {
steps {
sh 'scp build/libs/hd-0.0.1-SNAPSHOT.jar test@123.456.78.90:/home/hd-jenkins/'
sh 'sleep 5'
sh 'ssh test@123.456.78.90 "chmod +x /home/hd-jenkins/stop-dev.sh"'
sh 'ssh test@123.456.78.90 "/home/hd-jenkins/stop-dev.sh"'
sh 'sleep 5'
sh 'ssh test@123.456.78.90 "chmod +x /home/hd-jenkins/run-dev.sh"'
sh 'ssh test@123.456.78.90 "/home/hd-jenkins/run-dev.sh"'
}
}
}
}
빌드도 정상적으로 되고 홈페이지도 정상적으로 열리는것을 확힌 할 수 있습니다.

이렇게 spring boot 프로젝트를 젠킨스를 사용하여 개발서버에 배포하기를 마무리 하겠습니다.
감사합니다.
[Jenkins] Jenkins 를 사용하여 Spring boot 자동 배포 해보기 (1부)
'Jenkins' 카테고리의 다른 글
[Jenkins] Jenkins 를 사용하여 Spring boot 자동 배포 해보기 (2부) (0) | 2025.02.04 |
---|---|
[Jenkins] Jenkins 를 사용하여 Spring boot 자동 배포 해보기 (1부) (0) | 2025.02.04 |