# Jenkins 사용기

2021. 5. 30. 10:59 개발 이야기/오픈소스

 

안녕하세요 해커의 개발일기 입니다.

오늘은 빌드 자동화 툴인 Jenkins에 대해서 소개해보려고 합니다.

 

빌드 자동화를 구축하지 않고 여러 사람이 개발을 하다보면 서로 다른 빌드환경을

갖게 되고 이렇게 되는 경우 .. 문제가 생기면 정말 찾기 힘든 경우가 발생하는데요 ..

 

이를테면 A 개발자는 java App 빌드를 할때 Xmx을 1G로 주고 

B 개발자는 Xmx를 5G로 주고 빌드를 했습니다.

 

A 개발자가 배포한 Java App의 메모리 사용량이 2G를 넘어서서 어플리케이션이 뻗게되면

B개발자는 Xmx 옵션 때문이라고 절때 생각하지 못하게 되는데요

 

이런 서로 다른 빌드 환경을 획일하고 편리하게 관리 배포하기 위해서 

CI/CD라는 용어가 나왔습니다.

 

오늘은 CI 오픈소스 중 가장 유명한 Jenkins 사용법에 대해서 알아보겠습니다.

https://www.jenkins.io/download/

 

Jenkins download and deployment

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

www.jenkins.io

 

 

Jenkins 설치에 관한 글은 상당히 많기 때문에 간단하게 설명하겠습니다. 먼저 위의 URL에서 Windows 버전을 다운로드 받아서 설치합니다. Port와 계정을 설해주고 로그인을 하게되면 아래와 같은 페이지에 접근할 수 있습니다.

저는 기본 8080 포트가 아닌 10002포트로 변경해서 설치했습니다. 저는 대부분 Docker 이미지로 빌드를 하기 때문에 관련 Plugin을 설치해보겠습니다. 참고로 Jenkins에는 상당히 다양하고 유용한 Plugin이 존재합니다. 회사에서는 bamboo를 사용하기 때문에 Jenkins의 강력한 장점인 Plugin에 대해서 어떤 것들이 있는지 잘 모르지만 많은 유저분들이 Jenkins의 큰 장점으로 뽑는 이유이기 때문에 관심이 있으신 분들은 꼭 찾아보시길 바랍니다.

플러그인을 설치하고 "새로운 Item" 메뉴를 눌러 빌드 프로젝트를 만들어 보겠습니다.

다양한 기능들을 제공해주고 있는 것 같습니다 저는 Freestyle project로 git으로 관리하는 소스코드의 빌드 환경을 구성해보겠습니다.

SCM을 Git으로 변경하고 Github 주소를 넣어줍니다(요즘 한창 열을 올리고 있는 오픈소스 Clymene의 빌드 환경을 구성하고 있습니다) 마지막에 Script Path라는 것이 보입니다. 이 Script Path는 Jenkins 빌드 방식을 정의한 파일의 경로가 들어가게 되는데요. 아래의 그림처럼 파일명을 넣게되면 프로젝트의 ROOT 경로에 Jenkinsfile을 찾아 빌드에 사용하게 됩니다.

 

프로젝트 ROOT 경로의 Jenkinsfile이 보이시죠? 저 경로에 file을 읽어서 빌드에 사용하게 됩니다. 

 

Jenkinsfile은 어떻게 정의하는지 알아보겠습니다. 아래 environment와 같이 환경 변수를 지정할 수 있습니다. GIT_BRANCH는 git의 branch를 가져오는 환경변수인데 origin/branch_name 이런 형태로 가져오기 때문에 split해서 branch_name만 가져옵니다.

pipeline {
    environment {
        registry = "registry.localhub:5000/clymene/agent"
        registryCredential = 'bourbonkk'
        BRANCH_NAME = "${GIT_BRANCH.split("/")[1]}"
        DOCKER_SCAN_SUGGEST = false
    }
.....

 

다음은 Stage를 정의하는 부분입니다. stages 하위에 여러 stage를 정의해 step을 가시적으로 보여줄 수 있습니다. 저는 docker build, docker deploy, Clean docker image stage를 만들어 어느 지점에서 실패하는지 3단계로 보고 싶었기 때문에 아래와 같이 정의 했습니다. 물론 더욱 세세한 정의도 가능합니다만, 깊이 있는 정의 방법은 여기서 다루지 않습니다. (Windows 환경에서는 bat을 사용하고 linux 환경에서는 bat 대신 sh를 사용합니다)

    stages {
        stage('docker build') {
            steps {
                bat 'docker build -t '+ registry+':'+BRANCH_NAME+' -f=agent.Dockerfile .'
            }
        }
        stage('docker deploy') {
            steps {
//                 withDockerRegistry([ credentialsId: "docker-hub-credentials", url: "" ]) {
                    bat 'docker push '+ registry+':'+BRANCH_NAME
//                 }
            }
        }
        stage('Clean docker image') {
            steps{
                bat "docker rmi "+ registry+':'+BRANCH_NAME
            }
        }
    }
}

 

이렇게 Jenkinsfile을 정의해두고 Jenkins 페이지에서 빌드를 해봅니다. 프로젝트를 정상적으로 생성했다면 아래와 같이 Dashboard에서 볼 수 있습니다. 

먼저 정의해놓은 Clymene-agent 프로젝트로 들어가서 설정해 놓은 Jenkinsfile이 어떻게 가시적으로 보여지고 있는지 확인해보겠습니다. 

어느 지점에서 실패를 했고 Log도 손쉽게 확인할 수 있습니다. 저는 Docker Image로 빌드를 해서 registry에 PUSH를 하도록 구성을 했고 Private registry를 로컬에 구성해서 환경을 구성했습니다. Jenkins를 처음 써보기 때문에 4시간 정도의 시행 착오가 있었지만 .. 지금 구성해 놓은 방식으로 조금씩 수정해서 다른 빌드 설정도 해놓을 수 있을 것 같습니다.

 

이상으로 Jenkins에 대해서 알아봤습니다.