CI-CD

minjun kim·2025년 4월 21일
post-thumbnail

ssafy에서 AIoT 프로젝트 중 백엔드와 인프라 역할을 수행하면서 배운점을 정리해보려고 한다.

이번 편에서는 기초적인 설정만 이야기하겠다

참고한 블로그
규바 ec2 Gitlab Docker Jenkins https Vue Springboot CI/CD 배포

전체 흐름

🔥시스템 아키텍처

  • 시스템을 설계하는데 꽤나 어려움을 겪었다.
  • 웹훅을 걸어서 master브랜치 변경에 따라 jenkins가 실행되도록 구성하였다.
  • 환경 일관성 유지, 확장성, 배포 자동화를 위해 docker를 사용하였다
  • 다양한 docker컨테이너를 쉽게 관리하기 위해 docker compose를 사용하였다.

🙂 cicd 흐름

  1. gitlab master 브랜치가 업데이트된다.
  2. gitlab 웹훅에 의해 jenkins에 알림이 간다
  3. 알림을 받은 jenkins는 프로젝트에 있는 jenkinsfile을 바탕으로 빌드 및 docker-compose를 실행한다.
  4. docker compose가 각 docker 이미지를 실행하고 볼륨과 네트워크를 설정한다.
  5. 컨테이너를 띄워서 배포를 완료한다.

ec2 설정하기

  • 싸피에서 제공해주는 ec2(large)를 사용할 수 있었다.

1. 접속하기

ssh -i 키파일 ubuntu@서버주소

  • 키파일의 경로와 현재 cmd 경로를 잘 확인하자!!

- 트러블 슈팅

  • 권한설정이 안된 키파일을 사용해서 접속에 실패하였다.
  • 권한 설정을 하여 이를 해결하였다
    https://ongamedev.tistory.com/494 (참고한 블로그)

💜 UFW 설정

- 외부에서 nginx로 접속할 수 있도록 우분투 방화벽(UFW)에서 포트를 열어주었다.

1. 처음 ufw 설정 시 실수로 ssh접속이 안되는 경우를 방지하기 위해
   ssh 터미널을 여유있게 2~3개 연결해 놓는다.

2. ufw 상태 확인
$ sudo ufw status
Status : inactive

3. 사용할 포트 허용하기 (ufw inactive 상태)
$ sudo ufw allow 22

3-1 등록한 포트 조회하기 (ufw inactive 상태)
$ sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow 22

4. ufw 활성화 하기
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

4.1 ufw 상태 및 등록된 rule 확인하기
$ sudo ufw status numbered
Status: active

ufw에 허용된 포트 확인
sudo ufw status numbered

80번 포트를 추가로 설정
sudo ufw allow 80

numbered에 등록된 번호4번 포트를 삭제(연습용)
sudo ufw delete 4

(중요) 삭제한 정책은 반드시 enable을 수행해야 적용된다.
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y입력
sudo ufw allow 443 (https)
sudo ufw allow 9090 (젠킨스)
스왑 메모리 설정
현재 메모리는 16GB로 굉장히 넉넉하지만, (연습+만약을 대비)를 이유로 가상 메모리 기법을 적용하였다. (다음에 freetier 사용할때 적용하면 좋을듯 싶다)
아마존 공식 추천 가이드에 맞추어 16GB의 절반인 8GB를 스왑메모리로 적용하였다.

시스템 업데이트 및 도커 설치

sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get install ca-certificates
sudo apt-get install curl
sudo apt-get install software-properties-common

도커 공식 GPG( 오픈 소스 암호화 도구 GNU Privacy Guard)

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

도커 저장소 추가

sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
   
sudo apt-get update

도커 설치

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

시스템 실행시 도커 자동 실행

sudo systemctl start docker
sudo systemctl enable docker

도커 버전확인

docker --version
Jenkins 설치
젠킨스 + 도커 사용 방법
젠킨스 도커 이미지를 받기 (도커 내부에서 젠킨스 구동)
호스트에 젠킨스 직접 설치

우리의 경우 docker in docker 문제가 발생할 수 있기에 호스트에 직접설치하는 방식을 활용했다.

자바 설치

sudo apt update
sudo apt install openjdk-17-jdk -y
java -version

jenkins는 자바로 구동되기 때문에 자바가 필요하다!!
설치

curl -fsSL https://pkg.jenkins.io/debian-stable/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-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null

$ sudo apt-get update

$ sudo apt-get install jenkins

확인

$ sudo systemctl status jenkins

jenkins 권한 주기

sudo usermod -aG docker jenkins

$ sudo systemctl start jenkins

초기 비밀번호 확인

$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

트러블 슈팅

우리의 경우 젠킨스 포트번호가 기존 실행중인 코드와 겹쳐서 오류가 발생하였다.
이를 해결하기 위해 2가지 파일에서의 포트 번호를 변경하였다. (9090)

기본적인 시스템 젠킨스 포트 변경 (이것만 변경했을때는 적용이 되지 않았다)
sudo nano /etc/default/jenkins

젠킨스 서비스에서 포트 변경
sudo nano /usr/lib/systemd/system/jenkins.service

젠킨스 재시작(이 명령어 실행전에 데몬 재실행을 하라고 뜬다 해주자 sudo systemctl daemon-reload )
sudo systemctl restart jenkins

확인
sudo systemctl status jenkins

나머지는 너무 길어서 다음 포스트에 설명하겠다

profile
배움의 흔적을 남기고 싶습니다.

0개의 댓글