관리 메뉴

bright jazz music

Jenkinsfile 본문

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 명령어를 사용해 실행권한 부여할 것

*/

'OS 및 기타' 카테고리의 다른 글

어댑터 설정 변경  (0) 2024.04.02
Git 병합  (0) 2024.03.07
백업 스크립트  (0) 2023.09.21
젠킨스 트리거 설정  (0) 2023.09.18
Nginx 설정 (리액트 index.html)  (0) 2023.05.03
Comments