우선 Jenkins란
Jenkins란 여러 개발자들이 프로그램을 개발할 때 소스 코드들의 테스트, 빌드, 배포의 프로세스를 자동화하여 지속적인 통합(Continuous Integration) 환경을 제공하여 소프트웨어의 품질과 개발 생산성을 높여주는 Tool이다. 500여 가지가 넘는 다양한 플러그인들을 조합하여 pipeline을 구축하여 CI 과정을 Jenkins에 구축을 해놓게 되면 Jenkins는 구축을 해놓은 처리 방식대로 해당 일들을 처리해준다. 이러한 면에서 보면 로고와 같이 시킨 대로 일을 처리해주는 집사라고 볼 수 있다.
Jenkins가 가져다주는 이점들
반복되는 프로젝트 세팅 작업의 자동화
애플리케이션을 개발하기 위한 프로젝트 세팅 작업은 단순 작업의 반복이므로 귀찮게 느껴진다. Jenkins를 활용하면 이러한 일들로 인한 성가심을 줄일 수 있다. 데이터베이스 구축 혹은 라이브러리 설정, 배포 환경 설정 등을 자동으로 수행함으로써 개발자의 일을 덜어줄 수 있다.
프로젝트 단위의 자동화 환경 구성
Jenkins는 프로젝트별로 구분하여 파이프라인을 구성할 수 있다. 특히 GUI 환경을 제공하기 때문에 구분된 프로젝트를 한눈에 확인할 수 있고 각 프로젝트를 실행할 때 복잡한 명령어 필요 없이 단순히 파이프라인 실행만으로 구성한 프로세스를 진행하는 것이 가능하다.
정적 테스트의 안정성으로 인한 코드 품질 향상
애플리케이션 기능마다 테스트를 수행하기 위해 테스트 환경을 따로 구축한다면 누락되는 부분이 있을 수도 있고 제대로 발견하지 못할 수도 있다. Jenkins를 통해 코드의 정적 검사 프로세스(커버리지 검사 등)를 확실히 잘 구성해 둔다면 테스트 시 발생하는 오류를 줄일 수 있다.
Jenkins를 이용하여 구축하려고 하는 배포 자동화 환경
수동으로 하는 배포 과정
- 개발자가 feature 브랜치에서 기능을 개발 후 merge 후 remote에 push
- EC2 서버로 ssh 접속
- EC2 서버에서 merge 된 코드를 git pull
- gradle을 이용해 빌드를 하여. jar 파일 생성
- jar파일을 java -jar 명령어를 통해 80 포트에 배포
Jenkins 구축으로 배포 자동화를 실현하려고 하는 부분(노란색 부분을 자동화로 구축)
- 개발자가 feature 브랜치에서 기능을 개발 후 merge 후 remote에 push
- webhook을 사용하여 github으로부터 merge를 감지
- 감지를 한 EC2(Jenkins서버)는 코드를 git clone
- gradle을 이용해 빌드를 하여. jar 파일 생성
- 빌드한 목적 파일을 애플리케이션이 실행되어야 할 서버로 전달하고, 애플리케이션을 구동하기 위한 명령어를 실행
Jenkins 구축 실습
사전 준비 : EC2, java설치(11), mysql설치 및 설정
1. AWS EC2에 Jenkins 설치
- jenkins repository key 추가, 및 패키지 저장소 추가 다운로드
$sudo wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
$sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'
- apt-get 업데이트 및 젠킨스 설치
$sudo apt-get update
$sudo apt-get install jenkins
- 젠킨스 실행
//시작
$sudo systemctl start jenkins
//종료(참고)
$sudo systemctl stop jenkins
//재시작(참고)
$sudo systemctl restart jenkins
//젠킨스 상태보기(참고)
$sudo systemctl status jenkins
- 젠킨스 상태 확인 (active가 확인되면 정상적으로 실행된 것)
ESCOD
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-08-30 13:51:26 UTC; 1h 19min ago
Main PID: 76332 (java)
Tasks: 35 (limit: 1146)
Memory: 444.2M
CPU: 1min 20.139s
CGroup: /system.slice/jenkins.service
- [퍼플릭 IPv4 주소]:9090 (sudo cat /var/lib/jenkins/secrets/initialAdminPassword를 통해 확인되면 비밀번호를 입력)
2. 액세스 토큰 발급 및 테스트 (테스트는 생략 가능)
3. 파이프라인 생성하기
4. ssh를 이용하여 서버로 jar파일 전달하기
5. git webhook으로 빌드 유발하기
2~5번 과정은 잘 정리되어 있는 블로그가 있어 해당 블로그를 따라서 진행
막힌 부분
- build 시 EC2 멈춤 현상이 있으므로 스왑 설정해줘야 됨(t2.micro인 경우)
- 처음에 public var ssh 플러그인을 사용하여 ssh 연결하였지만 에러가 지속적으로 발생하여 ubuntu 18로 바꿔 진행하니 문제 해결됨
- jenkins 포트는 기본적으로 8080이지만 tomcat이 8080을 사용하므로 /lib/systemd/system/jenkins.service에서 jenkins 포트 변경해야 됨. 그리고 변경 이후 서비스 설정을 데몬에 반영하기 위해서 sudo systemctl daemon-reload 명령어를 입력하고 jenkins를 시작하면 정상적으로 포트 변경 가능함
'devops' 카테고리의 다른 글
Docker란 (0) | 2023.11.06 |
---|---|
CI/CD (0) | 2022.08.13 |
compile(컴파일), build(빌드), deploy(배포) (0) | 2022.05.12 |