[Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사용하기)
이번 게시물에서는 Jenkins 사용방법에 대해서 기록해보고자 합니다.
초기 설정부터 하는건 처음이라 두근두근 하네요
===== Jenkins 간단 CI/CD 구축해보기 Series. =====
- 👉🏻 [Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사용하기)
- ✔️ [Jenkins] 젠킨스 Job과 Pipeline 이란 ?
- ✔️ [Jenkins] Jenkins, Github 연동 → branch merge 후 Jenkins 자동 빌드
- ✔️ [AWS] 프리티어에서 Jenkins 사용하기 (With. Swap 메모리 사용하기)
- ✔️ [Jenkins] 젠킨스 빌드 후 EC2 배포 하기 - Publish Over SSH
[목차]
- Jenkins 를 사용하고자 하는 이유
- Jenkins란
- Jenkins 설치 및 사용 하기
- Jenkins 파이프라인 동작과정 ------- (여기부터는 글이 너무 길어져 별도의 포스팅으로 뺐습니다.)
- jenkins - git 연동
- jenkins execute shell gradle build
- 프리티어에서 Jenkins 사용하기
- 젠킨스 빌드후 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를 이용하고 있습니다.
📌 한줄로 요약하자면 빌드 자동화 서비스입니다.
- 빌드자동화의 툴은 github action 이나 code deploy 도 존재하지만 저는 jenkins를 사용하고자 합니다.
- 참고 : 젠킨스(Jenkins) vs Code Build vs Git Actions
참고글에 다양하게 작성을 비교를 해놓아지만 저와 사이드를 같이하는 팀원이 젠킨스를 결정한 가장 큰 이유는 현재 현업에서 사용중이기 때문 입니다.
조금 더 익숙해지기 위해 사용함으로 간단한 프로젝트라면 저는 깃 액션을 추천드립니다!
3. Jenkins 설치 및 사용 하기
- jenkins 는 오픈소스이기 때문에 가상 클라우드 환경 (aws) 에서 사용하기 위해서 별도의 서버, 즉 ec2를 올려야 합니다.
- (로컬에서만 사용할 거라면 상관없음)
1) EC2 를 새롭게 만들어서 ssh 로 접속했습니다.
Jenkins는 java 기반의 오픈소스이기 때문에 JAVA 를 설치해 주어야 합니다.
$ sudo apt-get install openjdk-17-jdk
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
5. jenkins - git 연동
👏🏻 https://thalals.tistory.com/423
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
↓
젠킨스에서 기타 비밀정보들을 저장한 레포지토리인 서브모듈 설정도 해주고~
크... 빌드 성공 ㅠㅠㅠ 포스팅보면 간단해 보이지만 빌드만 50번 돌리면서 고쳐갔네요 ㅠㅠ (젠킨스는 고통이다..)
이제 마지막으로 jenkins 에서 대신 빌드해주어서 만든 jar 파일을 EC2 서버에 배포하고자 합니다.
8. Jenkins 빌드 후 EC2 배포하기
🔥 https://thalals.tistory.com/430
젠킨스를 사용해서 전반적으로 배포하는 프로세스를 한바퀴 돌려보았습니다 ! !
인프라 구축 끝!
참고
- jenkins 공식 - https://www.jenkins.io/
- jenkins 공식 가이드 - https://www.jenkins.io/doc/
- jenkins 설치 - https://yeonyeon.tistory.com/56
- jenkins 설치 - https://narup.tistory.com/259
- jenkins swap memory - https://gksdudrb922.tistory.com/196
- jenkins job - https://minholee93.tistory.com/entry/Jenkins-Jobs