Jenkins 와 GitHub를 SSH 연결한 후, Build및 Excecute Shell 이용

2021. 2. 8. 11:15Etc/trash bin

300x250
반응형

이제 본격적으로 Spring boot 애플리케이션 배포 자동화 과정을 설명할 거에요.
이전 포스팅에서 한번 언급했듯 아래의 과정을 따라 배포 서비스를 행할 거에요.

  1. 특정 Branch의 GitHub가 변경된 사항을(Push 등..) 감지하여 git pull 하고
  2. 변경된 사항을 Maven으로 Build 한 후,
  3. 새로 빌드된 애플리케이션을 Deploy

애플리케이션을 Deploy 하는 곳은

  1. Jenkins가 설치된 서버에 deploy
  2. 다른 서버에 SSH 접속하여 build된 앱을 전송하여 deploy
  3. GitHub Hook 도착시 다른서버에 SSH 접속하여 애플리케이션 디렉토리로 이동 후, git pull 하여 최신 source 반영

등의 다양한 형태로 할수가 있습니다.


이 포스팅에서는 1번째에 쓰여진 Jenkins가 설치된 Server에 앱을 최신 앱을 실행시키는 방법을 알아볼 거에요.


아래에 자세한 과정을 보기 앞서서 어떤 과정을 거쳐야 하는지 간략히 설명하자면,

  1. Item(프로젝트) 생성
  2. Git Repository URL 설정
  3. Git Repository 접속을 위한 Credentials 설정
    ※ 어떤 Branch를 빌드할 것인지 선택
  4. Maven으로 소스 빌드
  5. 빌드 후 이뤄져야할 shell 명령어 작성
    (실행 중인 spring boot 서버를 종료시키고, 기존 애플리케이션을 backup 폴더에 저장한 후
    새로 빌드된 앱을 이동시킨 후, 백그라운드로 spring boot 애플리케이션 시작)

1. Item 생성 및 프로젝트 생성

새로운 Item을 클릭한 후, 프로젝트 이름을 설정하고 Freestyle project를 생성합니다

06


07


2. General 설정

Jenkins 프로젝트 Item의 General은 프로젝트 소개를 간단하게 작성하는 부분이다.

간략한 설명과 GitHub url 주소를 작성했다.

저는 빌드 기록을 최신 3개만 보관하도록 설정했습니다. (필요에 따라 알맞게 설정해주세요.)

08


3. 소스코드 관리

Repository URL은 소스코드가 올려져 있는 버전관리 시스템의 clone 주소를 말한다.
이때, web URL을 이용하는 방법과 SSH key를 이용하는 방법이 있는데,

25

26

https web URL은 username 과 password를 요구하는 방법이고,
SSH는 username과 private key를 이용하는 방법이다.

저는 SSH 방식으로 할 예정입니다.


3-1. SSH key 만들기 (private key, public key)

GitHub Repository를 SSH로 접속하기위해선 SSH key를 생성해야 합니다.

SSH key를 생성하고, 그 키를 GitHub에 등록하기 위한 과정은 아래와 같습니다.

  1. ssh-keygen 으로 public key와 private key 생성
  2. 생성한 키를 $JENKINS_HOME/.ssh 에 위치시키기
  3. $JENKINS_HOME/config 에 github 접속정보 추가
  4. public key와 privat key의 소유권과 권한을 변경하기

※ Jenkins 웹 페이지에서 이뤄지는 빌드나 명령 등은 jenkins라는 사용자가 행하는 것으로.
Jenkins가 이용해야하는 ssh key는 당연히 jenkins 홈 디렉토리에 위치해야하며
소유권도 jenkins로 되어있어야 합니다.


jenkins 사용자는 터미널로 직접 로그인을 할 수 없는 계정이기 때문에 권한 변경의 편의를 위해 root권한으로 로그인 한 후, 파일의 소유권과 권한을 변경할 것입니다.


1) jenkins 사용자의 .ssh 폴더 생성

su
cd /var/lib/jenkins
mkdir .ssh
chown jenkins:jenkins .ssh
chmod 700 .ssh
cd .ssh

jenkins 홈디렉토리로 이동한 후, 먼저 .ssh 폴더가 없을 경우 생성해주고 소유권 및 권한을 변경해줍니다.
※ 디렉토리는 700(rwx------), 파일들은 600(rw-------)으로 변경할 거에요.


2) public key & private key 생성

ssh-keygen -t rsa -C "for GitHub jiniya22"

GitHub SSH 통신에 이용될 key를 공개키 암호화 알고리즘으로 생성합니다.
( -C 옵션은 comment 입니다. )

※ ssh key 생성 경로 및 파일명은 /var/lib/jenkins/.ssh/id_rsa_github_jiniya22
저의 경우, jiniya22 사용자의 GitHub Repositories 에 관한 접근 권한을 모두 허용하기 위한 키를 생성할 예정이라 저렇게 키이름을 지었습니다.

chown jenkins:jenkins id_rsa_github_jiniya22
chown jenkins:jenkins id_rsa_github_jiniya22.pub
chmod 600 id_rsa_github_jiniya22
chmod 600 id_rsa_github_jiniya22.pub
vi config

생성한 키들의 소유권을 jenkins 로 변경하고 권한을 사용자 전용으로 변경합니다.
그리고 ssh 접속정보 파일 config를 생성합니다.

#jiniworld
Host github.com
  HostName github.com
  User jiniya22
  IdentityFile ~/.ssh/id_rsa_github_jiniya2
chown jenkins:jenkins config
chmod 600 config

SSH 접속에 이용할 username과 private key 파일을 지정해줍니다.
그리고 마찬가지로 소유권과 권한을 변경합니다.


3-2. GitHub에 public key 등록

생성한 SSH 키 중, public key인 id_rsa_github_jiniya22.pub를 GitHub에 등록합니다.

23

24

jiniya22라는 사용자가 접속할 수 있는 모든 repository에 대한 SSH 접속할 수 있도록 설정합니다.


3-3. Credential에 username과 private key 등록

27

(※ Credentials를 추가할 때, HTTPS clone 주소를 이용할 경우에는 Username with password 방식으로 기입하면 됩니다.)


3-4. 최종 모습

20

Branches to build에 빌드시킬 branch를 설정하면 됩니다.


4. Build

28

기존에 로컬에서 메이븐 프로젝트를 빌드할 때, mvn clean package -P prod 라고 썼다면 mvn을 뺀 뒷부분을 작성하면 됩니다.
프로파일을 여러개 설정했을 경우 (local, staging, prod 등...) 빌드할 프로파일을 설정하면 됩니다.
프로파일이 한개 뿐이라면 그냥 clean 만 쓰면 됩니다.

여기까지 하면 Build Now 버튼을 누를시 $JENKINS_HOME/workspace/item명 에 프로젝트가 빌드된 결과가 생성됩니다.
(※ GitHub Webhook은 다음 포스팅에서 다룰 예정입니다.)


만일, Build를 끝낸 후, 기존에 서비스 중이었던 웹 애플리케이션을 종료시키고 새로 빌드된 웹 애플리케이션을 실행시키고 싶다면?

Build에 Add Build stepExecute shell에서 애플리케이션 pid를 종료시킨 후, 새로운 애플리케이션을 실행시키는 셸 스크립트를 작성해주면 됩니다.

pid=$(ps -eaf | grep jiniworld.jar | grep -v "grep" | grep -v $0 | awk '{print $2}')
if [[ $pid == "" ]]
then
 echo jiniworld.jar is not running
else
 kill -9 $pid
 echo jiniworld.jar process killed forcefully, process id $pid.
fi
cd /var/lib/jenkins/deploy
rm -rf backup/*
mv jiniworld.jar backup/
cp /var/lib/jenkins/workspace/jiniworld/target/jiniworld.jar jiniworld.jar
BUILD_ID=dontKillMe nohup java -jar jiniworld.jar 2>> /dev/null >> /dev/null &
echo $!

tip 1

참고로 jenkins는 빌드 과정을 모두 마친 후, jenkins 사용자로 실행된 child process를 모두 kill 시키기 때문에 nohup같은 명령어가 계속 종료되는 현상이 발생됩니다.

이를 방지하기 위해 nohup 명령어 앞에 BUILD_ID=dontKillMe를 붙입니다.
젠킨스 build과정을 모두 마친 후, 종료되지 않기를 원하는 명령어에는 반드시 BUILD_ID=dontKillMe 를 붙이도록 합시다.


tip 2

nohup 명령어를 사용할 때, 애플리케이션의 start가 정상적으로 마쳤음에도 계속 로딩되다가 UNSTABLE 상태로 끝마치는 경우가 있습니다.

이를 방지하기 위해, nohup java -jar jiniworld.jar &2>> /dev/null >> /dev/null를 추가했습니다.

300x250
반응형
1 2 3