카테고리 없음

최종 프로젝트 개발6

Zmann 2024. 5. 5. 23:40
728x90

 

 

 

 

필요한 api들을 다 개발해 놓고 시간적 여유가 돼서 jenkins로 ci/cd도 하고 싶어졌다.

 

도커 이미지를 통해 젠킨스를 빌드하고 {vm 주소}:8080으로 접속해 젠킨스 접속을 하였다.

 

 

접속 과정을 남겨놓지 않아서 사진이 없는데 접속 과정에서 docker logs jenkins로 패스워드 값을 복사해 입력해주고 계정 설정과 플러그인 설치를 해야 한다.

 

자바 sdk, git, gradle 환경설정을 해주고 우리는 ec2 환경에서 배포를 하고 있기 때문에 젠킨스를 사용하는 vm과 ec2와의 연결을 위해 ssh rsa 키 설정을 해주어야 된다.

 

docker exec -it jenkins /bin/bash로 들어가 ssh-keygen -t rsa -b 4096 -m PEM으로 키를 생성해 주고

 

cd /root/.ssh
cat id_rsa.pub의 결과를 복사해

 

ec2에 접속하고 cd .ssh로 이동후 vi authorized_keys 파일에 넣어준다.

 

그리고 다시 젠킨스 환경에서 cat id_rsa를 복사해

 

젠킨스 관리 -> credentials로 가서 

 

 

 

설정을 해준다.

 

그리고 이제 파이프라인을 생성해 준다.

 

pipeline {
    agent any
    environment {
        TARGET_HOST = "ubuntu@43.200.136.37"
    }

    stages {
        stage('change directory and manage docker containers') {
            steps {
                sshagent (credentials: ['jenkins-ssh-key']) {
                    script { // script 블록을 steps 블록 내부에 포함
                        // 도커 컨테이너 ID들을 가져와서 dockerContainers 변수에 저장
                        def dockerContainers = sh(script: "ssh -o StrictHostKeyChecking=no ${TARGET_HOST} 'docker ps -aq'", returnStdout: true).trim()
                        // 가져온 도커 컨테이너가 있다면, 해당 컨테이너들을 정지
                        if (dockerContainers) {
                            sh "ssh -o StrictHostKeyChecking=no ${TARGET_HOST} 'docker stop ${dockerContainers}'"
                            sh "ssh -o StrictHostKeyChecking=no ${TARGET_HOST} 'docker rm -f ${dockerContainers}'"
                        }
                        // 도커 이미지 ID들을 가져와서 dockerImages 변수에 저장
                        def dockerImages = sh(script: "ssh -o StrictHostKeyChecking=no ${TARGET_HOST} 'docker images -q'", returnStdout: true).trim()
                        // 가져온 도커 이미지가 있다면, 추가 작업 수행
                        if (dockerImages) {
                            sh "ssh -o StrictHostKeyChecking=no ${TARGET_HOST} 'docker rmi ${dockerImages} -f'"

                        }
                        sh """
                            ssh -o StrictHostKeyChecking=no ${TARGET_HOST} \
                            "cd santa__back && git pull && \

                            docker build -t santa1 . && \
                            docker run -d -p 8080:8080 santa1"
                            """
                    }
                }
            }
        }
    }
}
 

처음에는 이런 식으로 직접 ssh에 명령어를 실행시키는 방식으로 했다.

근데 ec2 환경에서 그냥 저렇게 똑같은 명령어를 쳐서 배포했을 때도 이미지 빌드가 너무 오래 걸리곤 했었는데

젠킨스로 하니 자꾸 ec2가 꺼져서 그냥 Jar를 빌드해 주고 그걸 ec2에 보내 실행시키는 방법으로 바꿨다.

 

pipeline{
agent any


environment{
JAVA_HOME = "/var/jenkins_home/jdk-17.0.2"
BUILD_JAR = "build/libs/santa-0.0.1-SNAPSHOT.jar"
APP_HOST = "ubuntu@43.200.136.37"
// 환경 변수로 AWS 접근 키 및 기타 설정을 관리
AWS_ACCESS_KEY = "비밀"
AWS_SECRET_KEY = "비밀"
AWS_S3_BUCKET = "비밀"
AWS_REGION = "ap-northeast-2"
AWS_STACK_AUTO = "false"
}


stages {
    
    stage('git clone'){
        steps{
            git branch: 'dev', credentialsId: 'gitlab-backend-api-auth', url: 'https://kdt-gitlab.elice.io/cloud_track/class_01/web_project3/team02/santa__back.git'    
        }
    }
    stage('Prepare application-private.properties') {
    steps {
        script {
            // application-private.properties 파일 생성 및 내용 작성
            writeFile file: 'src/main/resources/application-private.properties', text: """\
            cloud.aws.credentials.accessKey=${AWS_ACCESS_KEY}
            cloud.aws.credentials.secretKey=${AWS_SECRET_KEY}
            cloud.aws.s3.bucketName=${AWS_S3_BUCKET}
            cloud.aws.region.static=${AWS_REGION}
            cloud.aws.stack.auto-=${AWS_STACK_AUTO}
            """
        }
    }
}
    stage('build api') { 
	  steps { 
	      sh 'chmod +x ./gradlew'
          sh "./gradlew -Dorg.gradle.java.home=$JAVA_HOME build --warning-mode all" // Gradle 경고 모드 활성화
      }
    }
    stage('deploy'){
        steps {        
            sshagent (credentials: ['jenkins-ssh-key']) {
sh """
    scp -o StrictHostKeyChecking=no ${BUILD_JAR} ${APP_HOST}:~/
    ssh -o StrictHostKeyChecking=no ${APP_HOST} 'ps -ef | grep "[s]anta-0.0.1-SNAPSHOT.jar" | awk '"'"'{print \$2}'"'"' | xargs -r sudo kill'
    ssh -o StrictHostKeyChecking=no ${APP_HOST} 'nohup java -jar ~/"\$(basename ${BUILD_JAR})" > /dev/null 2>&1 &'
"""
             }
        }
    }
    
    }

}

 

 

그러니 빌드가 잘 되고 ec2에서 실행도 잘 됐다.

 

 

 

웹훅 설정도 해주어 push가 있을 시 자동으로 재배포되어 cicd를 마쳤다!!

 

 

728x90