본문 바로가기
Dev/[넘블] 2023 백엔드 챌린지

[Numble] Spring으로 타임딜 서버 구축 - 트러블 슈팅과 회고 2 (CI/CD)

by javapp 자바앱 2023. 4. 17.
728x90

 

 

8. 네이버 클라우드에서 CI/CD 구축


무중단 배포 과정

  1. 푸시를 하면 젠킨스 서버에서 젠킨스가 webhook으로 인식
  2. 해당 깃허브 레포지토리를 pull 한뒤 gradle로 빌드하여 .jar 파일 완성
  3. 도커는 기존 컨테이너 종료시키고, 컨테이너와 이미지 삭제
  4. jenkins 에서 Dockerfile 빌드하여 Docker hub로 push
  5. 배포서버에서 Docker hub에 있는 jar 파일을 이미지로 가져오고 실행 (pull & run)

 

8.1. 젠킨스 구축용 서버에서 젠킨스, 도커 설치

[Jenkins] CentOS에 Jenkins 설치하기 (tistory.com)

 

설치 목차

1.  jdk11 설치 및 환경변수 설정

2. 빌드 도구 설치 (Gradle)

3. 젠킨스 설치

4. 도커 설치

 

젠킨스 이용하여 도커 허브에 jar 전송, Docker pull & run

 

 

8.2. CI 과정에서 트러블 슈팅

 

CI 아키텍처

 

8.2.1. 배포서버 PublicKey 등록

 

젠킨스 구축 서버에서 RSA 로 생성한 키페어 중 퍼블릭 키를 배포서버(Spring 서버)인 인스턴스의 .ssh/authorized_keys 파일에 추가

 

Error

생성 실패

// 구축서버
$ sudo cat /var/lib/jenkins/.ssh/[키명칭].pub

// 배포서버
$ vi .ssh/authorized_keys

배포 서버에 추가가 안됨

 

원인

원인은 비교적 간단했는데 

- SSH Key는 보통 ~/.ssh 경로에 존재하는데 이전에 해당 디렉토리를 생성한 적이 없어서

새로 생성해야합니다.

 

해결

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd ~/.ssh

 

 

8.2.2. Publish over SSH 가 연동이 안됨

jenkins server 연동 (오류 해결) (tistory.com)

해결

네이버의 경우 포트 포워딩(22 → 8000) 했기때문에 반영해줍니다.

[Jenkins] publish over SSH를 이용한 Docker 서비스 배포(2) (tistory.com)

 

 

8.2.3. 젠킨스에서 Build시 도커 허브 등록 실패 & 해결 과정

Error

./gradlew: Permission denied

 

해결

서버에 git 설치

젠킨스 Build Steps에 chmod +x gradlew 추가 (이후 한번 더 언급)

 

 

4시간 이상 삽질하게 만든 에러 등장

Error

푸시가 거부되고 있었다.

 

원인

큰 이유는 크게 2가지

  1. Docker Hub 로그인을 하지 않음
  2. Docker Hub 아이디와 태그된 이미지의 이름이 일치하지 않음

docker tag 명령어로 태그명을 조정해보았지만 이게 문제가 아니였네여.

 

해결

분명 root 로 docker login 을 하였는데 이게 먹히질 않음

jenkins에서는 jenkins 유저로 배포를 시키는 것 같았음

 

그래서 Jenkins 와 Docker 설정을 해야됨

우선 Docker 그룹에 젠킨스를 추가

// 추가
$ sudo usermod -aG docker jenkins
$ su - jenkins

Error

해당 과정에서 사용자를 변경하는 su - jenkins 가 먹히질 않음

 

스택오버플로우  를 통해 해결할 수 있었는데

cat /etc/passwd | grep jenkins
jenkins:x:995:993:Jenkins Automation Server:/var/lib/jenkins:/bin/false

Jenkins Automation Server 로 젠킨스는 서버 계정으로 

login을 원한다면  sudo su -s /bin/bash jenkins 을 사용

성공

 

 

8.2.4. docker.sock 권한 변경

$ sudo chmod 666 /var/run/docker.sock

 

Error

권한 변경 실패

root 권한이 없어서 설정이 안됨

 

 

해결

해당 username(jenkins)에 root 권한을 부여

 vi /etc/sudoers

 

E45 : readonly option is set (add to override)

 

해결

Read Only 파일인 경우 강제로 저장

:w!

 

 

8.2.5. jenkins 유저로 Docker login

Error

푸시는 성공하는데 또 다른 에러 발생,,

푸시까지는 됨.

 

 

Docker hub 에서 pull & run

docker pull llsrrll96/timedeal:timedeal-0.0.1-SNAPSHOT
docker run -d --name timedeal -p 8011:8080 llsrrll96/timedeal:timedeal-0.0.1-SNAPSHOT

 

Error

java.sql.SQLException: Access denied for user 'timedeal_admin'@'49...' (using password: YES)

Spring boot와 Cloud MySQL 연동에러

 

해결

서버의 비공인 IP 추가 

  ACG 설정을 하지 않았기 때문에 추가

 

 

 

DB 사용자에 대한 접근 가능한 ip 추가 !

 

 

결과

네이버클라우드에 배포된 서버와 클라우드 RDS와 연동성공!

 

 

 

8.2.6. 젠킨스 빌드 SSH Server 배포 

 

Dashboard > jenkins 관리 > Configure System

 

 

8.2.7. 젠킨스 Publish over SSH 플러그인 사용

 

rsa 알고리즘으로 PEM 타입 SSH 키 생성

비대칭키이기 때문에 private, public 키 가 생성됨

ssh-keygen -t rsa -C "jenkins_d_key" -m PEM -P "" -f /var/lib/jenkins/.ssh/jenkins_d_key

 

 

*배포서버 .ssh 디렉토리가 없을 경우 mkdir으로 생성

// 구축서버
$ sudo cat /var/lib/jenkins/.ssh/jenkins_d_key.pub

// 배포서버
$ vi .ssh/authorized_keys

 

 

비밀 키 등록

Path to key or Key 중 하나만 작성해도 됨

 

 

 

여기서 중요한 게 있는데

네이버클라우드 서버의 경우 포트 포워딩을 사용했을 때

접속용 공인 IP를 Hostname에 

Port 를 22 --> 8000 (적용된 포트번호)로 등록

 

 


8.2.8. Dashboard > {프로젝트} > 구성

 

깃 등록

 

빌드 스텝

 

jar 파일 생성

 

 

 

Spring boot 프로젝트 층에서 Dockerfile을 작성

FROM adoptopenjdk/openjdk11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]

이미지 생성과 Docker hub에 푸시

 

 

푸시 이후

jar파일을 도커 허브에 보낸 이후 SSH 서버 액션

Exec command 에만 작성

 

 

 Publish over SSH에 테스트 연결 성공하면 

SSH Server Name에 자동으로 선택되어지는 것 같다.

 

jar파일을 도커 허브에 보낸 이후 액션

Exec command 에만 작성

 

- Docker hub 에서 이미지로 pull 

- 기존 도커에 실행되고 있는 해당 컨테이너가 있다면 rm

- 실행

 

 

젠킨스 빌드 결과

이틀만에 CI 완료 !!

 

27 트!!

 

 

 

8.3. CD 과정

웹훅

 

 

웹훅에 연결이 안되는 경우

 

ACG 규칙 설정해서 접근 소스를 열자!

 

최신 MASTER 푸시 커밋 내용이 나오고 무중단 배포한 기록이 남겨진다 !!

 

 

 

 

댓글