Server

[Jenkins] pipeline 작성하기

devhyen 2024. 8. 5. 14:05

1. svn 프로젝트 가장 상위 폴더에 Jenkinsfile 이라는 파일을 만든다. 

 

2. 파이프라인 코드를 작성한다. 

pipeline {
    agent any
    tools {
        maven 'maven-3.6.3'
        jdk 'java-1.8'
    }
    stages {
        stage('Checkout') {
            steps {
                echo 'Checking out from SVN...'
            }
        }

        stage('Build') {
            steps {
                echo 'Building...'
                // Use credentials with username and password
                    withCredentials([usernamePassword(credentialsId: 'svn',
                                                      usernameVariable: 'SVN_USERNAME',
                                                      passwordVariable: 'SVN_PASSWORD')]) {
                        sh '''
                        svn upgrade

                        # 빌드 스크립트에 실행 권한 추가
                        chmod +x ./build.sh

                        # build.sh 스크립트 실행
                        ./build.sh 8000

                        '''
                        // 또는 다른 명령어에서 사용
                    }
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                // 실제 테스트 명령어 추가
            }
        }
         stage('Deploy') {
                    steps {
                        script {
                            withCredentials([usernamePassword(credentialsId: 'deployserver',
                                                                                  usernameVariable: 'DS_USERNAME',
                                                                                  passwordVariable: 'DS_PASSWORD')]) {


                                def remote = [:]
                                remote.name = // 호스트 이름
                                remote.host = // 호스트 주소
                                remote.user = DS_USERNAME
                                remote.password = DS_PASSWORD
                                remote.allowAnyHosts = true

                                // ZIP 파일 경로를 변수에 저장
                                def zipFilePath = sh(script: 'ls /var/lib/jenkins/workspace/pipeline/*.zip', returnStdout: true).trim()
                                def zipFileName = zipFilePath.tokenize('/').last()

                                echo "전체 파일 경로: ${zipFilePath}"
                                echo "파일명: ${zipFileName}"

                                sh "cp ${zipFilePath} '/home/jenkins_package'"

                                // ZIP 파일을 원격 서버의 폴더로 업로드
                                sshPut remote: remote, from: '/home/jenkins_package/'+zipFileName, into: '/home/jenkins_package'

                                echo "업로드 완료"
                            }
                        }
                    }
                }
    }
}

 

이렇게 하면 동적으로 생성된 zip 파일을 sftp 업로드 할 수 있다. 

 

3. Jenkins 셋팅 

커밋한 후 

Jenkins 에서 새로운 아이템 > pipeline 으로 생성해준다. 

 

Pipeline에서 Definition을 Pipeline script from SCM 으로 하고, 

Subversion을 선택한 후 

 

Script Path를 Jenkinsfile으로 하면 된다. 

 


아쉬운 점 

배포까지 자동화 하고 싶지만, 

보안상 root계정으로는 ssh로 접속할 수 없다. 

배포 서버에서 root계정으로 들어가서 배포하는 부분은 수동으로 하게 되었다. 

 

기존에는 1)빌드서버에서 빌드 -> 2)배포서버로 옮김 -> 3)배포서버에서 배포 이런 과정이라면 

1), 2) 가 커밋만 하면 자동으로 진행되도록 된 것,,