본문 바로가기

혼자하는 프로젝트/Jenkins 으로 Spring boot 자동 배포하기

Jenkins 을 활용하여 Spring boot 를 자동배포 하기(2)

# 1편에 이어서 계속 하겠다.

- Git에 WebHooks를 등록하고 Intellij에서 커밋과 푸쉬를 하였지만... 아래와 같은 오류만 계속 나온다.

- 구글검색을 해보니... WebHooks는 외부망에서 접근을 하는것이므로 내컴퓨터에 있는 Hyper-V 의 Jenkins 서버를 외부망에서 접근 가능한 상태로 만들어 주어야 했다.
- 그래서 찾은 결과가 바로 ngrok를 설치하여 외부망에서 접근 가능하도록 만들어보자.

ngrok란?
ngrok는 NAT 및 방화벽 뒤에 있는 로컬 서버를 보안 터널을 통해 공용 인터넷에 접속하는 방법을 제공합니다. 

다운로드 URL : https://ngrok.com/download

 

ngrok - download

Install ngrok via Homebrew $ brew install ngrok/ngrok/ngrok Download ZIP file Intel (AMD64) Apple Silicon (ARM64) Then unzip ngrok from the terminal $ Install ngrok via Chocolatey $ choco install ngrok Download ZIP file Windows (64-bit) Windows (32-bit) Do

ngrok.com

- 설치 방법

sudo snap install ngrok

- 실행 방법 (현재 서비스하고 있는 Jenkins의 포트가 9000 이므로 9000으로 실행)

ngrok http 9000

- 실행된 모습

- Webhooks의 세팅 값을 아래와 같이 변경

- 소스 코드를 수정 > 커밋 > 푸쉬 클릭

- Jenkins에서 상태 보기

- WebHooks 로그 보기 > 정상적으로 수행된것을 볼 수 있다.

- 이제는 빌드한 서버를 배포하는 방법에 대해서 알아보자.

- Hyper-V에서 Deployment라는 서버를 생성한다. (생성 후 아래의 명령어로 설치를 수행하자.)

sudo apt update
sudo apt install default-jre
sudo apt install default-jdk

- 젠킨스로 돌아와 Jenkins 관리 > 플러그인 관리 > Publish over SSH를 설치 합니다.

- 설치 후 Jenkins 관리 -> 시스템 설정에서 Publish over SSH 란에 정보를 입력 합니다.
Name은 식별가능하게 임의로 생성한다. Hostname은 Deployment 서버에 접근 가능한 IP 주소나 도메인이어야 한다. Username, Remote Directory는 알맞게 적어넣는다. (AWS 우분투 인스턴스의 기본 사용자 이름은 ubuntu이다.)
그 다음 Key에는 이전에 생성한 SSH 로그인 인증서를 텍스트 편집기로 열어 내용을 통째로 복사 붙여넣기 하면 된다.

2021.11.22 - [리눅스/SSH 접속도구 & SSH] - SSH 접속을 위한 Key pair 생성하기

 

SSH 접속을 위한 Key pair 생성하기

- CI/CD를 위해 Jenkins에서 Deployment서버로의 접근이 필요하다. 이때 바로 Jenkins 애플리케이션에 Deployment 서버의 Key 정보를 등록해줘야 접근이 가능하다. - 그래서 오늘은 Deployment 서버로 접속을 위

may9noy.tistory.com

- 여기서 인증시 오류가 발생을 하였다. (아래와 같은 문제 발생)

jenkins.plugins.publish_over.BapPublisherException: Failed to connect session for config myconfig. Message [Auth fail]

# 해결방법

# 수동으로 Public Key 복사
먼저 기존에 만들어 놓은 Public키를 복사해 놓는다.

deplpyment-server@deplpymentserver-Virtual-Machine:~/.ssh$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDc8o9zWzEVXrL0K8Rrvm/qWX3GUoD2aJa6/XZdPBDkso6NDhB238oa4wI2Gzk6+CxY6fPNkBODOaCxwC1HIiursr2TejGH6kwx/iBuGyfduBWJA/4pAgGvsmOqdd0BQshf2vihzLprEoYkGAcIy/qv9wpQuECrn3S+/8Cd7Vc4zFJpUM0B8DvZTtnKVEme//zGlzwmeXil+Zz+1zoBu4QS1u8CiPCqkV3kDcT/Zxf/G+I4r07dhjp+cSMQW70bt4BwCapHHQpEFE6iP1OM04H+o20/V7ZdNBAM7MzHDBBBf/SSRbUt4cY9+7BmKymZM3I0RrjhmRmY35eV1z2/eopthizTngqvzv7EhBDPz6AmVAvvTPoGM+A6sKhyxfyuszGnrlt68ZO4Yi+IjB38JueB6XtUBAGI7YQzNCxxBRJTClhegpPhmeaddEghhsfyAmtk5FBqwpZzZ52#일부생량

- 이후 접속하고자 하는 서버에 접속한 이후 아래와 같이 입력한다.

여기서는 .ssh 디렉토리가 없다고 가정한다. 참고로 ssh-keygen을 이용해서 이미 key값을 생성한 경우 ~/.ssh 폴더 및 id_rsa, id_rsa.pub 파일이 있을 것이다. 또한 authorized_keys 파일도 이미 사용되고 있을 경우 수 있기 때문에 아래의 예시를 참고하자.

### 먼저 접속할 서버에 SSH로 접속 
ssh deplpyment-server@192.168.137.39
### 홈디렉토리 밑에 .ssh 폴더 생성 
mkdir ~/.ssh
### .ssh 디렉토리의 퍼미션을 700으로 셋팅
/home/secuof$ chmod 700 .ssh 
/home/secuof$ cd .ssh 
### authorized_keys 파일을 생성 (이미 존재할 경우 패스)
/home/secuof$ touch authorized_keys
### authorized_keys 파일의 퍼미션을 600으로 셋팅
/home/
chmod 600 authorized_keys 
### authorized_keys 파일을 편집해서 Public Key를 입력 
### 또는 `echo [public_key_string] >> ~/.ssh/authorized_keys` 와 같이 입력도 가능함.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC9UoEhuJShwl0DukIeziOYLOJe/10grhbff4UVCojH1zjtY8tPlyw0a9/ZTh7a20k+W+iaXfWIx5w5sGo40ecwXDp4cVj2xJhm9dtnRBJuaUx03O/EUA4mNSBMLEH0k+xAiIjNxb1ql2X0SBFIM6VDTjfKkATJxAfIqJ1saompeWldSrWDjaXq0bg7VBKEXK7Jvkqg3U5pp4o5jFEukwBTqY8xxtzbgkqJJ7Z8RAhTyzePcEy/r9N0/2os6JhlnAdX+A7c3taIuD6ysZP9SMgxBsjSP5PmYi7VntHArIMyH+hCi+LF88PUuXNAAEY2HQ0orOcIMhWAksGEG9Gr5Xg9CsWl4cGwSLtXVa6VK151ITCdgTUgN/vCcuYHDJ9q1dKdFQJke2ScbghvP9MhDWwfEM8KBz5wDk2dQCP7pC/BLHB5NApwl8l5Hz5CU1xgQ2FHYS3U46RIu/cbgo0Yd4k=:wq

- 다시 이전에 생성한 Project-01 로 돌아가 구성 > 빌드 환경에서 Send files or execute commands over SSH after the build runs 체크후 아래의 내용을 입력한다.

Name에서 아까 만든 SSH 프로필을 찾아 선택하고, Transfers에 내용을 알맞게 채워 넣는다.
위 이미지에서는 build/libs에서 아무 이름의 war 파일을 찾고, 원격 디렉토리의 루트에 이를 전송 후 원격에 있는 newBuild.sh 스크립트 파일을 실행한다. (원격 디렉토리 root는 ex) /home/deplpyment-server 가 된다.) 고로 newBuild.sh 의 위치도 /home/deplpyment-server 에 있어야 한다.)

- 아파치 Tomcat 설치

2021.11.25 - [Applications/Apache & Tomcat] - 우분투에 Tomcat 설치

 

우분투에 Tomcat 설치

# 우분투 서버에 Tomcat을 설치해보자. - http://tomcat.apache.org/ Apache Tomcat® - Welcome! The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages..

may9noy.tistory.com

- Tomcat 폴더의 소유권 변경

2021.11.25 - [리눅스/명령어 모음] - chown과 chmod를 하위 폴더와 하위 파일들에 적용하기

 

chown과 chmod를 하위 폴더와 하위 파일들에 적용하기

# chown과 chmod를 사용하여 하위폴더와 파일들에 적용하기 - 환경 Ubuntu chown와 chmod를 하위 파일과 폴더들에 한번에 적용하기 둘다 공통적으로 -R 옵션을 적용해주면 됩니다. chmod의 경우 $ chmod -R

may9noy.tistory.com

이제 두 번째 서버의 홈 디렉토리에 전송받은 war 파일로 서버를 띄우는 newBuild.sh를 만들 차례다. 정답은 없으므로 자신의 환경에 알맞게 세팅을 하면 된다. (newBuild.sh 의 위치는 /home/deplpyment-server/ 에 있어야 한다.)
- 참고로 war 파일은 항상 아파치톰캣의 설치된 폴더안에 webapps/ 안에 있어야 한다. 톰캣은 webapps 안에 있는 war파일을 자동으로 인지하고 배포한다. (접속 주소는 자신의 웹서버의 우분투 IP:8080이 되겠다.)

#!/bin/bash

PID=`ps -e | grep java | awk '{print $1}'`

if [ $PID ]
     then
     kill -9 $PID
fi

mv /home/deplpyment-server/build/libs/application.war /apache-tomcat-9.0.55/webapps/ > log.txt

- 위에 쉘 내용은 아주 간단하다.
1. java가 들어간 프로세스가 있다면 찾아서 강제로 kill을 수행한다.
2. 그 후 mv 명령어를 통해 배포된 application.war파일을 tomcat 폴더로 이동시킨다.
3. 세팅 환경에 따라 모두 다른값이 나오므로, 자신의 환경에 맞게 수정을 해주면 된다.
나는 tomcat을 WAS로 썼으므로 위와같이 세팅을 하였다.

- 이제 모든 세팅이 끝났다. 최종적으로 IntelliJ에서 코드를 수정하고 Commit & Push를 수행, Jenkins과 git webhooks를 통해 war파일을 배포하고 아파치 톰캣 웹서버와 WAS를 띄우는 작업을 해보자.

- 빌드 과정을 동영상으로 올려봅니다.

- 이제 IntelliJ에서 코딩만하고, Commit & Push만 하면 자동으로 웹으로 반영되는 모습을 볼 수 있습니다.
(하... 시행착오가 많았지만 그래도 잘 마무리되어 다행임... ps... 근데 진짜 편함... 신세계네요...)

- 끝 -