Verity's Daily Logs_

[Jenkins]원하는 파일만 골라내서 배포하기(Java Dynamic Web Project) 본문

GIT & Jenkins

[Jenkins]원하는 파일만 골라내서 배포하기(Java Dynamic Web Project)

johye0 2022. 2. 3. 21:50
반응형

기존 운영하던 프로젝트를 수정 및 배포하려면 배포 툴이 없었기 때문에, 서버에 FTP로 접속해서 수정된 JSP를 직접 업로드해야만 했다. 이게 서버가 한대만 있었어도 어느 정도 불편함을 감수하고 할 순 있었겠지만, WAS 서버/WEB서버 각각 이중화까지 되어있어서 총 서버 4대에 FTP 전송을 해야 하는 아주 큰 번거로움이 있었다.

 

아래 목적을 달성하기 위하여 Jenkins를 이용한 자동배포를 구현해 보도록 한다.

     목표1. 소스 배포 통로를 한 가지로 통합하기

     목표2. 배포 단계 최소화

     목표3. 코드 수정 내역 및 배포 히스토리 관리

 

1. 기존 프로젝트 파악하기

  • 프로젝트 형태: Dynamic Web Project (Java, JSP 파일 이용)
  • 소스 관리: GitLab 프로젝트
  • 배포 방식(AS-IS): Server 4대 FTP 접속, 파일 업로드 (FileZilla 이용)
  • 배포자: 개발자 팀원 모두

 

2. 자동배포 설정 시 필요한 조건 확인하기

  • Build 작업이 이루어지지 않는다. (컴파일 및 테스트 X)
  • Build Tool 적용하지 않고 자동 배포 환경 구성이 필요함
  • (Maven, Gradle, Ant 미적용)
  • 서버 reboot 없이 원하는 코드파일만 반영 (JSP파일)

 

3. 자동 배포 시나리오

  1. Jenkins Build 시작 (By 개발자)
  2. Git에 변경 사항이 있을 경우 해당 소스 Pull 진행
  3. 변경되어 Pull 된 파일 리스트 확인
  4. 삭제가 아니라면 배포 수행 폴더(jenkins_build)로 복사
  5. jenkins_build 폴더 안 파일들을 운영서버에 전달 (SFTP)

 

4. 배포 스크립트 작성하기 (ver 1.0)

위 시나리오에서 3~4 단계는 실행 스크립트를 직접 작성해야 한다.

 

3) 변경되어 Pull 된 파일 리스트 확인

기본적으로 pull된 히스토리는 현재 HEAD와 직전 HEAD(HEAD@{1})의 차이점을 비교하면 확인할 수 있다.

(git diff 옵션은 참고: https://git-scm.com/docs/git-diff)

# 변경된 파일의 디렉토리/파일명 이 출력된다.
git diff --no-renames -–name-only HEAD HEAD@{1}

 

4) 삭제가 아니라면 배포 수행 폴더(jenkins_build)로 복사

Jenkins에서 할 것은 수정된 파일을 원격지에 그대로 업로드하는 것이다. 삭제된 파일은 업로드할 수 있는 것이 없으니 건너뛰고, 디렉터리 구조까지 그대로 복사하기 위해 cpio를 이용한다.

**jenkins_build 스크립트에서 생성

# 배포 대상 폴더로 파일 복사
[디렉토리/파일명] | cpio -pmdvl ./jenkins_deploy/

 

작성된 배포 스크립트

## 배포 대상 jsp 파일 추출

## 기존 배포 폴더 삭제 후 신규 생성
rm -rf jenkins_deploy/
mkdir jenkins_deploy

FILES=$(git diff --no-renames --name-only HEAD HEAD@{1})

for f in $FILES; do
	#echo $f
    if [ -f "$f" ]; then
    	echo $f | cpio -pmdvl ./jenkins_deploy/
    else
        echo $f is a deleted file
    fi
done

 

5. ver1.0의 문제점, 해결 방안

git diff --no-renames -–name-only HEAD HEAD@{1} 스크립트에는 작은 문제점이 하나 있었는데...

무조건 HEAD 비교를 하기 때문에, 배포빌드 당시 pull 받은 것이 아니더라도 변경된 파일이 나온다는 점이다. 즉, 이전 빌드에서 pull 받은 소스가 존재하고 현재 빌드에선 pull 받은 것이 없다면 배포할 소스파일이 없어야 하지만 위 명령어로는 파일 리스트가 존재한다는 것.

위 문제점을 해결하기 위해 파일 배포가 완료되면 그 시점의 revision id를 txt파일로 저장해 두도록 했다.

 

배포할 파일 리스트 확인

FILES=$(git diff --no-renames --name-only HEAD $(cat revision.txt))

배포 완료 후 revision 저장

git rev-parse HEAD > revision.txt

 

6. (최종) 배포 프로젝트 생성 및 설정

1) 새로운 Item 생성

 

2) Build Strategy 설정

빌드 이력을 얼마나 가지고 있을지 설정한다. 작은 프로젝트의 경우 설정하지 않아도 무방하지만, 일반적으로 지정하고 넘어가 준다.

 

3) Git Repository 저장

Credentials에는 이전 초기 환경설정에서 추가해뒀던 Jenkins배포용 GitLab 계정을 지정한다.

 

4) Build1 - Shell Script 작성

## 배포 대상 jsp 파일 추출

rm -rf jenkins_deploy/

mkdir jenkins_deploy

FILES=$(git diff --no-renames --name-only HEAD $(cat revision.txt))
#FILES=$(git diff --no-renames --name-only HEAD )

for f in $FILES; do
	#echo $f
    if [ -f "$f" ]; then
    	echo $f | cpio -pmdvl ./jenkins_deploy/
    else
        echo $f is a deleted file
    fi
done

 

5) Build2 - SSH Server 접속 후 파일 전송

접속 정보가 미리 저장된 Server에 jenkins_deploy/ 하위 소스들을 전송한다.

이때 사용하는 플러그인은 ‘PUBLISH OVER SSH’라는 것인데, 설치 및 설정 방법은 다음 포스팅에서 다룰 예정이다.

 

6) Build3 - revision.txt 업데이트

git rev-parse HEAD > revision.txt

반응형
Comments