Print
카테고리: [ Cloud Computing & MSA ]
조회수: 25953

Jenkins 에서 원격지에 파일을 배포하거나 쉘 스크립트를 수행시킬 때 Publish over ssh 플러그인을 사용한다.


배포할 원격지 서버 접속 정보(IP, 계정, PW)를 Jenkins>시스템 설정 > Publish Over SSH에 작성해 놓은 후

각 Job구성에서

4가지를 작성하여 구성한다.


이를 Pipeline으로 선언적 문법으로 쉽게 구성하여본다.

(sshagent 플러그인을 이용한 Jenkins credential을 이용한 ssh커맨드 이용은 선언적 문법에선 지원하지 않는다.)

아래 예제는 gradle을 이용하여 빌드한 war파일과 소스의 config폴더를 war파일명으로 압축하여 원격지 서버 /sorc001/temp로 전송하는 pipeline Jenkinsfile이다.

---

#!groovy
env.warname //war 파일이름
pipeline {
   agent any
   stages {
        /*************** 소스코드 빌드 ******************/
        stage("Build & Test") {
            steps {
                script {
                    sh ("./gradlew build")
                }
            }
        }
        /*************** TAR파일 생성******************/
        stage('make deploy file'){
            steps{
                script{
                    //baseline 커맨드를 이용해 war파일명을 가져온다
                    env.warname = sh (script: 'basename build/libs/*.war .war', returnStdout: true ).trim()
                    echo env.warname

                    //war 파일과 config폴더를 묶어서 압축한다.
                    sh ("mv build/libs/*.war ./")
                    sh ("tar -czvf ${env.warname}.tar.gz *.war ./config")
                    sh ("rm -f *.war")
                }
            }
        }
        /*************** Pulish Over SSH Plug in사용******************/
        stage('SSH transfer') {
            steps([$class: 'BapSshPromotionPublisherPlugin']) {
                sshPublisher(
                    continueOnError: false, failOnError: true,
                    publishers: [
                        sshPublisherDesc(
                            configName: "DEVDEV",//Jenkins 시스템 정보에 사전 입력한 서버 ID
                            verbose: true,
                            transfers: [
                                sshTransfer(
                                    sourceFiles: "${env.warname}.tar.gz", //전송할 파일
                                    removePrefix: "", //파일에서 삭제할 경로가 있다면 작성
                                    remoteDirectory: "/sorc001/temp/" //배포할 위치
                                    execCommand: "ls -al /sorc001/temp/" //원격지에서 실행할 커맨드
  )
                            ]
                        )
                    ]
                )
            }
        }
   }
}