Infra/CI, CD

[Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사용하기)

민돌v 2023. 4. 11. 21:44
이번 게시물에서는 Jenkins 사용방법에 대해서 기록해보고자 합니다.
초기 설정부터 하는건 처음이라 두근두근 하네요 

 

===== Jenkins 간단 CI/CD 구축해보기 Series.  =====

 

 

[목차]

  1. Jenkins 를 사용하고자 하는 이유 
  2. Jenkins란
  3. Jenkins 설치 및 사용 하기
  4. Jenkins 파이프라인 동작과정 ------- (여기부터는 글이 너무 길어져 별도의 포스팅으로 뺐습니다.)
  5.  jenkins - git 연동
  6.  jenkins execute shell gradle build
  7. 프리티어에서 Jenkins 사용하기
  8. 젠킨스 빌드후 ec2 배포하기

 


1. Jenkins 를 사용하고자 하는 이유 

이전에 단순 ec2  에 pull 받아 배포한 글 → [AWS] EC2 에 Spring boot 올리는 과정 및 삽질 (with java 17 + spring boot3.0)

현재는 위의 글처럼 단순하게 ec2 를 마치 로컬pc 인 것처럼 git pull 을 받고 build를 돌리고 nohub 으로 백그라운드 실행을 손수 직접 하는 형태로 배포를 진행했습니다.

 

→ 하지만 EC2 가 프리티어라 그런지, build (test) 시점에서 CPU 가 미친듯이 쏟아서 종종 멈추는 상황이 발생했습니다.. ㅠㅠ 


[확인한 문제 상황]

  • 빌드만 4분째 돌아가는중.. 말이 4분이지 쭉 기다리면 10분 넘게 돌아가다가 서버가 죽어버리셔서, ec2 를 재부팅한다음 다시 build 를 돌려 운좋게 jar 가 만들어지면 백그라운드 실행시키며 근근히 배포를 이어가고 있는데..

 

이거 왜이러나 해서 CPU 메모리를 확인해보니  (리눅스에서 CPU 사용량 확인 방법 참고)

치솟는 CPU와.. 

빌드 돌리기만 할 뿐인데 CPU 다잡아버리기.. 그러면서 메모리가 부족해 kswpd0 프로세스가 돌면서 또 CPU 메모리를 전부 잡아먹는 문제 발생했습니다 ㅠㅠ

kswpd0 프로세스의 경우 리눅스의 가상메모리(Vitrual Memory) 를 담당하는 프로세스로 메모리가 부족해서 SWAP메모리를 사용할때 생성되는 프로세스라고합니다

 

그리하여! 아..! 빌드는 외부에서 돌리고 jar 파일만 가져와야겠다!! 생각이 들어 Jenkins 를 프로젝트에 도입해보고자 합니다 🫡

 


2. Jenkins란

  • 지속적 통합(Continuous Integration, CI)과 지속적 배포(Continuous Delivery, CD)를 위한 대표적인 도구인 Jenkins가 설치된 서버를 제공하는 서비스입니다.
  • 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질 향상과 개발 생산성 향상에 도움을 주는 도구입니다.
  • 소스 변경 사항을 프로젝트에 지속적으로 통합하여 ​​코드의 오류를 조기에 발견하고 빠른 피드백을 통해 안정적인 릴리즈를 지속적으로 제공할 수 있습니다.
  • ​"Jenkins"는 소프트웨어 개발 시 지속적 통합(Continuous Integration) 서비스를 제공하는 오픈소스인 Jenkins를 이용하고 있습니다.

 

📌 한줄로 요약하자면 빌드 자동화 서비스입니다.

 

참고글에 다양하게 작성을 비교를 해놓아지만 저와 사이드를 같이하는 팀원이 젠킨스를 결정한 가장 큰 이유는 현재 현업에서 사용중이기 때문 입니다.

조금 더 익숙해지기 위해 사용함으로 간단한 프로젝트라면 저는 깃 액션을 추천드립니다!

 


3. Jenkins 설치 및 사용 하기

  • jenkins 는 오픈소스이기 때문에 가상 클라우드 환경 (aws) 에서 사용하기 위해서 별도의 서버, 즉 ec2를 올려야 합니다.
  • (로컬에서만 사용할 거라면 상관없음)

 

1) EC2 를 새롭게 만들어서 ssh 로 접속했습니다.

Jenkins는 java 기반의 오픈소스이기 때문에 JAVA 를 설치해 주어야 합니다.

$ sudo apt-get install openjdk-17-jdk

java 17도 지원을 해줍니다

 

2) repository key 및 repository 추가 (2023 년도 부터 jenkins apt-key가 변경되었습니다 : https://pkg.jenkins.io/debian/)

//순서
curl -fsSL https://pkg.jenkins.io/debian/jenkins.io-2023.key | sudo tee \
    /usr/share/keyrings/jenkins-keyring.asc > /dev/null
//대로
  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

 

 

3) apt-get 업데이트

sudo apt-get update

 

4) jenkins 설치

sudo apt-get install jenkins

설치 에러 로그 참고 (jenkins.service - Jenkins Continuous Integration Server)

더보기

● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Tue 2023-03-14 01:02:39 UTC; 7ms ago
    Process: 3223 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)
   Main PID: 3223 (code=exited, status=1/FAILURE)
        CPU: 7ms

Mar 14 01:02:39 ip-172-31-14-237 systemd[1]: jenkins.service: Main process exited, code=exited, status=1/FAILURE
Mar 14 01:02:39 ip-172-31-14-237 systemd[1]: jenkins.service: Failed with result 'exit-code'.
Mar 14 01:02:39 ip-172-31-14-237 systemd[1]: Failed to start Jenkins Continuous Integration Server.

 

→ 저는 jenkins 설치 시 해당 에러가 있었고 java 17 버전을 설치해 jenkins 와 호환성이 맞지 않아서 생기는 문제였습니다

yum list | grep jdk

위와 같은 명령어로 확인하면 jenkins 는 jdk8 과 호환하는데 공식홈페이지는 java 11 버전 이상을 지원한다고 나와있어서

java 11 로 다운그레이드 하니 정상적으로 설치가 되었습니다!


👏 하지만 추후에, 프로젝트가 jdk 17을 필요로 했기 때문에 다시 17로 받아서 하니 정상적으로 빌드가 돌아갔습니다. 위에서는 java path 를 정상적으로 설정해주지 않아서 생겼던 문제 같습니다.

 

5) jenkins 실행

$ sudo systemctl start jenkins //Jenkins 실행

 

6) 접속 public IPv4 8080 포트로 접속

접속 비밀번호는 위의 홈페이지 경로에 적혀있습니당

$ sudo vi 경로

 

7) 설치 및 계정 생성

 

그러면! 다음에 접속할때는 로그인 화면이 나오고 로그인 후 홈페이지가 나옴!

 

 


4. Jenkins 파이프라인 동작과정

🫡 https://thalals.tistory.com/424

 

[Jenkins] 젠킨스 Job과 Pipeline 이란 ?

Jenkins 의 빌드 기능을 사용하는데있어서 Jenkins 라는 서비스의 기본적인 구성요소 정도는 알고싶어서 정리하는 글입니다. 틀렸거나 더 좋은 내용이 있다면 지적 부탁드리겠습니다! [목차] jenkins j

thalals.tistory.com

 


5. jenkins - git 연동

👏🏻 https://thalals.tistory.com/423

 

[Jenkins] Jenkins, Github 연동 → branch merge 후 Jenkins 자동 빌드

깃허브와 Jenkins 를 연동해보자,, 웹 훅킹으로 merge 시 자동 빌드까지..! 이전에 bitbucket 과 jenkins 의 웹훅을 이용한 연결을 시도해보았는데 이번에는 사이드 프로젝트를 진행하면서 Github를 사용하

thalals.tistory.com


 

6. jenkins execute shell gradle build

  • 위의 글을 읽으시면 jenkins의 전반적인 동작과정과 job 의 생성과정 + github 와의 연동 과정에 대해 이해할 수 있습니다.
  • 저는 단순하게 빌드가 유발되면, 연결된 github 에서 clone 된 파일들을 bulid 하여 jar 파일을 생성하고자 합니다.

 

script shell의 리눅스 명령어가 얼추 비슷하게 먹길래 일단 해당 job 의 저장 공간을 찾아보았습니다. 아래 url 에 존재하던군요

/var/lib/jenkins/workspace/{job project name}/api

 

 

그렇게 수정해 주고 빌드를 돌렸더니 너무 너무 오래걸린다ㅣ..

gradle 도 새로 다운받고,, jenkins 를 올린 서버도 프리티어라 그런지 결국 터져버렸습니다 ..ㅎㅎ

이에 대한 문제 해결방법으로 Swap Space를 사용해 주었습니다. ↓↓↓


7. 프리티어에서 Jenkins 사용하기

📗 https://thalals.tistory.com/426

 

[AWS] 프리티어에서 Jenkins 사용하기 (With. Swap 메모리 사용하기)

ec2 에서 직접 빌드를 돌리면 cpu 사용량이 급증하여 서버가 터져버리기 때문에 Jenkins 라는 빌드 서비스를 사용하고자 했습니다. 하지만 jenkins 또한 freetier EC2 서버를 사용하였기 때문에 cpu 과부하

thalals.tistory.com

 

젠킨스에서 기타 비밀정보들을 저장한 레포지토리인 서브모듈 설정도 해주고~

 

크... 빌드 성공 ㅠㅠㅠ 포스팅보면 간단해 보이지만 빌드만 50번 돌리면서 고쳐갔네요 ㅠㅠ (젠킨스는 고통이다..)

 

 

이제 마지막으로 jenkins 에서 대신 빌드해주어서 만든 jar 파일을 EC2 서버에 배포하고자 합니다.


8.  Jenkins 빌드 후 EC2 배포하기

🔥 https://thalals.tistory.com/430

 

[젠킨스] Jenkins 빌드 후 EC2 배포 하기 - Publish Over SSH

Jenkins 를 이용한 CI/CD 연동해보기 시리즈..! [Infra/CI, CD] - [Jenkins] Jenkins, Github 연동 → branch merge 후 Jenkins 자동 빌드 [Infra/CI, CD] - [Jenkins] 젠킨스 Job과 Pipeline 이란 ? [Infra/CI, CD] - [AWS] 프리티어에서 J

thalals.tistory.com

 

 

 

젠킨스를 사용해서 전반적으로 배포하는 프로세스를 한바퀴 돌려보았습니다 ! !

인프라 구축 끝!

 

 


참고