728x90

0. 목표 및 테스트 환경

  • Jenkins 세팅
  • SSH를 통한 배포
  • dockerized 애플리케이션 배포 자동화

GCP 클라우드 서버를 통해 진행!

CentOS로 진행

- Jenkins를 실행시킬 jenkins-test-1

- Docker 컨테이너를 띄울 worker-test-1

2개의 서버를 생성하였음


1. 관련 파일 설치

- wget, maven(Java 포함), git, docker 설치

sudo yum install wget
sudo yum install maven
sudo yum install git
sudo yum install docker

2. Jenkins 설치

Jenkins 설치 시 패키지를 먼저 추가해 준 다음 설치를 진행해야 한다

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins

3. Jenkins 데몬 실행

실행 후 상태 확인!

sudo systemctl start jenkins
sudo systemctl status jenkins

 

Jenkins 실행 시 다음과 같은 에러가 발생할 경우
Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.

1. 인스턴스의 메모리 부족
 - 인스턴스 메모리 부족인 경우 e2-micro -> ec-medium 변경

2. Java 버전 차이 (Maven 설치시 기본 Java 8 설치가 되는데, Jenkins 권장은 JDK 11, 17)
 - Java 버전 차이인 경우 아래 명령어로 Java 버전 변경

# Java 11 설치
sudo yum install java-11-openjdk-devel
sudo yum install java-11-openjdk

# Default Java 버전 설정
sudo alternatives --config java

4. Jenkins 최초 설정

8080 포트로 접속하면 임시 비밀번호를 입력하라는 화면이 조회된다

해당 경로를 cat 명령어를 통해 확인하면 패스워드를 알 수 있다

 

패스워드를 입력하여 접속하면 추천 플러그인을 설치할 것인지, 사용자가 직접 선택하여 플러그인을 설치할 것인지 선택하는 화면이 조회된다.

추천 플러그인 옵션으로 설치했음

 

플러그인 설치 후 아이디, 패스워드, URL 등 설정 후 시작화면으로 이동한다


5. SSH 플러그인 설치

Jenkins 관리 > 플러그인 관리

메뉴로 이동하여 Publish Over SSH 설치 (재시작 없이 설치)


6. 개인/공개 키 생성

컨테이너가 띄워져 있는 worker-test-1 서버를 아무나 조작할 수 있다면 안될 일이다

보안을 위해 Jenkins 서버에서만 ssh를 통해 worker 서버에 접근이 가능하도록 설정해야 한다

 

Jenkins 서버에서 공개키와 개인키를 생성하고

woker 서버에 해당 공개키를 등록하여 Jenkins 서버에서만 접근이 가능하도록 환경을 구성해 보자

 

공개키와 개인키를 생성하는 명령어를 입력한 뒤 패스워드는 입력하지 않고 엔터를 친다

ssh-keygen -t rsa -f ~/.ssh/id_rsa

완료 메시지와 함께 키 파일이 저장된 경로를 확인할 수 있다


7. 공개키 등록

id_rsa.pub 공개키 파일을 vi 편집기로 열어서 해당 내용을 복사하여 worker 서버에 등록해 준다

 

~/.ssh/authorized_keys 파일에 공개키를 등록하면 된다

vi ~/.ssh/authorized_keys

 

공개키 저장이 완료되었다면 ~/.ssh 폴더의 권한을 700으로 변경하고

chmod 700 ~/.ssh

 

authorized_keys 파일은 600으로 변경한다

chmod 600 ~/.ssh/authorized_keys

8. Jenkins Publish over SSH 설정

Jenkins 관리 > 시스템 설정

메뉴로 이동하여 가장 하단으로 스크롤을 내리면 처음 설치했던 Publish over SSH 입력 정보가 나온다

Key 입력란에 생성했던 개인키를 붙여 넣고,

SSH Servers 추가 버튼을 클릭하여 worker 서버 정보를 입력한다

Hostname을 입력할 때 같은 네트워크상에 있다면 내부 IP 주소를 입력

입력이 완료되면 [Test Configuration] 버튼을 클릭하여 Success 메시지가 조회되는지 확인!


9. 배포 스크립트 등록

Jenkins에서는 배포 스크립트를  Item 단위로 관리한다

메인에서 [새로운 Item] 메뉴를 클릭하여 등록 화면으로 이동

 

이름을 작성하고 Freestyle project를 선택하여 [OK] 버튼 클릭

 

가장 하단으로 스크롤을 이동하여

빌드 후 조치 추가 > Send build artifacts over SSH를 선택

Send build artifacts over SSH 입력 화면에서 미리 등록해 둔 worker-test-1 서버를 선택

- [고급] 버튼을 클릭하고 로그 확인을 위한 Verbose output in console 체크

- Exec command 입력란에 배포 스크립트를 작성

스크립트 배포를 실행하기 전

worker 서버의 Docker 설치 및 Docker Hub에 이미지 업로드 작업은 이전 블로그 글 참고!

2023.03.11 - [DevOps] - 간단한 Docker 환경 구축하기

 

간단한 Docker 환경 구축하기

0. Docker 환경의 애플리케이션 실행 과정 Docker File 빌드 시 Docker Image가 생성됨. Docker Image를 저장소에 푸쉬하면 Docker Image가 저장소에 업로드 됨. 풀을 통해 Docker Image 다운로드 다운로드된 Docker Imag

tong-dev.tistory.com


10. 프로젝트 빌드

좌측 메뉴에 [Build Now] 버튼을 클릭. 한글로는 [지금 빌드] 버튼으로 보일 수 있음

 

10.1. 1차 에러

빌드가 완료되면 좌측메뉴 하단에 빌드된 기록이 조회된다

정상적으로 동작하지 않은 듯 아이콘이 표시가 나오는데 Console Output을 클릭하여 로그를 확인

로그를 확인해 보니 sudo 명령어가 문제였다

sudo를 제외하고 다시 실행!

 

10.2. 2차 에러

권한 문제로 실행이 되지 않음. 666 권한 부여

sudo chmod 666 /var/run/docker.sock

 

10.3. 3차 에러

로그가 계속 출력되면서 Jenkins에서 배포가 끝나지 않았다고 인식하여 문제가 되는 상황

배포 스크립트에 해당 명령어를 추가해 준다

nohup docker run -p 8080:8080 tyakamyz/spring-boot-cpu-bound > /dev/null 2>&1 &

 

nohup ~~~ &: 백그라운드로 명령 실행

/dev/null 2>&1: 표준 에러를 표준 출력으로 리다이렉션

 

10.4. 배포 완료

마음의 평화가 찾아오는 초록 아이콘이 표시되고 배포가 완료되었음을 확인할 수 있다

 

서버에 접속하여 정상 작동을 확인!

728x90
복사했습니다!