슬기로운 개발자생활/DevOps

Docker, Jenkins 활용 CI/CD 구축 (React, Kotlin+Spring) 1편 - Jenkins 서버 설정

개발자 소신 2024. 1. 4. 20:53
반응형

SSAFY 프로젝트 진행 중 인프라를 구축하는것에 진심인 친구가 Jenkins, Docker를 활용해 자동배포 시스템을 구축한 것을 보고 CI/CD에 관심이 생겼다. CI/CD는 내용이 많기 때문에 3편 정도로 나누어서 진행할 예정이고, Jenkins pipeline를 활용하면 설정이 편해지지만, 각각의 구성요소를 확인해보기 위해 직접 한땀한땀 구현할 것이다.

CI/CD

Continuous Integration(CI) and Continuous Deployment(CD)를 통칭해 이르는 말로 지속적인 통합(소스코드 빌드/테스트 자동화)과 지속적인 배포(무중단 서비스 제공)을 의미한다.

순서

0.  전체 흐름
1.  준비사항
2.  Docker, Jenkins 설치
3.  Jenkins 설정
4.  Trouble Shooting

0. 전체 흐름

  • 이번 프로젝트에서 구축한 CI/CD의 아키텍처이다.
  1. (우측 하단) 깃허브에서 배포 브랜치에 webhook을 걸어놓고 git push, merge request 이벤트가 발생하면 Jenkins에서 빌드/테스트, 배포를 진행한다.
  2. (위쪽 화살표) React의 경우 빌드/테스트가 끝나면 build폴더가 나오기 때문에 해당 폴더를 웹서버에 옮겨주었다. (도커화가 불필요)
  3. (왼쪽 화살표) 코프링의 경우 Dockerfile에서 빌드/테스트가 이뤄지고 Docker 이미지를 docker hub에 업로드, 웹서버에서 docker-compose 파일을 통해 이미지를 pull받고 container를 생성한다.
  4. 웹서버에는 기본적으로 Nginx가 돌아가고 있는 상태, frontend연결하고 /api로 시작할 경우 백엔드로 전달하는 proxy_pass 설정

1. 준비사항

서버

  • 젠킨스를 돌려놓을 서버를 하나 준비한다.
  • Jenkins를 사용하는 데에는 1cpu, 1gb ram으로 충분하지만, 여유를 두기 위해 2cpu, 4gb ram 서버에서 진행하였다.
  • 또한, 배포를 진행할 웹서버도 필요하다. Jenkins 서버에서 웹서버를 같이 띄우는 경우는 거의 없으므로..?

2. Docker, Jenkins 설치

sudo apt-get update
sudo apt-get install \
 ca-certificates \
 curl \
 gnupg \
 lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

※ 여기서부터 AWS는 Docker사용할 때 sudo를 붙여줌

  • 도커 설치 완료 여부 테스트
docker run hello-world

  • Jenkins 설치 (Docker Image)
docker pull jenkins/jenkins:lts

# 설치된 도커 이미지 확인
docker images
  • Jenkins container 실행
docker run -d -p 8181:8080 -v /jenkins:/var/jenkins_home --name jm_jenkins -u root jenkins/jenkins:lts
  • -d: 백그라운드 실행
  • 8181포트로 접속시 컨테이너 내부 8080포트로 연결
  • -v: 디스크에 데이터 저장 (container 날라가도 데이터 복구 가능 -> 버전 변경가능)
  • --name: conatiner 이름 설정
  • -u: 사용자 계정 이름 설정
  • 이미지이름, 버전

여기까지 진행하면 Jenkins container 띄우는 것 까지는 성공이다.
확인 명령어는 docker ps -a

 

이후 서버 접속 시 아래와 같은 화면이 뜬다 ! 8181 포트 열어줘야함.

3. Jenkins 설정

  • 다음의 화면에서 관리자 비밀번호를 입력해야한다.
    docker logs [container_id]를 통해 쉽게 확인 가능

password

 

 

unlock

 

  • Install Suggested Plugin 권장설정으로 설치한다.

 

설치가 되고 있는 화면

  • Jenkins 관리자 계정 설정

admin

  • URL 설정하고 설정 Finish

 

4. Trouble Shooting

  • 위에서도 적었지만, permission denied 에러가 날 경우 sudo를 붙여서 명령어 실행
  • no matching entries in passwd file
    AWS에서 설정할 때 발생한 문제인데, 유저명이 서버 유저명을 따라가는 줄 알고 ubuntu를 넣었는데 컨테이너만 생성되고 실행은 안됐다. root로 바꾸니 정상적으로 실행됨

 

이어서 계속

댓글 질문 환영

반응형