Server/CI&CD

[CI/CD] GitLab + Jenkins를 활용한 SpringBoot CI/CD 구축 (1)

aeeazip 2023. 8. 18. 03:03

목차


0. 포스팅 계기

1. CI/CD 개념

2. OverView : GitLab + Jenkins + Nginx + AWS EC2  

3. EC2에 Jenkins 설치 후 초기 설정

4. GitLab - Jenkins 설정

5. Jenkins - EC2 연결

6. 방화벽 설정

7. Nginx로 reverse_proxy 설정

8. 빌드 스크립트 (deploy.sh) 작성

 

 

 

 

0. 포스팅 계기


 

한이음 중간보고서 제출 전 구글링하다 얻어걸린 블로그에서 GitLab + Jenkins + Docker + EC2를 활용한 CI/CD를 구축했길래 우리도 비슷하게 하면 되겠거니 생각해서 보고서엔 멋드러지게 위의 기술들을 활용하겠다고 작성했다.

 

막상 본격적인 개발 시작 전에 다시 블로그를 읽어보니 1편만 작성하셔서... 어 답지 보다가 답지 뺏긴 느낌이였다. 울며 겨자먹기로 일주일 동안 엉망진창 헤매가며 겨우 구축하긴 했지만 기록해두지 않으면 다시 잊어버릴 것 같아 포스팅을 결심하게 되었다. 

 

이젠 저 저 Jenkins 아재 사진만 봐도 쫌 킹받지만

이 글을 읽는 사람들은 나보다 저 아재를 덜 미워하길 바라면서 포스팅 시작 ★

 

 

 

1. CI/CD 개념


 CI 

  • 빌드/테스트 자동화 과정
  • CI는 개발자를 위한 자동화 프로세스인 지속적인 통합 의미
  • 커밋할때마다 빌드와 일련의 자동화 테스트가 이루어짐
     동작을 확인하고 변경으로 인해 문제가 생기는 부분이 없도록 보장
  • ex) main 브랜치로 commit or pull request가 발생할 때마다 항상 검증

 

 

 CD 

  • 지속적인 서비스 제공/배포 의미
  • 코드 변경이 main에 커밋되면, 자동화된 빌드 및 테스트 프로세스를 거쳐 문제가 발견되지 않으면 최종적으로 배포
  • ex) main 브랜치에 커밋 후 CI를 통과 > gradle.yml workflow에 따라 Docker Image를 생성 > Docker Image를 EC2에 자동 배포

 

 

 

2. OverView


시스템 아키텍쳐 사진은 다음과 같다. 

 

 

 

3. EC2에 Jenkins 설치 후 초기 설정


나는 EC2에 직접 Jenkins를 설치하는 방법을 선택했다. 

 

Docker를 사용했다면 Jenkins 환경을 격리해서 관리하기 용이했을 것 같긴 하지만, 아직 Docker 사용하는게 익숙하지 않기도 하고 EC2에서 직접 Jenkins를 설치했을 때 더 직관적으로 이해하고 제어하기 편할 것 같아서 후자의 방법을 선택했다. 

 

 

a. 패키지 관리자 업데이트 + JDK 설치

 

Jenkins를 설치하기 전 가장 먼저 패키지 관리자를 업데이트 해주었고, JDK를 먼저 설치해주었다.

나는 프로젝트에서 Java 11 버전을 사용했기 때문에 이에 맞는 JDK를 설치해주었고, 본인 프로젝트에 맞는 JDK를 찾아서 설치해주면 된다. 

 

# 패키지 관리자 업데이트
$ sudo apt-get update
$ sudo apt-get upgrade

# JDK 설치
$ sudo apt-get install openjdk-11-jdk
$ java -version

 

b. Jenkins 설치

 

  • Jenkins는 CI/CD를 제공하는 툴
  • 파이프라인 스크립트에 따라 자동으로 빌드와 배포를 진행
  • 연도마다 새로운 레포지토리 서명 키를 사용하므로 설치 중 에러가 발생하면 공식 문서를 보기!
  • 23.07.30 기준 아래 링크 참고

https://myminju.tistory.com/115

 

Ubuntu에 Jenkins 설치하기 (23.3.28 서명키 업데이트)

설치 환경 NHN Cloud Ubuntu 20.04 LTS Jenkins 2.397 ⚠️ 주의 ! 2023년 3월 28일부터 Linux 설치 패키지에 대한 새로운 레포지토리 서명 키를 사용합니다. Jenkins 2.397 설치하기 전에 새 서명 키로 설치해야 합

myminju.tistory.com

 

# 시스템에 젠킨스 레포지토리 추가
$ 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

# apt 업데이트
$ sudo apt-get update

# 젠킨스 설치
$ sudo apt-get install jenkins

 

c. Jenkins 데몬 실행 + 방화벽 확인

 

  • ⚠️ 접속이 안된다면 EC2 인스턴스 인바운드 규칙에 8080 포트를 열어줬는지 확인
# jenkins status 확인
$ sudo systemctl status jenkins

# jenkins 시작
$ sudo systemctl start jenkins

# 8080 포트 열려있는지 확인
sudo ufw status

# Status: inactive 라면
sudo ufw allow 8080
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

 

 

실제 결과 화면

 

 

d. Jenkins 접속

 

http://[도메인]:8080/ 접속해서 Jenkins 설정을 이어가야 한다. 

처음 위의 url로 접속하면 다음과 같은 화면이 보일 것이다. 

 

 

http://[도메인]:8080 접속 후 보이는 초기 화면

 

 

초기 비밀번호를 입력하라는 메시지가 나오는데 아래 명령어로 얻은 값을 넣어주면 된다!

# 초기 비밀번호 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

Continue를 선택하면 Customize Jenkins 메뉴가 나온다. 여기서 Install suggested plugins를 선택하면 된다. 

 

 

 

 

이제 Admin 계정을 생성하는 단계이다. 계정명과 암호, 이름, 이메일 주소 등을 입력하면 된다. 이 값들은 앞으로 계속 사용해야하므로 꼭 기억하고 있어야 한다. 

 

 

 

 

값을 모두 입력 후 Save and Continue를 선택하면 Jenkins 접속 URL을 설정해주어야 한다. 도메인을 구매했거나 8080 외에 다른 포트번호를 사용하고 싶다면 이때 설정해주면 된다! 나는 이전과 동일한 주소를 사용했다. 

 

 

 

 

Save 하면 초기 설정은 완료되었다고 할 수 있다 .

마지막으로 Dashboard > Jenkins 관리 > Plugins > Available plugins를 선택하여 추가 플러그인을 설치해주어야 한다. 

필요한 플러그인만 선택해서 설치해주면 되고, 나는 다음과 같은 플러그인들을 설치해주었다. 

 

 

설치 플러그인
  • Generic Webhook Trigger
  • Gitlab
  • Gitlab API
  • Gitlab Authentication
  • Mattermost Notification
  • SSH