젠킨스에서 ECR로 도커 이미지 빌드하기

GwanMtCat·2023년 9월 6일
0

AWS ECR 리포지터리 생성

  • AWS ECR 서비스에 접속해서 리포지터리를 생성하자.

  • 리포지터리 프라이빗으로 선택하고 이름 적고 생성 완료하자.

  • 잘 생성되었다. URI는 리포지터리 선택을 위해 사용되므로 저장해두자.

AWS IAM 으로 그룹 혹은 계정 권한 추가 및 Access Key 생성 및 등록

  • AWS IAM에 다음과 같은 권한을 추가하자.
  • 1번째 줄은 private, 2번째 줄 부터는 public 리포지터리 관련 권한이다.
    • AmazonEC2ContainerRegistryFullAccess
    • AmazonElasticContainerRegistryPublicFullAccess
    • AmazonElasticContainerRegistryPublicPowerUser

  • 사용자 - 보안 자격 증명 - 액세스 키 만들기 를 통해 액세스 키를 생성하자.
    • 생성된 AccessKey 및 Secret 은 사용해야 하므로 보관하자.

  • ID는 젠킨스 pipeline script에서 구분을 위해 사용된다.
  • Access Key, Secret Access Key를 입력하자.

Dockerfile 생성 및 Pipeline 스크립트 작성

  • 이미지 생성을 위한 Dockerfile을 생성하자. (jdk 17기준), 기본적인 템플릿이므로 입맛에 맞게 알아서 추가하자.
FROM eclipse-temurin:17-jre-focal

# user 추가 (m은 홈 디렉토리 생성, s는 사용자가 사용할 쉘 지정)
RUN useradd -ms /bin/bash xeropise
USER xeropise
WORKDIR /home/xeropise
COPY ./build/libs/Nexon-NewName-Auction-Copy.jar app.jar

ENTRYPOINT exec java -jar /home/xeropise/app.jar
  • 프로젝트의 Jenkinsfile 에 script를 추가하자.
pipeline {
  agent any

  tools {
    jdk 'jdk17'
  }

  environment {
    JAVA_HOME = 'tool jdk17'
    IMAGE_NAME = '${env.BRANCH_NAME.replace("/", "_")}_${getGitCommitPretty()}'
  }

  stages {
    stage('checkout') {
      steps {
        checkout scm
      }
    }

    stage('build') {
      steps {
        sh 'java -version'
        sh './gradlew clean build'
      }
    }

    stage('Push image') {
      steps {
        script {
          docker.withRegistry('https://166132032896.dkr.ecr.ap-northeast-2.amazonaws.com', 'ecr:ap-northeast-2:Aws-Accesskey') {
            app = docker.build("166132032896.dkr.ecr.ap-northeast-2.amazonaws.com/new_name_auction")
            app.push("latest_${env.BUILD_ID}")
          }

          sh """docker rmi 166132032896.dkr.ecr.ap-northeast-2.amazonaws.com/new_name_auction:latest_${env.BUILD_ID}"""
        }
      }
    }
  }
}
  • 다음과 같이 Jenkinsfile에 stage를 추가하고 위와 같이 사용하면 된다.
    • docker.withRegistry 함수의 두번째 매개 변수 끝에 AWS AccessKey Credential의 ID를 넣으면 된다.
    • 이미지 생성 후 지워 버리는 것을 잊지 말자.



플러그인을 설치하지 않고 쉘스크립트 파이프라인을 날려서 할 수 없을까요?

  • 가능하다. 방법으로는 여러 방법을 고려할 수 있는데 젠킨스가 서비스 중인 EC2에 AWS CLI와 Docker를 사용하도록 볼륨 설정을 하면 된다.

  • 하지만 AWS CLI의 경우, 도커에 올라와 있으면 Jenkins 이미지에 AWS CLI 혹은 도커를 설치하는 스크립트를 작성하여 그 이미지로 빌드하여야 한다. (귀찮다.. 링크를 확인해봐라 이분이 얼마나 고생을 했는지)

  • 그렇다고 젠킨스 컨테이너에 붙어 직접 설치하려고 하니, 온가지의 권한 문제가 따라와서 날 힘들게 한다. 그래서 위의 방법을 택했다. (덕분에 4시간 헤딩했다.)

0개의 댓글