테스트용 Jenkins 를 구성하다보면 Production 환경의 Jenkins plugins들을 동일하게 설치하고 싶은 경우가 있다.

적게는 몇십 개부터 몇백 개까지 존재하는 plugins들을 일일이 따라 설치하거나 굉장한 중노동일것이다..

 

이때 유용하게 사용할 수 있는게 Rsync

 

Rsync를 활용해 Production 환경의 Jenkins plugins를  테스트용 Jenkins 서버에 copy 해보았다.

테스트 한 내역 설명에 앞서 Rsync 에 대해 먼저 짚어본다.

 


Rsync란?

  • Remote Synchronization의 약어로 서로 다른 서버간에 파일들을 효율적으로 전송&동기화 시켜주는 utility
  • 파일들의 timestamp와 수정 시간 등을 비교하며 synchronizing 수행
  • delta encoding이라는 알고리즘을 사용하여 네트워크 사용량을 최소화함
  • Package 관리 시스템들이 software repositories와 mirror sites를 synchronizing 하는 데 주로 사용하는 utility
  • 파일 및 디렉토리의 소유자, 권한 정보 등도 복사됨
  • SCP(Secure Copy)보다 속도가 빠름

Jenkins 를 구성하면 ${JENKINS_HOME}/plugins 디렉토리에 plugins 파일들이 위치하게 된다

아래와 같이 plugins 디렉토리 내 plugin 파일들 확인이 가능하다. (jenkins 처음 설치 시, recommended plugins만 설치한상태)

[irteamsu@hyewon-dev001-infraops-jp2v-dev .jenkins]$ cd plugins/
[irteamsu@hyewon-dev001-infraops-jp2v-dev plugins]$ ls -al
total 83576
drwxr-xr-x 78 irteamsu irteamsu     8192 Sep  7 17:42 .
drwxr-xr-x 13 irteamsu irteamsu     4096 Oct 12 15:47 ..
drwxr-xr-x  7 irteamsu irteamsu      124 Sep  4 16:20 ace-editor
-rw-r--r--  1 irteamsu irteamsu  4279042 Sep  4 16:20 ace-editor.jpi
drwxr-xr-x  4 irteamsu irteamsu       56 Sep  4 16:20 ant
drwxr-xr-x  4 irteamsu irteamsu       56 Sep  4 16:20 antisamy-markup-formatter
-rw-r--r--  1 irteamsu irteamsu  2858119 Sep  4 16:20 antisamy-markup-formatter.jpi
-rw-r--r--  1 irteamsu irteamsu    82963 Sep  4 16:20 ant.jpi
drwxr-xr-x  4 irteamsu irteamsu       56 Sep  4 16:20 apache-httpcomponents-client-4-api
-rw-r--r--  1 irteamsu irteamsu  1761975 Sep  4 16:20 apache-httpcomponents-client-4-api.jpi
drwxr-xr-x  4 irteamsu irteamsu       56 Sep  4 16:20 bouncycastle-api
-rw-r--r--  1 irteamsu irteamsu  4885133 Sep  4 16:20 bouncycastle-api.jpi
drwxr-xr-x  5 irteamsu irteamsu       70 Sep  4 16:21 branch-api
......

현재는 확장자가 .jpi 인 파일들만 확인되지만 Jenkins 를 운영하다보면 .hpi 확장자의 파일들도 종종 볼 수 있다.

본 내용 설명에 앞서 .jpi vs .hpi 파일을 잠깐 비교해 본다(나도 작업하면서 늘 궁금했지만 이제서야 찾아본다 ㅎㅎ..)


.hpi vs .jpi ?

  • .hpi는 Jenkins가 Hudson이 었을 때 legacy 확장자 (h came from Hudson)
  • .jpi는 Jenkins가 플러그인 설치 시, 생성되는 파일 확장자 (j came from Jenkins)
  • 동일한 플러그인에 대해 .hpi, .jpi 파일이 둘 다 존재하는 경우, .jpi를 우선 인식하여 적용함

 

자 그럼 이제 production Jenkins의 plugins를 내 test 서버의 Jenkins로 동기화하기 위한 shell 스크립트를 짜본다

  • copy_jenkins_plugins_to_test.sh
#!/usr/bin/env bash

set -eu

TARGET_HOST=hyewon-dev001-dev
TARGET_DIR=/home/www/jenkins/.jenkins/plugins

RSYNC_USER=$(whoami)
RSYNC_CMD=/usr/bin/rsync
RSYNC_OPTS="-avzh --delete"

RSYNC_EXCLUDE="--exclude=jobs/"
RSYNC_EXCLUDE="${RSYNC_EXCLUDE} --exclude=config-history/jobs/"
RSYNC_EXCLUDE="${RSYNC_EXCLUDE} --exclude=nodes/"

${RSYNC_CMD} ${RSYNC_OPTS} ${RSYNC_EXCLUDE} -e ssh ${TARGET_DIR}/ ${RSYNC_USER}@${TARGET_HOST}:${TARGET_DIR}

# Restart Jenkins(TARGET_HOST)
token='eqAY62UwzGK9Cl.n_sE27pTcLnYIWu/dR2T974X0'
body='{ "restartTask":{ "apache":"do nothing", "tomcat":"restart with clean working directory" }, "restartPlan":{ "numberOfConcurrentRestart":1 } }'
curl -vvv -XPOST -H "Authorization: Bearer ${token}" -H "Content-Type: application/json" -d "${body}" http://${deployment_system}/rDLgUpP2tJ/projects/jenkins-master-dev:test/restarts

 

+ Recent posts