개발일기

Jenkins 빌드를 통한 S3 bucket jar 파일 업로드 본문

서버 & 클라우드

Jenkins 빌드를 통한 S3 bucket jar 파일 업로드

한둥둥 2025. 5. 19. 11:36

 

목표 :) Jenkins build를 사용하여 bucket에 Jar파일을 업로드한다. Auto Scaling이 되어있는 템플릿 ec2 서버에 jar 파일을 마운트하여 각각의 jar파일들을 EC2에 생성된다. 그 후, ec2 생성 시, jar파일을 빌드되게 만들어준다. 구동 후 응답 받은 값이 특정 상태 값이면 Auto Scaling 통해서 띄워준 서버를 테라폼을 통해서 ec2 서버를 끈다. << 이 때, ec2 서버를 생성하고 삭제하는 방법은 바뀔 수 있다. 

 

준비 과정 :) 

Jenkinsfile 생성 전, 준비 과정 

1. 중요한 값들이나 변경사항이 있는 부분들은 Jenkins 설정을 통해서 json 변수로 넣어준다. 

2. 멀티 모듈이기에 각각의 서비스에 따른 빌드를 해주기 위한 스크립트를 작성해준다. 

3. aws bucket접근하기 위해서 aws credential 설정을 해준다.  

이 때, credential plugin을 사용하면 편하겠지만, 제약사항 때문에 credential plugin을 사용하지 못하여 withEnv 에서 작성하여 해결하였다. 

4. aws credential 설정이 완료되면 해당 jar파일을 bucket에 업로드 해준다. 

이 때, 패키지 경로는 buildNumber로 구분된다. 파일 이름 뒤에 buildNumber를 추가 할 지 말지 결정은 추후에 할 예정이다. 

 

pipeline {
  agent any

  stages {

    stage('환경변수 설정') {
      steps {
        script {
          def json = new groovy.json.JsonSlurper().parseText(params.MY_JSON_PARAM)

          json.each { key, value ->
            env."${key}" = value.toString().trim()
            echo "✅ 설정된 변수: ${key} = ${env."${key}"}"
          }
        }
      }
    }

    stage('start') {
      steps {
        script {
          def requiredVars = ['BUCKET_DIR', 'TYPE', 'JAR_DIR', 'AWS_DEFAULT_REGION']

          requiredVars.each { varName ->
            if (!env."${varName}") {
              error("❌ 필수 환경변수 누락: ${varName}")
            } else {
              echo "✅ 변수 확인 완료: ${varName} = ${env."${varName}"}"
            }
          }

          echo "✅ 모든 필수 환경 변수가 설정되었습니다."
        }
      }
    }

    stage('빌드') {
      steps {
        script {
          def projectDir = "iros-api-${env.TYPE}"
          echo "[빌드 시작] 경로: ${projectDir}"

          dir(projectDir) {
            def result = sh(script: './gradlew clean build', returnStatus: true)

            if (result == 0) {
              echo "⚡️ 빌드 성공"
              def jarPath = sh(script: "ls -1 build/libs/*.jar", returnStdout: true).trim()
              echo "📦 생성된 JAR 파일 경로: ${jarPath}"
              def jarName = jarPath.tokenize('/')[-1];

              echo "jarName: ${jarName}"
              echo "s3 업로드 중"

              def bucketAccessKey = env.BUCKET_ACCESS_KEY_ID
              def bucketSecretKey = env.BUCKET_SECRET_ACCESS_KEY

              withEnv([
                "AWS_ACCESS_KEY_ID=${bucketAccessKey}",
                "AWS_SECRET_ACCESS_KEY=${bucketSecretKey}",
                "AWS_DEFAULT_REGION=${env.AWS_DEFAULT_REGION}"
              ]) {
                echo "현재 빌드 번호는 #${env.BUILD_NUMBER} 입니다."
                def bucketPath = "${env.BUCKET_DIR}/${env.BUILD_NUMBER}/${jarName}";
                sh """
                    aws s3 cp ${env.JAR_DIR} ${bucketPath} --region ap-northeast-2
                   """
                echo "s3 업로드 완료 "
              }
            } else {
              error "❌ 빌드 실패 (exit code: ${result})"
            }
          }
        }
      }
    }

  }
}

 

 

Jenkins 빌드를 통해 정상적으로 jar파일이 업로드되고 있다.