테스트용 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