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 환경 구축하기
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. 배포 완료
마음의 평화가 찾아오는 초록 아이콘이 표시되고 배포가 완료되었음을 확인할 수 있다
서버에 접속하여 정상 작동을 확인!
'개발 지식 > DevOps' 카테고리의 다른 글
DB I/O bound 애플리케이션 + Message Queue (0) | 2023.04.02 |
---|---|
Nginx를 통한 로드밸런싱 + 무중단 배포 (1) | 2023.03.16 |
간단한 Docker 환경 구축하기 (0) | 2023.03.11 |
CPU bound Test (0) | 2023.03.08 |
서버 메모리 누수 현상 처리 과정 정리 (0) | 2022.02.24 |