Backend · Infra

[Jenkins] pipeline 작성하기

devhyen 2024. 8. 5. 14:05
👑 목차 🎀
    반응형
    📌 이 글은 Docker & 배포 자동화 시리즈 중 하나입니다.

    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) 가 커밋만 하면 자동으로 진행되도록 된 것,, 

     

     

    반응형