글 작성자: beaniejoy
목적
- AWS Lightsail을 통해 생성한 instance에 jenkins server 구축한 내용 기록용

목표
- AWS Lightsail에 띄운 instance에 jenkins server 띄우기
- jenkins server 기본적인 설정
- jenkins item 생성 후 spring project build 해보기

개인 프로젝트에 대한 빌드 자동화를 위해 공부할 겸 Jenkins를 사용해보았습니다.
Jenkins를 설치하는 내용보다 설치한 이후 기본적인 설정들과 pipeline을 사용한 item 생성 및 Spring project의 빌드 프로세스 구축한 내용이 주를 이룰 것 같습니다.

📌 1. AWS Lightsail 네트워크 설정 변경

AWS Lightsail을 이용한 instance 설정 내용에 대한 게시글을 참고해서 먼저 instance를 할당받아야 합니다.

 

[AWS] AWS Lightsail을 이용해 간단하고 저렴하게 클라우드 서버 이용해보기

목적 - AWS Lightsail을 이용해 AWS 클라우드 서비스를 이용한 내용을 정리 및 기록 - AWS Lightsail 간편한 설정과 상대적으로 가성비 있는 클라우드 서비스라는 것을 알리기 위함 (다른 더 좋은 것이 있

beaniejoy.tistory.com

instance를 생성하고 가장 먼저 해야할 것이 lightsail에서 할당받은 instance의 네트워크 설정을 변경해주어야 합니다.

Jenkins를 설치하면 default port로 8080을 부여받게 됩니다. 제 개인 노트북에서 AWS cloud server에서 실행중인 Jenkins 프로세스에 접근하려면 해당 포트번호를 통해 접속해야하는데요. 중요한 것은 바로 8080번에 접속할 수 없습니다.

lightsail에서 네트워크 설정에 들어가면 방화벽 설정이 있는데요. 제 컴퓨터가 연결하고 있는 인터넷의 ip address에 대해서 instance의 8080 포트를 열어주어야 접속할 수 있습니다. 해당 내용은 위에 첨부해드린 링크에 들어가셔서 방화벽 설정부분 참고하시면 됩니다.
(22번 ssh 포트에 대한 설정이 나올텐데 8080번 포트에 대해서 같은 방법으로 설정하면 됩니다.)

 

📌 2. AWS instance에 Jenkins 구축해보기

 

🔖 2-1. JDK 설치하기

AWS instance에 jenkins 설치하기 전에 기본적인 jdk가 설치되어 있어야 합니다.
저 같은 경우 java 17버전을 설치했고 lightsail instance에 Amazon Linux2 운영체제 기반으로 할당을 받았기 때문에 AWS에서 지원하는 JDK를 설치했습니다. (참고로 jenkins 공식 홈에서는 특정 jenkins 버전 이후로 java 11, 17버전을 사용하게끔 하고 있습니다.)

Jenkins requires Java 11 or 17 since Jenkins 2.357 and LTS 2.361.1

Amazon에서 지원하는 openjdk인 Amazon Corretto 17을 설치하면 됩니다.

$ sudo yum install java-17-amazon-corretto-devel

Amazon Linux 운영체제 기반에서 Amazon Corretto 17를 설치하는 내용에 대한 자세한 내용은 document를 참고하시면 됩니다.
(Amazon Corretto 17 Installation Instructions)

 

Amazon Corretto 17 Installation Instructions for Amazon Linux 2 and Amazon Linux 2022 - Amazon Corretto 17

Amazon Corretto 17 Installation Instructions for Amazon Linux 2 and Amazon Linux 2022 This topic describes how to install and uninstall Amazon Corretto 17 on a host or container running the Amazon Linux 2 or Amazon Linux 2022 operating systems. Install usi

docs.aws.amazon.com

설치가 완료되고 JAVA_HOME 환경 변수를 설정하고 기본 PATH에도 지정해줍시다.

$ vi ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64

export PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
export PATH=$JAVA_HOME:$PATH
$ source ~/.bashrc

저 같은 경우 .bashrc 설정파일에 환경 변수를 설정하였습니다. JAVA_HOME을 좀 전에 설치한 amazon corretto 17 내용의 경로로 지정하고 이 내용을 PATH에 등록해줍니다.

 

🔖 2-2. Jenkins 설치하기

instance에 jenkins 설치하는 방법 자체에 대해서 친절하게 소개하는 블로그 글이 있는데요. 해당 내용을 참고하셔서 설치하시면 될 것 같습니다. (AWS EC2에 Jenkins 설치하기)

 

AWS EC2(Amazon Linux 2)에 Jenkins 설치하기 ( AWS / EC2 / Linux / Jenkins ) _220713_업데이트

안녕하세요. 그린주입니다 ๑'ٮ'๑ 오늘도 힘차게 시작해보겠습니다! 개요 이번 글에서는 AWS EC2(Amazon Linux 2)에 Jenkins 설치하는 방법을 공유하고자 합니다. 참고로 JAVA가 설치되어있고 Jenkins 인바

green-joo.tistory.com

==================================================================================================================================
 Package                       Arch                         Version                           Repository                     Size
==================================================================================================================================
Installing:
 jenkins                       noarch                       2.375.3-1.1                       jenkins                        90 M

Transaction Summary
==================================================================================================================================

설치가 완료되면 위와 같은 내용이 출력될 것 입니다. 버전 내용 확인하시면 됩니다.

 

🔖 2-3. Jenkins 설정 변경하기 - 1. 권한

설치 이후에 몇 가지 변경할 내용이 있는데요. 우선 Jenkins의 기본 사용자 권한, 그룹 권한을 변경해줍니다.
설치시 default로 지정된 사용자, 그룹은 jenkins로 되어 있는데요. Amazon Linux2의 기본 사용자(그룹)인 ec2-user로 바꾸도록 하겠습니다.

$ sudo vi /usr/lib/systemd/system/jenkins.service
# Unix account that runs the Jenkins daemon
# Be careful when you change this, as you need to update the permissions of
# $JENKINS_HOME, $JENKINS_LOG, and (if you have already run Jenkins)
# $JENKINS_WEBROOT.
User=ec2-user
Group=ec2-user

User와 Group 이름을 ec2-user로 변경하고 저장합니다.

위에 링크 달아드린 Jenkins 설치방법에 대해서 소개하는 블로그 글에도 이 내용이 나와 있는데요. 구버전(2.335, 2.332.1 LTS 이전)에 대해서는 다음과 같이 설정하면 된다고 합니다.

$ sudo vi /etc/sysconfig/jenkins
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins,
# and if you have already run Jenkins, potentially other
# directories such as /var/cache/jenkins .
#
JENKINS_USER="ec2-user"

위와 같이 JENKINS_USER 부분을 기존 jenkins에서 ec2-user로 변경하고 저장합니다.

jenkins의 기본 권한을 변경한 다음에 jenkins 관련 디렉토리의 사용자 및 그룹 권한도 변경해주어야 합니다. (기본 jenkins로 되어 있음)

$ chown -R ec2-user:ec2-user /var/lib/jenkins 
$ chown -R ec2-user:ec2-user /var/cache/jenkins
$ chown -R ec2-user:ec2-user /var/log/jenkins

이렇게 세 개의 디렉토리를 ec2-user:ec2-user로 변경해줍니다.
설정이 완료되었으면 jenkins를 다시 시작하면 됩니다.

$ sudo systemctl daemon-reload
$ sudo systemctl restart jenkins

 

🔖 2-4. Jenkins 설정 변경하기 - 2. encoding

jenkins 기본 encoding이 UTF-8이 아니라서 젠킨스 빌드 실행시 console output에 나오는 로그내용이 깨져서 나올 수 있습니다. 이를 방지하기 위해 encoding 방식을 UTF-8로 변경했습니다.

$ vi ~/.bashrc
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
export LANG=en_US.UTF-8
$ source ~/.bashrc

우선 JAVA_TOOL_OPTIONS, LANG 이름의 환경변수를 설정해줍니다.
그리고 jenkins에 접속해서 왼쪽 탭에 Manage Jenkins > Configure System > Global properties에도 해당 내용을 등록해줍니다.

위와 같이 설정을 마치고 나서 jenkins를 다시 restart 합니다.

restart하고 jenkins의 System Information을 확인하면 위와 같이 file.encoding이 UTF-8로 되어 있을 것입니다.

encoding 설정 전
encoding UTF-8 설정 후

 

📌 3. 기본적인 Pipeline 설정

Jenkins 설정까지 마무리 되고 본격적으로 Spring project에 대한 빌드를 jenkins에 적용해보겠습니다. 저는 jenkins의 pipeline 방식으로 진행하였습니다.

pipeline 방식으로 빌드 프로세스를 구축하기 위해 spring project에 Jenkinsfile을 만들어야 합니다.

pipeline {
    agent any

    stages {
        stage('Init') {
            steps {
                script {
                    sh 'whoami'
                    sh 'printenv'
                }
            }
        }

        stage('Test') {
            steps {
                sh './gradlew clean :dongne-service-api:test'
            }
        }

        stage('Build') {
            steps {
                sh './gradlew clean :dongne-service-api:build -x test'
            }
        }
    }
}

간단한 pipeline을 작성해보았습니다. 빌드 절차로 간단하게 Init > Test > Build 스테이지를 설정했습니다.
Init에는 서버의 사용자 이름(whoami)과 지정된 모든 환경변수 내용(printenv)을 출력해서 로그로 확인할 수 있도록 하였습니다.
Test와 Build는 gradle wrapper를 통해 실행되도록 하였습니다.

 

📌 4. Jenkins Item 생성

프로젝트에 pipeline을 위한 Jenkinsfile까지 생성하였다면 이제 jenkins에 적용해볼 차례입니다.
jenkins에 접속하면 왼쪽 탭에 New Item을 클릭합니다.

적절한 item 이름을 입력하고 Pipeline을 체크합니다.
(dongne-service라는 이름으로 이미 item을 만들어둔 상태라 위와 같이 빨간색 글씨로 이미 존재한다는 경고 메세지가 나오고 있습니다. 첫 item 생성이면 이런 메세지는 안 나올 겁니다.)

생성하자마자 바로 설정페이지로 진입할 것입니다.

  • Description: 해당 item에 대한 적절한 설명을 입력합니다.
  • Discard old builds: jenkins item에서 빌드를 수행하면 빌드 이력이 남게되는데요. 저장공간을 절약해야하기 때문에 최대 5개까지만 이력을 저장하도록 하였습니다. 원하는 개수 입력하시면 됩니다.
  • Do not allow concurrent builds: 말 그대로 동시에 여러개 빌드가 진행되지 않도록 허용하지 않겠다고 설정하는 것입니다.

item 안에서 사용할 파라미터 변수를 하나 지정합니다.
brach라는 이름으로 파라미터를 등록했는데요. github repository의 어떤 브랜치를 clone 받아서 빌드를 진행할지 결정하는 변수로 사용할 것입니다.

pipeline script로 사용할 프로젝트를 지정합니다. github repository로 관리되고 있는 spring project를 대상으로 합니다.

본래 Credentials에서 github access token을 발급받아 설정해야합니다.
저 같은 경우 public하게 오픈되어 있는 repository를 대상으로 하고 있기 때문에 따로 Credientials를 설정하지 않았는데요.
이부분은 웬만하면 보안 안정성을 위해 token을 발급받아 인증된 token이 있을 때에만 github repository를 가져올 수 있게끔 해야합니다.

Branches to build부분에는 위에 지정한 파라미터 변수인 branch로 설정해줍니다.

Script Path로 Jenkinsfile이 있는 경로와 이름을 지정해줍니다. project root 경로에 있는 Jenkinsfile-service 이름의 pipeline script 파일로 지정했습니다.

위와 같이 설정해주고 Apply > Save 해주면 기본적인 item 설정은 완료입니다.

 

📌 5. Item 실행해보기

설정을 마치면 item의 메인 페이지로 들어가게 되는데요 왼쪽 탭에 Build with Parameters를 클릭합니다.

설정에서 branch 파라미터 변수를 등록했었는데요. default value로 설정한 alpha 브랜치를 가지고 build 해보겠습니다. 당연히 git repository로 등록한 프로젝트의 alpha 브랜치에 Jenkinsfile 내용이 반영되어 있어야 합니다.

build 완료된 후

build가 완료되면 Jenkinsfile에 설정했던 stage 내용과 각 단계에서 소요된 시간이 함께 표시됩니다. 그리고 Build History 영역에 build된 이력이 남겨져 있습니다. build 이력을 클릭해봅시다.

build 이력에 대한 상세 페이지가 나오는데요. 여기서 자세한 내용들을 확인할 수 있습니다. 그 중 console output에서 Jenkins build 과정에 대한 로그내용을 확인할 수 있습니다. Jenkins build 실패시 console output에서 Failed 원인에 대한 단서를 찾아볼 수 있기 때문에 로그 내용을 잘 살펴보는 것이 중요합니다.

 

📌 6. 정리

AWS lightsail에 올린 instance에 Jenkins를 설치하고 기본적인 설정 후 item 생성하여 spring project를 build 해보았습니다. 
Jenkins pipeline 방식 말고도 다양한 방법으로 build를 할 수 있는데요. 실무에서도 pipeline 방식을 사용하고 있는 만큼 공부하는 차원에서 pipeline 방식으로 하였습니다.

이제는 여기서 더 나아가 다른 서버에 build된 jar 파일을 Deploy하고 해당 서버에서 애플리케이션 실행까지 pipeline을 통해 단계를 추가할 수 있습니다. 이 부분에 대해서도 구축해보고 블로그에 정리해보려 합니다.

틀린 내용이 있을 수 있습니다. 피드백 언제나 환영합니다. 감사합니다.