새소식

300x250
5. 개발도구/Jenkins

[Jenkins] [ec2] Jenkins 원격 서버 배포(Publish Over SSH)

  • -
728x90

[Jenkins] [ec2] Jenkins 원격 서버 배포(Publish Over SSH)

 

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Jenkins와 ec2 연결하여 배포 하기 - Jenkins - Publish Over SSH ] 입니다. : ) 

 

Jenkins와 배포서버 구성을 한 서버안에서 한다면, 이전 포스팅에서 젠킨스와 Github만 연동하여 배포, 실행하면 가능할 것이다.

(참고 - 2020/06/18 - [6. 개발도구/6_6 Jenkins] - [Jenkins] [github] Jenkins와 github 연동하기)

 

배포할 서버가 여러대로 늘어나여, 젠킨스 서버와 배포 서버가 분리되어야 한다면, 각각 서버마다 jenkins를 설치해야할까?

당연히 아니다. 한개의 젠킨스 서버 빌드하여 모든 다른 서버에 SSH방식으로 파일 전송, 빌드 스크립트를 유발하여 관리가 가능하다.

 

그럼 이와 관련된 내용을 실습하여 보자.

 

 

0.Publish Over SSH 플러그인 설정

▶ 1. Publish Over SSH 플러그인 검색 및 설치

 - Jenkins 관리 > 플러그인 관리

 

 - Publish Over SSH 검색, 체크 하여 다운로드 및 재시작

▶ 2. Publish Over SSH 플러그인 설정

 - Jenkins 관리 > 시스템 설정

 

 - Publish over SSH 탭으로 이동하여 관련 내용 설정

● Key

 - RSA 키가 필요하다.

 - ec2 기준으로 설명 하자면 ec2를 생성할 때 받은 ssh 접속 키인 pem 파일내용을 복사하여 붙여 넣으면 된다.

(참고 : 2019/02/05 - [3. 웹개발/3_3 AWS] - [AWS] 4.EC2(Elastic Compute Cloud) 란? (설치 포함 )

 - 혹시 ec2가 아닌 경우에는 직접 생성 할 수 있다.

(참고 : 2020/05/18 - [6. 개발도구/6_3 GIT] - [Git (7)] Github 비밀번호 입력 없이 pull/push 하기(github ssh key 설정 )

 

● Name : 본인이 사용할 임의의 SSH Servers의 Name을 입력하면 된다.

 - ex : SpringBoot_FirstTest

● Hostname : 실제로 접속할 원격 서버 ip, 접속 경로를 입력한다.

 - ex : ec2-1-2-3-4.ap-northeast-2.compute.amazonaws.com

● Username : 접속할 원격 서버의 user 이름이다.

 - ex : ec2user

● Remote Directory : 원격서버에 접속하여 작업을 하게되는 디렉토리 이다.

 

1.Jenkins Job 설정

▶ 1. 빌드할 Item, Job 설정

 - 본인의 Jenkins Item > 구성

 - 상단 "빌드 후 조치" 탭 클릭 

 - "Send build artifacts over SSH" 클릭 

 - 관련 내용 입력

 - Name : 좀전에 설정한 본인이 지정한 SSH Server 이름을 선택한다.

 - Verbose output in console 을 체크하면 빌드할 때 상세 내역이 표시 된다.

 - Source files :  전송할 파일을 지정한다. 혹시 전체 파일 이동을 하려면 **/* 과 같이 입력 하면 된다.

 - Remove prefix : Source files에서 지정한 경로의 하위 폴더를 지우는 기능 이다. 위의 예시같이 입력한다면 폴더를 제외하고 jar 파일만 전송하게 될 것이다.

 - Remote directory : SSH Server로 지정한 서버의 원격지 폴더이다.

 - Exec command : 파일 전송이 모두 끝난 이후에, SSH Server로 지정한 서버에서 실행될 스크립트를 지정할 수 있는 기능

(해당 script는 jenkins user로 실행하기 때문에 권한문제가 발생가능성이 있다.)

 

이로써 전 포스팅에 이어 현재까지 다음 시나리오의 작업이 완료 되었다.

 

1. GitHub과 Jenkins를 연동하여 소스 당겨와 최신화 및 빌드 하기.

 (이전 포스팅 참고)

2. 빌드된 파일(jar 또는 war)을 원격 서버(ec2)에 전송하기. 이후 빌드 스크립트 실행.

 

※ 참고

 - Jenkins에서 Java 환경 변수 설정이 안되는 것 같아 변수 선언하여 스크립트 작성하였다. 이후 개선할 수 있는지 확인 필요.

 

 - 나와 같은 경우엔 Spring Boot 프로젝트이기에 jar 파일로 빌드 하였고, 해당 jar 파일 실행 후 서버 실행은 잘 되었지만, Unstable 상태로 Timeout이 나는 현상이 있었다. 이는 스크립트 실행 이후 > "/dev/null 2>&1" 처리를 하여 정상 실행 완료 될 수 있었다.

 

 - 간단한 스프링 부트 빌드 sh 예제

#!/bin/bash
REPOSITORY=/ec2-user/app/git

cd $REPOSITORY/project/

echo "> now ing app pid find!"

CURRENT_PID=$(pgrep -f project)

echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
    echo "> no ing app."
else
    echo "> kill -9 $CURRENT_PID"
    kill -9 $CURRENT_PID
    sleep 3
fi
echo "> new app deploy"

JAR_NAME=$(ls $REPOSITORY/ |grep 'project' | tail -n 1)

echo "> JAR Name: $JAR_NAME"

JAVA=/usr/local/jdk1.8.0_202/bin/java

nohup $JAVA -jar $REPOSITORY/$JAR_NAME &

 

 - 최종 로그

Started by user 갓대희
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/goddaehee_project
using credential goddaehee_project
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/~ # timeout=10
Fetching upstream changes from https://github.com/~
 > git --version # timeout=10
using GIT_ASKPASS to set credentials goddaehee_project_project
 > git fetch --tags --progress -- https://github.com/~  +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 273bb28fd254905829dca0298fa5ae2a521a5f23 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 273bb28fd254905829dca0298fa5ae2a521a5f23 # timeout=10
Commit message: "커밋메세지 샘플"
 > git rev-list --no-walk 273bb28fd254905829dca0298fa5ae2a521a5f23 # timeout=10
[goddaehee_project] $ /bin/sh -xe /tmp/jenkins7664368866761647933.sh
+ echo >> project Build Start!
>> project Build Start!
+ ./gradlew build
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootJar UP-TO-DATE
> Task :jar SKIPPED
> Task :assemble UP-TO-DATE
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 11s
3 actionable tasks: 3 up-to-date
jar name : project-0.0.1-SNAPSHOT.jar
SSH: Connecting from host [4fc924782a1d]
SSH: Connecting with configuration [goddaehee_project] ...
SSH: Creating session: username [ec2-user], hostname [1.2.3.4], port [22]
SSH: Connecting session ...
SSH: Connected
SSH: Opening SFTP channel ...
SSH: SFTP channel open
SSH: Connecting SFTP channel ...
SSH: Connected
SSH: cd [/ec2-user/app/git]
SSH: OK
SSH: cd [/ec2-user/app/git]
SSH: OK
SSH: put [project-0.0.1-SNAPSHOT.jar]
SSH: OK
SSH: Opening exec channel ...
SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [cd app/git
./deploy2.sh > /dev/null 2>&1] ...
SSH: EXEC: connected
SSH: EXEC: completed after 5,409 ms
SSH: Disconnecting configuration [goddaehee_project] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.