본문 바로가기
Devops

[Jenkins] 젠킨스내에서 jdk버전 여러개 사용하기 / 변경하기

by codeyaki 2024. 6. 12.
반응형

회사 내에서 개발기에 배포하는 과정을 자동화시키기 위해서 서버에 젠킨스를 적용하는 과정에서 발생한 이슈이고 정리하기 위해서 글을 작성한다...!

 

문제 상황 정리

  1. 현재 Jenkins는 docker를 이용해서 jdk-17 버전으로 사용 중이다. (즉, 컨테이너 내부는 jdk-17)
  2. 하지만 내가 진행한 프로젝트는 jdk-1.8을 사용한다.
  3. 버전이 달라 컨테이너 내부에서 gradlew build를 진행할 수 없다..!!

어떻게 해결할 수 있을까? 빌드할 때 java의 버전을 동적으로 변경시켜주어야 한다.

그렇다면 먼저 볼륨을 연결해서 거기에 jdk를 설치해 두고 스크립트를 짜서 step을 시작할 때 환경변수를 바꿔주면 되지 않을까? 생각했다.

(왜냐하면 현재 로컬에서는 스크립트를 짜서 동적으로 java버전을 관리하고 있기 때문에 자연스럽게 먼저 이 생각을 떠올렸다)

나름 괜찮아 보이는 생각이었고 그렇게 하면 될 것 같았다.

근데 혹시나 이걸 jenkins에서 지원해주지 않을까!? 생각해서 문서를 찾아보았다.

https://www.jenkins.io/doc/book/pipeline/syntax/#tools

 

Pipeline Syntax

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

있다.. tools라는 기능이!!!

이 기능을 사용하면 자동으로 다운로드되고 PATH에 등록을 해주는 것으로 보인다. 정말 그런지 확인을 해보자.

 

이 기능을 사용하기 위해서는 먼저 tools에 등록을 해주어야 한다.

Tools 등록하기

 

 

해당 메뉴에 들어가서 JDK installations 항목을 찾아서 해당 내용을 등록해 주었다.

  • Name: pipeline에서 사용할 이름을 작성해 주면 된다.
  • Download URL for binary archive: 압축형태로 제공되는 jdk를 받을 url을 입력해 주면 된다. 나는 아마존의 corretto를 사용하였다. (*.zip과 *.tar.gz 형식만 지원한다)
  • Subdirectory of extracted archive: 압축을 해제하면 나오는 디렉토리의 명을 적어주면 된다.
    그 이전 경로는 자동으로 작성되기 때문에 압축해제하면 나오는 디렉토리의 명만 적어주면 된다.
    나의 경우에는 (/var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-11.0.23.9.1-linux-x64)가 풀네임이 된다.

 

만약 기존에 존재하는 JDK를 사용하고 싶다면 'Install automatically'를 체크해제해서 단순히 JAVA_HOME만 변경해 주면 된다.

 

Tools 사용방법

 

pipeline {
    agent any
    
    tools {
        jdk 'jdk-8'
    }
    
    stages {
        stage('jdk-8확인') {
            steps {
                sh '기본은 jdk-8로 변경'
                sh 'java -version'
                sh 'javac -version'
            }
        }
    }
    
}

이와 같이 사용하면 해당 pipeline을 사용할 때에는 jdk-8을 사용해서 수행할 수 있게 된다.

모든 stage에 적용할 때 사용하면 편리하게 적용할 수 있게 된다.

결과를 살펴보면 자동으로 JAVA_HOME과 PATH모두 변경이 되는 것을 확인할 수 있었다.

+ echo 기본은 jdk-8로 변경
기본은 jdk-8로 변경
[Pipeline] sh
+ echo /var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64
/var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64
[Pipeline] sh
+ echo /var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64/bin:/var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64/bin:/var/jenkins_home/tools/hudson.model.JDK/jdk-8/amazon-corretto-8.412.08.1-linux-x64/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[Pipeline] sh
+ java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment Corretto-8.412.08.1 (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM Corretto-8.412.08.1 (build 25.412-b08, mixed mode)
[Pipeline] sh
+ javac -version
javac 1.8.0_412

 

만약 중간에 버전을 바꿔줘야 한다면

루트 블록에 작성해 주는 것이 아닌 각 stage마다 작성해 주면 된다.

pipeline {
    agent any
    
    stages {
        stage('기본 버전은 jdk-17') {
            steps {
                sh 'echo 기본 버전확인'
                sh 'echo $JAVA_HOME'
                sh 'echo $PATH'
                sh 'java -version'
                sh 'javac -version'
            }
        }
        stage('jdk-8확인') {
            tools{
                jdk 'jdk-8'
            }
            steps {
                sh 'echo jdk-8로 변경'
                sh 'echo $JAVA_HOME'
                sh 'echo $PATH'
                sh 'java -version'
                sh 'javac -version'
            }
        }
        stage('jdk-11확인') {
            tools{
                jdk 'jdk-11'
            }
            steps {
                sh 'echo jdk-11로 변경'
                sh 'echo $JAVA_HOME'
                sh 'echo $PATH'
                sh 'java -version'
                sh 'javac -version'
            }
        }
    }
    
}

 

 

반응형