본문 바로가기
AWS

jenkins & tomcat 빌드 & 배포 자동화 세팅

by wwns 2022. 8. 3.
반응형

이전 포스팅: https://dpwns523.tistory.com/5

 

SpringBoot API 개발팀을 위한 aws 세팅

AWS에서 EC2를 생성해, 개발팀이 공동으로 작업할 수 있는 서버를 만드는 과정 SpringBoot, Nginx, Tomcat, Mysql AWS : EC2, Route53(Domain), Certificate Manager, SSL, ELB(ALB) EC2를 먼저 생성한다. AWS에..

dpwns523.tistory.com

이전 포스팅에서 개발용 stage 서버를 만들었고, .war를 빌드하여 tomcat에 올리는 것까지 확인을 했다.

API 개발 협업을 진행하다보면 GitHub에 branch를 생성하고, 각자 로컬에서 개발을 진행하고, 테스트를 보고 pr을 보내 코드 리뷰 후 mr이 이루어진다. API는 프론트엔드, Android 등에서 요청을 보내면서 서로 맞춰나가야 하기(API 스펙 등) 때문에 pr이 merged 되면 곧바로 서버에 배포를 해주어야 한다. 그런데 이전 포스팅에서의 방법은 직접 .war를 생성하고, 서버의 apache-tomcat이 있는 디렉터리로 이동을 해줘야 하며 반복적인 작업을 진행해야 한다.

이러한 빌드 및 배포 과정을 자동화할 수 있는 젠킨스 설정에 대해 알아보도록 하겠다. 우선 빌드용 서버를 하나 더 만들고 젠킨스를 설정하도록 한다. EC2 설정은 이전 포스팅을 참고해서 만들면 될 것 같다.

 

두 개의 서버를 왔다갔다 하기 때문에 헷갈릴 수 있습니다.
젠킨스(빌드) 서버는 Build 서버, 개발 서버는 Stage 서버라고 하겠습니다!

AWS에서 Build 서버를 생성했다면 여기에 젠킨스를 설치해야 한다.

 

젠킨스 키 파일 추가

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  • 우분투 22.04 LTS를 쓰시면 Warning이 하나 나오는데 해결해보려고 했으나 그냥 진행해도 잘 설치가 됩니다. Warning이니 무시하고 진행하세요..
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

자바, 젠킨스 설치

sudo apt-get update
sudo apt-get install openjdk-11-jdk
sudo apt-get install jenkins

설치가 완료되면 자바 및 젠킨스 버전 확인

java -version
sudo systemctl status jenkins.service jenkins  # active

Build 서버의 IP 주소로 8080포트로 접속해주면 젠킨스 로그인이 나옵니다!

젠킨스 초기 로그인 화면

초기 비밀번호는 화면에 나온것 처럼 찾아서 복사해줍니다.

sudo su jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword

젠킨스 초기 설정 및 로그인

설치 가능한 플러그인들이 설치되고, 계속 진행하면 사용자 정보를 입력한 후 로그인할 수 있다.

Jenkins 관리로 들어와 의존성에 관련해서 길게 나와있는데 Correct를 클릭하면 Plugin Manager로 이동할 수 있다.

Publish Over SSH와 Deploy to container를 다운로드하고 재시작한다.

플러그인 설치 후 의존성 등 문제가 사라짐

Publish Over SSH와 Deploy to container 플러그인을 설치하자 의존성이 있는 플러그인도 같이 설치가 된 것 같다?

Publish Over SSH는 톰캣서버에 SSH로 연결하기 위함이고 Deploy to container 플러그인은 .war를 전송하기 위함이다.

 


이제 Build 서버와 Stage 서버 사이 SSH 연결을 위한 키 교환을 할 것이다.

여기서는 .pem 키 페어 파일을 두고 하는 것이 아니라 공개키, 비밀키를 이용해 ssh 접근을 할 것이다.

키를 생성하면 기본키와 비밀키가 키 페어로 만들어지고 사용된다.

SSH 연결 방식

여기서는 Build가 SSH 클라이언트가 되고 Stage가 SSH 서버이다.

  • Build 서버에서 Stage 서버로 ssh 접속 요청을 하면 stage 서버 공개키를 전송해서 이전에 접속한 적이 있는지 체크를 한다.
  • 처음 접속하게되면 커멘드 창에 yes/no를 입력하라는 창을 볼 수 있을 것이다. (known_hosts에 등록할 것인지 물음)
  • Build 서버는 Stage 서버에서 받은 공개키로 메시지를 암호화해서 전송하고, Stage서버는 비밀키로 복호화하여 원본 메시지를 전송한다.
  • 둘이 매칭이 되면 Build 서버의 공개키를 전송하고 Stage 서버에 Build 서버 공개키가 있는지 확인 후, 암호화, 복호화 과정을 통해 매칭이 되는지 검증해 ssh 연결을 한다.

따라서 Stage 서버에 Build 서버 공개키가 있어야 함!


Stage서버의 톰캣 설정

 

tomcat이라는 사용자 추가

sudo adduser tomcat

password 등 설정 모두 enter로 넘어감

sudo chown -R tomcat:tomcat apache-tomcat-9.0.65
cd apache-tomcat-9.0.65
sudo chmod -R 777 bin

Stage 서버 유저 변경 및  rsa 키 생성

sudo su tomcat
ssh-keygen -t rsa -b 4096 -m pem

Build 서버 유저 변경 및 rsa 키 생성

sudo su jenkins
ssh-keygen -t rsa -b 4096 -m pem # 추가적으로 나오는 설정은 모두 enter
cat .ssh/id_rsa.pub  # Build 서버의 공개키 복사하기

Stage 서버 tomcat 유저로 접속 -> Build서버 공개키 authorized_keys등록

sudo su tomcat
vi .ssh/authorized_keys # Build 서버 공개키 붙여 넣기

이제 키 교환이 됐을 것입니다. 테스트로 ssh tomcat@Stage서버ip(x.x.x.x) -p 22222로 접속이 되는지 체크해보세요.

만약 안된다면 키를 제대로 복사 안 했거나 제대로 생성되지 않은 것입니다~

그리고 SSH 연결 방식의 그림처럼 진행되는 것을 머릿속으로 그려보면 됩니다.


이제 ssh로 Build서버에서 Stage서버에 접속이 되면 젠킨스에서 Job을 생성하여 스프링 부트 +JPA 프로젝트를 빌드하고 .war를 전송하기 위한 준비는 다 되었다.

다시 젠킨스로 돌아와 Jenkins 설정 -> 시스템 설정으로 이동한다. 이동하면 여러 시스템 설정들을 볼 수 있는데

이전에 설치했던 Publish over SSH를 설정하는 부분까지 이동한다.

jenkins 비밀키 path 입력
ssh 연결 설정

위 사진처럼 설정을 한다. 여기서 SSH Server의 경우 고급... 을 누르면 port를 지정할 수 있는데 22222로 바꿔줬다.

 

다시 Jenkins 설정에 가보면 Manage Credentials가 있는데 Github 레포에서 코드를 가져와 build 할 것이기 때문에 Access Token을 발급받아 Credential을 등록해야 한다.

좌측 상단에 보면 > 표시가 되어있는데 그걸 눌러서 이동하면 Add Credential이 나타날 것이다.

  • Kind는 Username with password
  • Scope는 Global
  • Username은 Github 아이디
  • Password는 Github에서 발급받은 토큰
  • ID는 Credential 이름 인듯하다.

차례대로 입력하고, GitHub에서 토큰을 발급받기 위해서는

access token 발급 과정

위와 같이 이동하여 scope를 설정해(access 범위) 토큰을 생성하고 잘 복사하여 젠킨스 Credential Password에 넣어주면 된다!


다시 Jenkins 설정으로 이동하여 Global Tool Configuration으로 이동한다.

여기에서 이번 프로젝트에서 사용하는 Gradle 버전을 잡아준다. Gradle의 버전은 프로젝트에서 gradle 폴더로 가면 properties파일에서 볼 수 있다. 뿐만 아니라 Maven, JDK 등의 설정도 해놓을 수 있다.


이제 Job을 생성한다. 젠킨스 화면에서 새로운 Item을 클릭한다.

Job의 이름을 설정하고 Freestyle project를 선택한다.

이제 빌드 설정을 하면 된다. 꼭 똑같이 할 필요는 없고 필요한 설정이 있다면 추가하여 커스텀해보는 것이 좋다.

오래된 빌드 삭제 설정
Git 연결

프로젝트는 Git에서 가져올 것이기 때문에 연결을 해줘야 하는데 Credential을 추가해줘야 깃헙 레포에 접근이 가능하다.

이전에 만들었던 Credential을 넣어주었다.

빌드 유발을 선택하면 트리거가 작동했을 때 빌드를 자동으로 해주는 것이다. 나는 일단 pass.. 나중에 설정하겠다.

빌드 환경 설정

빌드를 하고 SSH 연결을 통해 .war를 Stage 서버로 보낼 것이기 때문에 Send files ~ after the build를 선택했다.

SSH 서버는 이전에 만들었던 것을 선택했다.

  • Source files는 .war가 생성되는 위치이다. Gradle로 생성을 하게 되면 build/libs/에 생기게 된다.
  • Prefix를 제거해서 파일명만 남기게 한다.
  • Remote directory는 Stage서버의 어느 디렉터리를 remote 해서 파일을 옮길 것인지이다.
  • Exec command는 파일을 옮기고 나서 명령어를 실행시킬 수 있는데 나는 톰캣을 재실행시키는 명령어를 입력했다. war만 옮기면 바로 적용이 안되길래..

빌드 설정

Git에서 레포를 가지고 소스를 가져오면 properties(yml) 파일이 안 넘어온다. 따라서 다음과 같이 Build서버에 생성을 해놓고 복사해와서 Build를 진행하도록 설정하였다.

파일을 만드는 설정은 간단하다.

sudo su jenkins
cd ~/
mkdir deploy
cd deploy
mkdir project-stage
cd project-stage
mkdir config
cd config
vi application.yml # 설정 파일 붙여 넣기

Job을 생성하고 나면 Build Now을 클릭하여 Build 및 배포할 수 있다.

또한 Build History에 기록이 #넘버로 나타나는데 클릭하면 빌드 시 Console output을 확인할 수 있다.

빌드 output

빌드가 잘 성공되고, 파일 전송까지 성공했는지 확인하면 된다.

 


어떤 프로젝트를 빌드하고 배포하느냐에 따라 여러 오류가 날 수 있다. 

출력되는 에러를 잘 확인해서(Console output) 삽질을 열심히 하면 해결할 수 있을 것이다 파이팅!

 

그래도 젠킨스 빌드의 흐름을 이해하면 금방 해결할 수 있는 것이 대부분일 것이다

 

 

 

제 개인적인 생각을 담아 작성하기 때문에 틀린 부분이 있을 수 있습니다! 언제든 댓글로 알려주시면 감사하겠습니다.

반응형

'AWS' 카테고리의 다른 글

SpringBoot API 개발팀을 위한 aws 세팅  (0) 2022.07.30