CICD

Jenkins - EC2 자동 배포 연동 설정

라구엘 2023. 8. 9. 13:37

1.  초기 설정

 

1-1. 왼쪽 상단위 Jenkins 관리 클릭

1-2. System Configuration - 시스템 설정 클릭

1-3. ssh 키가 존재할 시 해당 부분 입력

 

1-4. 6번에 필요한 configName에 필요한 변수 생성

 

1-5. 6번에 필요한 deploy.sh 생성

 

1-6. Security - Credentails 클릭

1-7. Credentails 생성

 

2. 왼쪽 상단 위 - 새로운 Item 클릭

3. Item 이름 배정 후 'PipeLine' 선택 create

4. 새로 생성한 item 접속 후 - 왼쪽상단 '구성' 버튼 클릭

5. 설정

 

5-1. 체크

- Do not allow concurrent builds

- Do not allow the pipeline to resume if the controller restarts

5-2. webhook을 받고싶으면 해당 URL 입력

5-3. 매개변수 사용 시 체크

6. PipeLine 입력

 

6-1. maven 방식 PipeLine

pipeline {
    agent any
    parameters {
        gitParameter branchFilter: 'origin/(.*)', defaultValue: 'main', name: 'BRANCH', type: 'PT_BRANCH', sortMode: 'DESCENDING_SMART'
    }
    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "MAVEN-3.9.1"
    }

    stages {
        /*************** 소스코드 Pull And Build ******************/
        stage('Git Pull && Build') {
            steps {
                // Get some code from a GitHub repository
                git branch: "${params.BRANCH}", credentialsId:'{credentialsId적기}', url:'{브랜치 적기}'
                
                // Run Maven on a Unix agent.
                sh "mvn -Dmaven.test.failure.ignore=true -P prod clean package"
            }
        }
        /*************** TAR 파일 생성******************/
        stage('Make Deploy File'){
            steps{
                script{
                    //baseline 커맨드를 이용해 war파일명을 가져온다
                    env.warname = sh (script: 'basename target/*.war .war', returnStdout: true ).trim()
                    echo env.warname

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

 

6-2. gradle 방식 PipeLine

pipeline{
    agent any
    parameters {
        gitParameter branchFilter: 'origin/(.*)', defaultValue: 'main', name: 'BRANCH', type: 'PT_BRANCH', sortMode: 'DESCENDING_SMART'
    }
    tools{
        gradle 'Gradle_8.1.1'
    }
    environment{
        TARGET_HOST = "{ec2_host적기}"
        JAR_NAME = "{jar파일 이름 적기}"
    }
    stages{
        stage('Clone'){
            steps {
                git credentialsId: '{credentialsId 적기}',
                    url: '{git url 적기}', 
                    branch: "${params.BRANCH}"
            }
            post {
                failure {
                    echo 'Repository Clone Failed'
                }
                success {
                    echo 'Repository Clone Successed'
                }
            }
        }
        stage('Build') {
            steps {
                sh 'chmod +x gradlew'
                sh './gradlew clean bootJar'
                sh 'cp ./build/libs/${JAR_NAME} ./'
                
            }
            post {
                failure {
                    echo 'Gradle jar build failed'
                }
                success {
                    echo 'Gradle jar build successed'
                }
            }
        }
        stage('Deploy') {
            steps([$class: 'BapSshPromotionPublisherPlugin']) {
                
                sshPublisher(
                    continueOnError: false, failOnError: true,
                    publishers: [
                        sshPublisherDesc(
                            configName: "ssh.jenkins-test-gradle",//Jenkins 시스템 정보에 사전 입력한 서버 ID
                            verbose: true,
                            transfers: [
                                sshTransfer(
                                    sourceFiles: "${JAR_NAME}" , //전송할 파일
                                    removePrefix: "", //파일에서 삭제할 경로가 있다면 작성
                                    remoteDirectory: "/home/ubuntu/service/deploy/", //배포할 위치
                                    execCommand: "cd /home/ubuntu/service/deploy && ./deploy.sh" //원격지에서 실행할 커맨드
                                )
                            ]
                        )
                    ]
                )
            }
        }
    }
}