OS 및 기타
Jenkinsfile
bright jazz music
2023. 9. 21. 11:54
/*사용할 전역 변수 선언 */
def target = "EcertAdmin*.jar"
def target_dir = "/home/coffee/chainverse-apps/ecertificate/back-apps/icert-admin"
def backup_dir = "${target_dir}/backup"
def docker_container="icert-admin"
pipeline {
agent {
label 'docker-agent-for-node-and-java'
}
stages {
stage('kill current java process') {
/*
먼저 192.168.2.104에서 coffee를 docker 그룹에 포함하여 coffee가 도커 명령어를 실행할 수 있어야 함.
sudo usermod -aG docker coffee (104번에서 수행되어야 하며, 입력 후 logout했다가 다시 로그인 해야 적용될 수 있음.)
*/
steps {
script {
/* Java 프로세스 종료*/
sh '''
#pid=$(ssh coffee@192.168.2.104 "docker exec icert-admin bash -c 'ps -ef | grep java | grep -v grep' | awk '{print \$2}'")
#pid=$(ssh coffee@192.168.2.104 "docker exec icert-admin bash -c 'ps -ef | grep java | grep -v grep' | awk '{print \\\$2}'")
pid=$(ssh coffee@192.168.2.104 "docker exec ${docker_container} bash -c 'ps -ef | grep java | grep -v grep' | awk '{print \\\$2}'")
if [ "$pid" != "" ]; then
ssh coffee@192.168.2.104 "docker exec ${docker_container} bash -c 'kill -9 $pid'"
fi
'''
}
}
}
stage('current Jar backup and remove') {
/* 먼저 192.168.2.104에서 coffee를 docker 그룹에 포함하여 coffee가 도커 명령어를 실행할 수 있어야 함.*/
steps {
script {
/* 기존 JAR 파일 백업: /home/coffee/에 위치하는 remove_and_backup.sh 실행 *아규먼트 3개 필요 */
sh "ssh coffee@192.168.2.104 \"/home/coffee/remove_and_backup.sh ${target} ${target_dir} ${backup_dir}\""
}
}
}
stage('Set Permissions') {
steps {
sh 'chmod +x gradlew'
}
}
stage('compile') {
steps {
sh "./gradlew compileJava"
}
}
stage('Unit Test') {
steps {
sh "./gradlew test"
}
}
stage('bootJar') {
steps {
sh "./gradlew bootJar"
}
}
/*
아래 작업 전에 도커 제킨스 에이전트가 실행될 서버(192.168.2.112)에서 ssh 키 쌍 생성하여 공개키를 104에 전달하는 작업 필요
ssh-keygen -t rsa -b 4096
ssh-copy-id coffee@192.168.2.104
ssh coffee@192.168.2.104
도커 컨테이너와 도커 호스트 간 키 공유(디렉토리 마운트): jenkins의 clouds 설정의 mount 항목에서 다음의 값 입력type=bind,src=/home/coffee/.ssh,dst=/root/.ssh
작업을 수행하기 위해 생성된 도커 컨테이너를 docker inspect <dockerID 또는 이름> 으로 살펴보면 마운트 확인 가능
*/
stage('new Jar deploy') {
/*scp로 파일 전송 후, 도커 컨테이너 내부에서 해당 파일 실행*/
steps {
script {
sh """
scp ./build/libs/${target} coffee@192.168.2.104:${target_dir}/
ssh coffee@192.168.2.104 'docker exec ${docker_container} bash -c "\
nohup java -jar ${target_dir}/${target} &"'
"""
}
}
}
}
}
/* 아래는remove_and_backup.sh의 내용*/
/*
#!/bin/bash
#file에 디렉터리 경로를 포함한 파일명 담기
#basename 함수를 사용하여 경로를 제외한 파일명만 추출
#추출한 파일명에 "오늘일자.bak" 붙여서 backup 디렉터리로 이동
#변수선언
target=$1
target_dir=$2
backup_dir=$3
#아규먼트 제공여부 확인. -z : 빈 문자열 여부 확인.
if [ -z "${target}" ] || [ -z "${target_dir}" ] || [ -z "${backup_dir}" ]; then
echo "#### ERROR: Please provide three appropriate arguments! (target, target_dir, backup_dir) ####"
exit 1
fi
# target_dir가 존재하는지 확인. -d : 디렉터리 여부 확인. 디렉터리인 경우 true
if [ ! -d "${target_dir}" ]; then
echo "#### WARNING: ${target_dir} does not exist! ####"
exit 1
fi
# backup_dir가 존재하지 않으면 생성
if [ ! -d "${backup_dir}" ]; then
mkdir -p ${backup_dir}
fi
for file in ${target_dir}/${target};
do
#파일이 실제로 존재하지 않거나 일반파일이 아닌 경우 건너뜀
if [ ! -f "$file" ]; then
echo "#### WARNING: $file does not exist or is not a regular file! ####"
continue
fi
base=$(basename $file)
mv ${file} ${backup_dir}/${base}.$(date +%Y%m%d%H%M%S).bak
# ex) target.20230921095711.bak
done
#사용하기 전chmod +x remove_and_backup.sh 명령어를 사용해 실행권한 부여할 것
*/