📚 Study

Jenkins + GitLab Webhook + Springboot + EC2 자동배포

date
Apr 25, 2023
slug
jenkins-springboot-ec2
author
status
Public
category
📚 Study
tags
CI/CD
summary
Jenkins와 Gitlab Webhook을 통해 Springboot project 빌드하여 EC2로 자동배포 A-Z !!!
type
Post
thumbnail
해빗탯_아키텍처_복사본-_1_-001.png
notion image
〰️
Flow
  1. EC2 Docker 설치
  1. EC2 Jenkins container 설치 및 docker 실행
  1. 브라우저에서 Jenkins 기본 세팅
  1. Jenkins Item 생성(feature/be, feature/fe 브랜치 모두)
    1. GitLab Webhook 생성
    2. Jenkins Item ~ GitLab Webhook 연결
  1. 배포파일 생성, Dockerfile 생성, Docker 배포는 다음에…

1. EC2 Docker 설치

1. 커널 버전 확인 : 리눅스 커널이 최소 3.10 버전 이상이어야함

uname -r 명령어를 통해 확인!

2. apt package index 업데이트하고, HTTPS를 통해 repository를 이용하기 위해 package들을 설치

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

3. Official GPG Key 등록(우분투에서 필요한 과정)

gpg란?
GNU Privacy Guard (GnuPG)의 줄임말로서 배포 파일의 인증을 확인하는데 사용되는 자유 소프트웨어 패키지
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. stable repository 등록

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

5. Doker Engine 설치

sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 설치가 완료되었다면 docker --version 으로 확인할 수 있습니다.
굳이 Docker 로 설치하는 이유?
Jenkins는 Java 기반의 CI tool이기 때문에 EC2에 자바까지 설치해야함
EC2 환경에 구애받지 않고 젠킨스와 스프링 서버를 돌리기 위하여 Docker 위에서 돌리는 것이 좋음
 

2. EC2 Jenkins 설치

2-1. EC2 Jenkins container 설치 및 docker 실행

1. Docker 허브로부터 jenkins 이미지 pull

docker pull jenkins/jenkins:lts

2. docker.sock - Permission denied 되면

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.socreate?fromImage=jenkins%2Fjenkins&tag=lts": dial unix /var/run/docker.sock: connect: permission denied
$ sudo groupadd docker $ sudo gpasswd -a $USER docker $ newgrp docker

3. Jenkins container 실행

docker run -d --name jenkins -p 8080:8080 -v /jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
  • v /jenkins:/var/jenkins_home젠킨스 컨테이너의 설정을 호스트 서버와 공유함으로써, 컨테이너가 삭제되는 경우에도 설정을 유지할수 있게 해줍니다.
  • v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock젠킨스 컨테이너에서도 호스트 서버의 도커를 사용하기 위한 바인딩입니다.이렇게 컨테이너 내부에서 설치없이, 외부의 도커를 사용하는 방식을 DooD(Dock out of Docker) 라고 합니다.[1]
  • p 8080:8080젠킨스의 defaul port 인 8080 을 호스트 서버와 매핑해줍니다.
 

2-2. 브라우저에서 Jenkins 설치

1. 호스트서버 URL:8080 으로 젠킨스 브라우저 접속

ex) {server_domain}:8080

2. 설치에 필요한 키값 입력

$ docker logs jenkins
터미널에 위와 같이 입력시 나오는 설치키값 입력

3. suggested plugins 설치, 계정 생성

 

3. Jenkins 세팅

3-1. GitLab 사용을 위한 세팅

1. Gitlab 플러그인 설치

Dashboard > Jenkins 관리 > 플러그인 관리
Git, Gitlab 설치
notion image
notion image

2. Gitlab Access Token 발급

Gitlab > Preferences > Access Tokens
  • Token name : 아무거나 하고 싶은 이름
  • Select scopes : read_repository 허용
notion image

3. Gitlab credential 생성

Dashboard > Jenkins 관리 > Manage Credentials > (global) > Add Credentials
  • Username : Gitlab 로그인 아이디
  • Password : Gitlab 로그인 비밀번호 혹은 위에서 생성한 Gitlab Access Token
notion image
 

3-2. 빌드 후 배포를 위한 세팅

1. 배포를 위한 플러그인 Pulish over SSH 설치

publish over SSH
notion image

2. SSH Server 생성

Dashboard > Jenkins 관리 > 시스템 설정 > Published over SSH
  • SSH Server
    • Name : 확인할 수 있는 이름
    • Hostname : 배포할 host server IPv4 (나의 경우, EC2 IP)
    • Username : ubuntu
  • Key
    • .pem 파일 메모장으로 열면 나오는 Key 입력
Test Configuration 으로 연결 확인
notion image
notion image
 

4. Jenkins Item 생성 및 Gitlab Web hook 연결

4-1. 소스코드 관리

소스코드 관리 - Gitlab 연결

  • Repository URL : Gitlab 레포지토리 링크
  • Credentials : 4-1. 에서 생성한 credential 연결
  • Branches to build : 접근할 브랜치
    • notion image
      notion image

4-2. 빌드 유발

1. 빌드 유발 - Webhook URL 생성, Secret token 생성

  • Build when a change is pushed ~ : webhook URL 기억!
  • 고급 > Secret token Generate
    • 생성 후 Apply 혹은 저장을 눌러야 활성화됨!
notion image
notion image

2. Gitlab Webhooks 생성 및 연결

Gitlab > Setting > Webhooks
  • URL : 위에서 생성한 젠킨스 Webhook URL
  • Secret token : 위에서 생성한 젠킨스 Secret token
notion image

4-3. 빌드

Execute shell 작성

Add build step > Execute shell
해당 레포지토리에서 빌드하는 방법에 대한 shell scrip 작성
notion image

4-4. 빌드 후 조치

1. SSH를 통해 EC2로 빌드파일 보내기

Dashboard > {Item} > Configuration > 빌드 후 조치 > Send build artifacts over SSH
  • SSH Server : 2-2번에서 생성한 SSH server
  • Source files : 전송될 파일의 경로(있는 곳)
  • Remove prefix : 전송할 파일 경로(어디까지 보낼지, 상위폴더까지 보낼 것인지 혹은 해당 파일만 보낼 것인지 등)
  • Remote directory : 전송할 위치(EC2의 S08~/back 하위에 파일을 저장하겠다는 뜻)
  • Exec commend : 그 후 실행할 commend
notion image

2. Dockerfile 사용하여 container 실행

  • Dockerfile도 EC2로 전송
  • 기존 컨테이너 중지 및 삭제 후 컨테이너 이미지 재빌드
  • 도커 컨테이너 실행
notion image
 

참고링크