본문 바로가기
Ops/Synology

Docker에 Jenkins 로 CI/CD 구축(4/4)

by 바람냄새 2023. 8. 15.

------------------------------------------------------------------------------------------------------------------

대주제 : 시놀로지 도커 활용

소주제 : 시놀로지에 젠킨스 설치하여  CI/CD 구축

목표 : 서버(시놀로지) - 젠킨스(시놀로지, 도커) - Git(Github) 환경의 서비스 환경 구축.

-------------------------------------------------------------------------------------------------------------------
Docker에 Jenkins 로 CI/CD 구축(1/4)
Docker에 Jenkins 로 CI/CD 구축(2/4)
Docker에 Jenkins 로 CI/CD 구축(3/4)
Docker에 Jenkins 로 CI/CD 구축(4/4)
 1. ssh 환경설정 (Publish Over SSH)
 2. remote server에 ssh 로 파일전송
 3. 타겟서버 쉘 스크립트 작성 및 실행


 

1.  ssh 환경설정 (Publish Over SSH)

 1) 젠킨스 플러그인 설치 (Publish Over SSH)

 Publish Over SSH

2) 크레덴셜 등록(ssh server 접속용)

 

Domains의 (global) 클릭

 

Add Credentials 클릭.

 

nas접속(ssh)을 위한 크레덴셜 등록 (username with password 방식)

username : nas ssh id 
password : nas ssh password
id : 젠킨스에서 사용할 크레덴셜 명칭
description : 설명

 

크레덴셜 생성 모습

 

3) SSH Server  설정

name : 임의의 명칭
Hostname : Nas도메인
Username : ssh로그인 계정
Remote Directory : nas를 sftp로 접속시 기본으로 이동할 경로.
<고급>
- Use password authentication, or use a different key 체크
- Password 입력
- Port 입력 (공유기에서 시놀로지 ssh 서비스로 포트포워딩 한 포트 입력)

Test Configuration 을 눌러 결과가 'Success' 나오면 연결 성공!

 


2.  remote server에 ssh 로 파일전송

 Pipeline 설정을 통한 jar 파일 리모트 서버 전송

파이프라인 스크립트 생성을 위한 Pipeline Syntax 페이지 링크 클릭

Pipeline Syntax 클릭

 

파이프라인 구성을 위한 스크립트 작성

SSH Server Name은 시스템 설정에서 미리 설정한 이름을 사용함.

설정값을 입력 한 뒤 아래처럼 'Generate Pipeline Script' 버튼을 크릭하여 스크립트를 생성함.

 

생성된 스크립트를 복사하여 파이프라인 Stage에 추가 함.

 

프로젝트로 돌아가 '지금 빌드'를 실행하면, 메이븐 빌드 후 서버로 파일을 전송한걸 확인 할 수 있음.

타겟서버에 전송 된 파일을 확인 할 수 있음.

 


3.  타겟서버 쉘 스크립트 작성 및 실행

 타겟 서버에 SSH접속하여 명령러를 실행하기 위해 SSH Pipeline Steps 플로그인을 설치한다.

 

파이프라인에 타겟서버에 ssh로 접속하여, 명령을 실행하는 스테이지 추가.

        stage('Remote SSH') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'synology-ssh', usernameVariable: 'userName', passwordVariable: 'password')]) {
                    script {
                        def remote = [:]
                        remote.name = "synology-ssh"
                        remote.host = "jota94.asuscomm.com"
                        remote.port = 5023
                        remote.allowAnyHosts = true
                        remote.user = userName
                        remote.password = password
    
                        def combinedCommand = 'sudo ls -al && cd workspace'
                        sshCommand remote: remote, command: combinedCommand
                    }
                }
            }
        }

실제 combinedCommand 문자열을 통해, 쉘프로그램을 실행할 것임.
타겟서버쪽 jenkins 계정에는 sudo 명령이 가능하도록 설정이 되어 있어야 함.

전체 파이프라인 코드는 아래와 같음.

pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "maven-3.9.4"
    }

    stages {
        stage('Build') {
            steps {
                // Get some code from a GitHub repository
                git branch: 'main',url: 'https://github.com/whwnddml/bootdemo.git'

                // Run Maven on a Unix agent.
                sh "mvn -Dmaven.test.failure.ignore=true clean package"

                // To run Maven on a Windows agent, use
                // bat "mvn -Dmaven.test.failure.ignore=true clean package"
            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    archiveArtifacts 'target/*.jar'
                }
            }
        }
        
        stage('SSH Transfer') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'nas', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sudo ls -lrt', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/lib', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
            }
        }
        
        stage('Remote SSH') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'synology-ssh', usernameVariable: 'userName', passwordVariable: 'password')]) {
                    script {
                        def remote = [:]
                        remote.name = "synology-ssh"
                        remote.host = "jota94.asuscomm.com"
                        remote.port = 5023
                        remote.allowAnyHosts = true
                        remote.user = userName
                        remote.password = password
    
                        def combinedCommand = 'sudo ls -al && cd workspace'
                        sshCommand remote: remote, command: combinedCommand
                    }
                }
            }
        }

        
    }
}

 

서버에서 실행할 쉘 스크립트 작성.

쉘 스크립트가 위치할 경로는 /homes/jenkins/workspace/bin 으로 설정했다.

# vi restart.sh

#!/bin/bash
JAVA_HOME=/volume1/@appstore/java-11-openjdk
PROJECT_HOME=/var/services/homes/jenkins/workspace

sudo ps -ef | grep "bootdemo-0.0.1-SNAPSHOT" | grep -v grep | awk '{print $2}' | xargs sudo kill -15 2 > /dev/null
if [ $? -eq 0 ];then
    echo "bootdemo-0.0.1-SNAPSHOT Stop Success"
else 
    echo "bootdemo-0.0.1-SNAPSHOT Not Running"
fi
 
echo "bootdemo-0.0.1-SNAPSHOT Restart!"
echo $1
sudo nohup $JAVA_HOME/bin/java -jar -Dserver.port=18081 $PROJECT_HOME/lib/*.jar --spring.profiles.active=dev > /dev/null 2>&1 &

# chmod 755 boot-restart.sh

 

작성한 boot-restart.sh 를 실행하도록 파이프라인 스크립트 수정.

#!/bin/bash

JAVA_HOME=/volume1/@appstore/java-11-opendk
PROJECT_HOME=/var/services/homes/jenkins/workspace

# 중단
sudo ps -ef | grep "bootdemo-0.0.1-SNAPSHOT" | grep -v grep | awk '{print $2}' | xargs sudo kill -15 2> /dev/null

if [ $? -eq 0 ]; then
    echo "bootdemo-0.0.1-SNAPSHOT Stop Success"
else
        echo "bootdemo-0.0.1-SNAPSHOT Not Running"
fi

# 재시작
echo "bootdemo-0.0.1-SNAPSHOT Restart!"
echo $1
sudo nohup $JAVA_HOME/bin/java -jar -Dserver.port=18082 $PROJECT_HOME/lib/*.jar --spring.profiles.active=dev > /dev/null 2>&1 &
echo "bootdemo-0.0.1-SNAPSHOT Restarted on port 18082."