[CI/CD] Jenkins를 활용한 CI/CD 구현 - 2

chrkb1569·2023년 12월 16일
0

개인 프로젝트

목록 보기
22/28

지난 시간에는 Jenkins가 어떠한 특징을 가지고 있으며, 비슷한 기능을 수행하는 Github Action과 어떠한 차이점을 가지고 있는지, 간략하게 알아보는 시간을 가졌습니다.

오늘은 Jenkins를 직접 활용하여 CI/CD 환경을 구축해보도록 하겠습니다.

프로젝트

배포하는 프로젝트는 Github Action을 연습할 때 사용하였던 Repository를 그대로 사용하도록 하겠습니다.

https://github.com/chrkb1569/DevOps-Practice

단, 이번에는 Github Action을 사용하지 않을 예정이기 때문에, 다음처럼 Github Action의 동작을 중단시키도록 하겠습니다.

Jenkins Instance

일단 가장 먼저 Jenkins를 띄우기 위한 인스턴스를 만들어보겠습니다.

AWS EC2를 사용하여 다음처럼 인스턴스를 생성하였습니다.

그런데 프리티어로 잘 동작할지는 모르겠네요 ㅋㅋ

인스턴스를 정상적으로 생성하였다면, Jenkins가 동작하기 위하여 필요한 프로그램들을 설치해야합니다.

설치하는 과정은 다음처럼 Jenkins 공식 문서에 잘 정리되어있습니다.

https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

Linux 기준으로 설명하자면, Jenkins 프로그램과 Java를 설치해야합니다.

JDK 설치

$ sudo apt update
$ sudo apt install fontconfig openjdk-17-jre
$ java -version

Jenkins 설치

$ sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian/jenkins.io-2023.key
$ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install jenkins

공식 문서에 제공되어있는 명령어들을 그대로 사용하였기 때문에 어려운 점은 딱히 없었습니다.

Jenkins 페이지 접속

다음처럼 Jenkins는 기본적으로 8080 포트에서 동작하는데, 정상적으로 동작하는 것 같으니 페이지에 접속해보겠습니다.

페이지에 접속은 {IP 주소}:8080 으로 접속할 수 있으며, 접속할 경우 다음과 같은 페이지를 확인할 수 있을 것입니다.

비밀번호를 입력해달라는 페이지를 확인할 수 있으며, 파일 경로가 하나 주어지는데,

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

다음 명령어를 통하여 비밀번호를 확인한 뒤, 이를 입력해줍니다.

그리고 다음 화면에서 기본적으로 필요한 플러그인을 자동 설치합니다.

설치가 완료되면 다음 페이지에서 관리자 계정을 생성할 수 있습니다.

일단 생성해줍시다.

관리자 계정을 생성하였다면, 다음처럼 Jenkins 메인 페이지를 확인할 수 있습니다.

그럼 이제부터 CI/CD를 위한 설정을 해보도록 하겠습니다.

Jenkins 설정

Plugin 설치

본격적으로 Jenkins를 위한 설정을 하기 전에, 잠시 어떻게 CI/CD 환경을 구축할 것인가를 간략하게 설명하자면 Jenkins 서버가 Github로부터 프로젝트 코드를 가져와 빌드를 한 뒤, 생성된 jar파일을 애플리케이션 서버로 전송하고 이를 실행하는 방식으로 구성할 예정입니다.

이때, Jenkins 서버가 애플리케이션 서버로 jar 파일을 전송할 때, SSH 통신을 사용할 예정이기 때문에, 우리는 SSH와 관련된 플러그인이 필요합니다.

좌측 상단 메뉴의 Jenkins 관리를 선택해줍니다.

그리고 다음처럼 우측에 Plugins를 선택해줍니다.

그리고 Available Plugins를 선택해주면, 우리가 설치할 수 있는 플러그인들을 검색할 수 있는데,

Public Over SSH를 설치해줍시다.

그리고 다음으로는 SSH 통신 대상인 애플리케이션 서버를 등록해줍시다.

SSH Server 등록

메인 페이지 -> Jenkins 관리 -> System 을 선택해줍니다.

그럼 다음과 같은 화면을 확인할 수 있을텐데,

제일 하단에 다음처럼 SSH와 관련된 옵션이 있습니다.

SSH Server 추가를 선택하여 다음처럼 애플리케이션 서버와 관련된 사항들을 기입해주겠습니다.

이렇게까지만 설정하고 마치면 매우 쉬웠겠지만, Jenkins 서버와 Application 서버가 통신하기 위해서는 Application Server의 키정보가 필요합니다.

우리가 ssh 통신으로 원격 접속할 때 .pem 파일을 사용했던 것처럼요

따라서, 다음 옵션을 통하여 키정보 또한 등록해줘야합니다.

Jenkins 서버에서 Application Server로 파일을 전송해야하기 때문에, SSH Server에는 Application Server의 정보를 입력하였지만, Key 부분에는 Jenkins Server의 키정보를 입력해야합니다.

일단 Jenkins 서버에 접속한 뒤, 다음 명령어를 통하여 키파일이 위치한 디렉토리로 이동해줍니다.

$ cd .ssh

해당 디렉토리로 이동한 뒤, 다음 명령어를 통하여 Jenkins 서버의 public Key와 private Key를 생성해줍니다.

$ ssh-keygen -t rsa

그럼 다음처럼 2개의 파일이 생성되는 것을 확인할 수 있는데, .pub이라는 파일이 public Key, 그렇지 않은 파일이 private Key입니다.

다음 명령어를 통하여 생성된 Jenkins Server의 Private Key를 확인합니다.

$ sudo cat id_rsa

좀 많이 긴데, 이 키 정보를

이곳에 입력하고 저장해줍니다.

그리고 Public Key 역시 동일한 명령어를 통하여 확인해줍니다.

$ sudo cat id_rsa.pub

public Key의 경우에는 길이가 좀 짧은데, 이 키 정보를 Application Server에 전달해야합니다.

Application Server에 접속해보겠습니다.

Application Server에도 다음처럼 authorized_keys라는 파일이 존재하는데, 다음 명령어를 통하여 이 파일을 수정해봅시다.

$ sudo vim authorized_keys

그리고 다음처럼 Jenkins Server의 Public Key를 입력해줍니다.

좌측 메뉴 상단에 존재하는 새로운 Item을 선택해줍니다.

이렇게까지하면 SSH 통신을 위한 준비는 끝났습니다.

Jenkins 프로젝트 설정

사용할 이름을 입력해준 뒤, Freestyle Project를 선택합니다.

그럼 다음처럼 본격적으로 Jenkins 설정을 위한 페이지를 확인할 수 있습니다.

General

추가적인 설정은 하지 않고 넘어가겠습니다.

소스 코드 관리

관리하기 위한 소스 코드를 등록하는 설정란입니다.

다음처럼 Repository의 주소를 복사한 뒤,

다음처럼 입력해줍니다.

빌드 유발

추가적인 설정 없이 넘어가도록 하겠습니다.

빌드 환경

아까 SSH 관련 플러그인을 다운 받았던 이유가 바로 빌드 환경에서 SSH와 관련된 옵션을 선택하기 위함이었습니다.

다음처럼 실행할 jar파일의 위치, 배포 후 실행할 명령어들을 기입해줍니다.

Build Steps

gradle을 통하여 jar 파일을 build할 예정이니, 다음처럼 Invoke Gradle Script를 선택해줍니다.

옵션을 선택하면 다음처럼 Default밖에 선택할 수 없을텐데, Gradle도 하나 새로 만들어줘야합니다.


SystemConfiguration -> Tools -> Gradle Installations 옵션으로 이동

다음처럼 Gradle 이름과 버전을 선택한 뒤, 저장

그리고 아까 옵션으로 다시 돌아오면 다음처럼 생성한 Gradle을 확인할 수 있습니다.

Gradle을 통하여 실행할 명령어들을 기입합니다.

빌드 후 조치

별다른 옵션은 지정하지 않을채로 넘어갑니다.

실행

좌측에 위치한 메뉴에서 지금 빌드를 선택하여 Jenkins를 통한 프로젝트 배포가 어떻게 이루어지는지 확인해봅시다.

다음처럼 빌드가 되는 것을 확인할 수 있습니다.

무한 로딩 현상 발생

빌드를 시작한지 20분 정도 지났지만, 로딩이 계속되는 현상이 발생하였습니다.

물론 잘못된 초기 설정으로 인하여 오류가 발생할 수도 있겠지만, 그렇다면 실패했다는 빌드 결과를 확인할 수 있어야 한다고 생각합니다.

아무래도 프리티어를 사용하기 때문에 서버 스펙이 부족하여 발생하는 현상인 것 같습니다.

일단 오늘은 여기까지 진행하고, 다음에는 Jenkins 서버 인스턴스의 스펙을 변경하여 동일한 과정을 진행해보도록하겠습니다.

Reference

https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

0개의 댓글