인턴 활동 중 Jenkins CI/CD 파이프라인 구축 업무를 맡으면서, 얻은 인사이트를 기록으로 남기고자 포스트를 적게 되었습니다.
이전에 Github Actions을 활용하여 프로젝트의 CI/CD를 구축할 때, Jenkins 또한 고려사항에 있었지만 높은 학습 비용으로 인해 미룬 바가 있었습니다. 하지만 이번 테스크를 통해, 관심이 있던 Docker와 Jenkins를 깊게 학습할 수 있어 감사히 생각합니다.🙇🏻♂️
https://wch-0625.tistory.com/161 (Github Actions 활용기)
1. Jenkins란?
우선 Jenkins는 코드의 변경 사항이 있을 때 자동으로 빌드하고 테스트하는 CI(지속적 통합), CI가 완료된 코드를 서버에 자동으로 배포하는 CD(지속적 배포)를 제공하는 오픈소스 프로젝트이다.
역사를 간단하게 짚고 넘어가면 2004년에 Hudson이라는 이름으로 시작되었으나, Oracle이 상표권을 소유하게 되면서 Jenkins 이라는 이름으로 분리되어 계속 발전되어 왔다.
Jenkins의 장점을 살펴보자면, 많은 플러그인을 통해 Docker / AWS / Git / Kubernetes 등의 기능을 유연하게 확장할 수 있다. 또한 기본적으로 웹 기반의 GUI 인터페이스를 제공하여, 개발자가 쉽게 CI/CD 파이프라인을 구축하고 그 결과를 한 눈에 확인할 수 있다.
2. 왜 Docker를 이용해 Jenkins를 설치할까?
일단 Jenkins의 설치가 매우 편해진다.
Jenkins는 자바 기반 애플리케이션으로, JDK를 설치하고, 공식 문서를 참조해서 JDK 버전에 맞는 적절한 Jenkins package를 내려받고, 설치해야 한다. 하지만 도커를 사용한다면, `docker run -d -p 8080:8080 jenkins/jenkins:version`명령어 하나로 모든 환경에서 동일한 Jenkins 환경을 구성할 수 있다.
Jenkins 버전 관리 또한 매우 쉬워진다.
`docker pull jenkins/jenkins:version`으로 쉽게 업그레이드 된 컨테이너를 생성해 실행할 수 있고, 이전 버전으로의 롤백 또한 가능하다.
(참고로 기존 컨테이너의 설정 정보를 그대로 적용하고 싶다면 -v jenkins_home:/var/jenkins_home 볼륨 마운트를 꼭 잊지 말고 하자!)
도커의 장점인, Jenkins 컨테이너를 격리된 환경에서 운영할 수 있다.
여러 팀이 서로 다른 Jenkins 설정을 필요로 할 경우, 각 팀 별로 독립된 Jenkins 컨테이너를 운영할 수 있다. 이와 같은 경우 도커를 활용하여 여러 Jenkins 인스턴스의 독립된 환경을 손쉽게 구축하고 관리할 수 있다.
(1개의 서버에서 여러 Jenkins 컨테이너를 독립적으로 운영한다고 생각하면 매우 큰 이점을 얻을 수 있다.)
3. Jenkins 설치
1) AWS EC2 swap 메모리 설정
먼저 Jenkins 컨테이너의 원활한 실행을 위해, EC2 swap 메모리 설정으로 메모리를 확보하도록 하자.
https://wch-0625.tistory.com/170
2) Docker 설치
// 모든 패키지 업데이트
sudo apt-get update
// Dokcer 설치
sudo apt-get install docker -y
// Docker 버전 확인
docker -v
// Docker 그룹에 사용자 추가 (Docker 명령어 사용할 때마다 sudo 없이 실행 가능)
sudo usermod -aG docker $USER
3) Jenkins 설치
Jenkins 파이프라인 내에서 docker 명령어를 사용하는 경우와, 사용하지 않는 경우에 따라서 Jenkins 컨테이너를 실행하는 명령어가 달라진다.
1. docker 명령어를 사용하지 않는 경우
단순히 클론한 repo를 빌드하고 scp 프로토콜을 이용하여 `.jar` 파일을 서버에 전송하여 배포하는 것이 목적이다.
도커 허브에서 최신 jenkins 이미지를 다운로드 받고, 해당 이미지로 컨테이너를 생성해 실행한다.
(-p: 호스트의 8080 포트를 컨테이너의 8080 포트에 매핑하고, --name: 컨테이너 이름은 jenkins로 지으며, -d: 백그라운드에서 실행하도록 한다.
또한 -v: 설정, 플러그인, 작업 및 빌드 기록, 크레덴셜 등 정보를 컨테이너가 삭제되더라도 호스트에서 관리할 수 있도록 한다.)
docker run -d --name jenkins -p 8080:8080 -v jenkins_home:/var/jenkins_home jenkins/jenkins:
2. docker 명령어를 사용하는 경우
빌드한 `.jar` 파일을 도커 이미지로 생성하고, 버전 관리를 위해 도커 레지스트리에 push, 서버에서 도커 레지스트리에서 pull을 받아 실행하는 것이 목적이다. 이와 같이 `docker` 명령어가 필요한 플로우를 구현하기 위해서는 아래와 같이 실행해주도록 한다.
젠킨스 컨테이너에서, 호스트의 Docker daemon으로 도커 명령어를 사용할 수 있게 하도록 관련 파일을 마운트 해주도록 한다.
(/var/run/docker.sock: Docker CLI가 Docker daemon에게 명령을 내리고, 명령을 처리한 결과를 전달하는 작업을 수행하는 소켓 파일)
docker run -d --name jenkins -p 8080:8080 -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins
참고로 이를 구분지어 소개한 이유는 1번째 방법으로 실행된 도커 컨테이너에서 별도로 볼륨을 마운트를 해 줄 수 없다.
따라서 컨테이너 삭제 후 2번째 방법으로 다시 실행해주어야 한다. 이러할 경우 아래의 4)Jenkins 설정을 다시 해주어야 하는 번거로움이 있기 때문에, 초기에 어떻게 CI/CD 플로우를 구현할 것인지 고민을 해보고 Jenkins 컨테이너를 실행해주도록 하자.
4) Jenkins 설정
1. EC2 {Public IP:8080} 주소 접속
2. 초기 접속을 하기 위해 관리자 비밀번호를 조회해 입력한다.
// jenkins 컨테이너 접속
docker exec -it jenkins bash
// jenkins 컨테이너에서 초기 관리자 비밀번호 저장 파일 확인
cat /var/jenkins_home/secrets/initialAdminPassword
3. 젠킨스 초기 플러그인 설정에서 추천 플러그인들을 설치한다.
4. 젠킨스 관리자 유저 설정을 한다.
5. 젠킨스에 접속할 URL을 설정한다.
6. 젠킨스의 모든 설치가 끝났다.
'DevOps > CI-CD' 카테고리의 다른 글
Jenkins CI/CD 구축하기 2편 (with. Docker) (0) | 2024.09.05 |
---|---|
Github Actions CI/CD 프로젝트 적용기 (1) | 2024.06.08 |
SSH (Secure SHell) 이란? (1) | 2024.06.04 |