8. 네이버 클라우드에서 CI/CD 구축
무중단 배포 과정
- 푸시를 하면 젠킨스 서버에서 젠킨스가 webhook으로 인식
- 해당 깃허브 레포지토리를 pull 한뒤 gradle로 빌드하여 .jar 파일 완성
- 도커는 기존 컨테이너 종료시키고, 컨테이너와 이미지 삭제
- jenkins 에서 Dockerfile 빌드하여 Docker hub로 push
- 배포서버에서 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가지
- Docker Hub 로그인을 하지 않음
- 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 완료 !!
8.3. CD 과정
웹훅
웹훅에 연결이 안되는 경우
ACG 규칙 설정해서 접근 소스를 열자!
최신 MASTER 푸시 커밋 내용이 나오고 무중단 배포한 기록이 남겨진다 !!
'Dev > [넘블] 2023 백엔드 챌린지' 카테고리의 다른 글
[Numble] 연계_내가 만드는 나만의 유형테스트 회고 (0) | 2023.07.17 |
---|---|
[Numble] Spring으로 타임딜 서버 구축 - 트러블 슈팅과 회고 4 (핀포인트, nGrinder) (0) | 2023.04.17 |
[Numble] Spring으로 타임딜 서버 구축 - 트러블 슈팅과 회고 3 (동시성 처리) (0) | 2023.04.17 |
[Numble] Spring으로 타임딜 서버 구축 - 트러블 슈팅과 회고 1 (DB, 아키텍처, 테스트) (0) | 2023.04.17 |
[Numble] Spring으로 타임딜 서버 구축 - 클린코드를 포함한 리팩토링 (TOP3 선정!) (0) | 2023.04.09 |
댓글