[Jenkins CI/CD] 3. Jar 파일을 클라우드 서버로 전달하기

젠킨스를 이용해서 스프링 부트, 그래들 프로젝트를 자동으로 서버에 배포하기 위한 절차를 정리한다.

  1. GitHub Repository 코드를 clone 하기
  2. Gradle 프로젝트를 빌드하기
  3. 빌드된 Jar 파일을 클라우드 서버로 전달
  4. Develop 브랜치 PR 시 자동으로 배포 (WebHook 사용)
  5. Jenkins Slack 연동

🚚 빌드된 Jar 파일을 클라우드 서버로 전달

이전 Github Repository Clone Stage 와 Gradle Project Build Stage를 성공적으로 수행되었다면, build/libs 경로에 실행 가능한 .jar 파일이 생성되었을 것이다.

해당 파일을 이제 Oracle Cloud 서버의 경로로 전달을 해주어야 구축되어 있는 환경에서 배포를 진행할 수 있다.

📈 Jenkins Publish Over SSH 플러그인 설치

젠킨스 서버에서 애플리이셔 클라우드 서버로 .jar 파일을 전송하기 위해선 ssh를 이용해 전달하는데, 젠킨스는 Publish Over SSH 플러그인을 통해 ssh 기능을 이용할 수 있다.

젠킨스 대시보드 메인 > 플러그인 매니저 > 설치 가능 탭으로 이동해 오른쪽 검색을 통해 해당 플러그인을 검색해 설치한다.

젠킨스 대시보드 > 시스템 설정 > Publish Over SSH 탭으로 이동한다.

Key 텍스트 필드에 클라우드에 접속하는데 사용하는 Private Key를 복사해서 붙여넣어준다.

그리고 하단의 SSH Servers 추가 버튼을 클릭해 내용을 작성해준다.

  • Name : 해당 설정의 이름을 지정
  • Hostname : SSH를 이용해 접속할 도메인이름 (클라우드 공용 IP 주소)
  • Username : SSH 접속시 필요한 유저이름
  • Remote Directory : .Jar 파일 전송 시 Root 경로로 잡히는 경로

모든 정보를 입력한 후 Test Configuration을 누르면 Succes 와 함께 제대로 연동됨을 확인할 수 있다.

⚠️ Private Key 설정해도 Test Configuration을 실패하는 경우

해당 프로젝트를 연동하는 과정에서 접속 가능한 Private 키를 지정해도 Test Connection이 제대로 연동되지 않는 경우가 있었다.

기존 클라우드 접속 Private Key 의 포맷은 b3Blb로 시작하는 개인키였다. 해당 포맷은 최신 OpenSSH 포맷이기 때문에 젠킨스 혹은 플러그인에서 읽을 수가 없다는 이슈를 확인했다.

따라서, 젠킨스나 플러그인이 읽을 수 있는 포맷의 개인키/공개키를 새로 생성해야했다.

$ ssh-keygen -t rsa -b 4096 -m PEM 

위의 명령어로 새로운 개인키/공개키를 생성 시 “MIIE” 포맷으로 시작하는 개인키가 생성되고, 해당 개인키를 Key 텍스트 필드에 입력해주면 Test Configuration이 성공한다.

Private Key를 설정해도 Test Configuration이 실패하는 경우 젠킨스 이슈 링크

✏️ Pipeline Script 작성하기

SSH 설정을 통해 클라우드 서버에 연결이 되었기 때문에 Pipeline Script를 이용해서 젠킨스 서버 경로에 있는 jar 파일을 클라우드 서버로 전달해줘야한다.

대시보드 > “설정한 파이프라인" > 하단의 Pipeline Syntax를 이용해서 스크립트를 만들어준다.

Snippet Generator의 Steps에서 sshPublisher: Send build artifacts over SSH를 선택한다.

  • Name : 이전 Publish Over ssh에서 새로 추가한 서버를 선택한다.
  • Source files : gradlew bootJar 명령어로 빌드한 Jar 실행파일이 저장된 경로를 작성한다. bootJar 명령어로 build 시 build/libs 경로에 파일이 생성된다.
  • Remove prefix : Source files 경로의 하위폴더를 지운다. 하위 폴더를 지움으로 써 *.jar 파일만 전송할 수 있게 해준다.
  • Remote Directory : 젠킨스 서버가 전달하는 Jar 파일을 저장할 디렉토리 (클라우드 내 사용자가 직접 생성한 디렉토리)
  • Exec command : 파일 전송이후 해당 경로의 쉘 스크립트를 실행해 작성한 명령어를 실행할 수 있다.

작성한 후 아래 Generate를 통해 pipeline script를 복사한 후 Pipeline에 새로운 Stage를 만들고 steps에 붙여넣는다.

Pipeline Script 하단의 verbose 부분을 true로 변경해주면 Log가 상세하게 찍히므로 디버깅시에 유용하다.

젠킨스 Pipeline을 통해 빌드 시작 전 deploy 폴더에 아무 파일도없고, script 파일에 파일 전달 받은 후 실행할 쉘 스크립트 파일을 작성해 놓았다.

실제로 Pipeline을 실행해서 지금까지 작성한 stage 들이 제대로 작동하는지 확인한 후 위의 경로에 작성한 스크립트 파일과 jar 파일이 제대로 전달되었는지 확인해본다.

Pipeline을 이용해 지금까지 작성한 3개의 Stage가 모두 제대로 실행되었고, 젠킨스 Log에 위에서 작성한 Script 파일의 명령어가 제대로 수행된 것을 확인할 수 있다.

또한, 2번째 Stage에서 Build한 Jar파일이 제대로 클라우드 서버의 Remote Directory로 전달됨을 확인할 수 있다.

📄 References

[우젠구2편] 젠킨스 파이프라인을 활용한 배포 자동화 : https://velog.io/@sihyung92/우젠구2편-젠킨스-파이프라인을-활용한-배포-자동화

Jenkins 공식 문서 : https://www.jenkins.io/doc/book/using/

[Jenkins] Jenkins & Github 연동 및 자동배포 구성하기 3 : https://dbjh.tistory.com/68

좋은 웹페이지 즐겨찾기