AWS에서 CodeBuild 서비스를 활용하여 소스코드를 빌드하는 방법을 알아보겠습니다.

사전 준비

ECR(Elastic Container Registry) 생성

  • ECR Console에 접속 > 메인 화면 > 리포지토리 생성 버튼 선택

  • 리포지토리 이름 cicd-demo 입력 > 리포지토리 생성 버튼 선택

    생성한 cicd-demo 리포지토리를 CodeBuild 서비스에서 사용합니다.

IAM 정책 생성

CodeBuild에서 ECR에 접근하기 위한 정책을 생성합니다.

  • IAM Console에 접속 > 왼쪽 메뉴 > AWS Account > 정책 선택

  • 메인 화면 > 정책 생성 버튼 선택

  • 정책 생성 화면 > JSON 탭 선택 > 정책 내용 입력(아래 코드 참고) > 정책 검토 버튼 선택

      {
          "Statement": [
              {
                  "Action": [
                      "ecr:BatchCheckLayerAvailability",
                      "ecr:CompleteLayerUpload",
                      "ecr:GetAuthorizationToken",
                      "ecr:InitiateLayerUpload",
                      "ecr:PutImage",
                      "ecr:UploadLayerPart"
                  ],
                  "Resource": "*",
                  "Effect": "Allow"
              }
          ],
          "Version": "2012-10-17"
      }
    

  • 정책 이름을 CodeBuildECRPolicy-cicd-demo-ap-northeast-2로 입력 > 정책 생성 버튼 선택

BuildSpec 파일 생성

CodeBuild 서비스를 통하여 소스코드를 빌드하기 위해서 소스코드의 repository에 buildspec.yml 파일을 생성해야합니다.

아래와 같은 buildspec.yml 파일을 CodeCommit에 생성한 cicd-demo 저장소 root에 생성합니다.

<buildspec.yml>
version: 0.2 
 
phases: 
  install: 
    runtime-versions: 
      java: openjdk8 
      docker: 18 
  pre_build: 
    commands: 
      - echo Logging in to Amazon ECR... 
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION) 
  build: 
    commands: 
      - echo Build started on `date` 
      - echo Building the Docker image...    
      - mvn clean package        
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . 
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG 
  post_build: 
    commands: 
      - echo Build completed on `date` 
      - echo Pushing the Docker image... 
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG 
cache: 
  paths: 
    - '/root/.m2/**/*' 
  • phase.install : Java SDK, Docker CLI를 설치
  • phase.pre_build : ECR 서비스에 로그인
  • phase.build : Maven 및 Docker 빌드
  • phase.post_build : Docker 이미지를 ECR에 push
  • cache.paths(선택): 소스코드 빌드에 사용하는 파일을 cache하는 경우 위치

$AWS_DEFAULT_REGION와 같은 환경 변수는 CodeBuild 프로젝트 구성 과정에서 설정합니다.

Docker 파일 생성

Docker 이미지를 빌드하기 위해서 소스코드의 repository에 Dockerfile을 생성해야합니다.

아래와 같은 Dockerfile을 CodeCommit에 생성한 cicd-demo 저장소 root에 생성합니다.

<Dockerfile>
FROM openjdk:8-jdk-alpine
ADD target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

CodeBuild 프로젝트 구성

이제 CodeBuild 프로젝트를 구성하는 방법을 알아보겠습니다.

빌드 프로젝트 생성

먼저 프로젝트를 생성합니다.

  • CodeBuild 콘솔에 접속 > 왼쪽 메뉴의 빌드 > 프로젝트 빌드 선택
  • 메인 화면 > 빌드 프로젝트 생성 버튼 선택

프로젝트 설정

이제 프로젝트 정보를 설정합니다.

  • 프로젝트 이름 cicd-demo 입력
  • 빌드 배지 활성화 체크

소스

  • 소스 공급자 AWS CodeCommit 선택
  • 리포지토리 cicd-demo 선택

환경

이미지
  • 환경 이미지 > 관리형 이미지 선택
  • 운영 체제 > Ubuntu 선택 선택
  • 런타임 > Standard 선택
  • 이미지 > aws/codebuild/standart:2.0 선택
  • 이미지 버전 > 이 런타임 버전에 항상 최신 이미지 사용 선택
  • 권한이 있음 체크

역할
  • 서비스 역할 > 새 서비스 역할 선택
  • 역할 이름 codebuild-cicd-demo-service-role 입력

추가 구성
  • 추가 구성 메뉴 확장 > 환경 변수 입력

  • 환경 변수 이름, 값 설명

    이름
    AWS_DEFAULT_REGION 리전 이름
    AWS_ACCOUNT_ID 계정 아이디
    IMAGE_REPO_NAME ECR 이름
    IMAGE_TAG Docker 이미지 태그 이름

Build Spec

  • 빌드 사양 > buildspec 파일 사용 선택

아티팩트

  • 유형 > 아티팩트 없음 선택

로그

  • 유형 > CloudWatch 로그 선택
  • 빌드 프로젝트 생성 버튼 선택

CodeBuild 역할과 정책 연결

빌드 프로젝트 생성이 완료되면 CodeBuild용 IAM 역할이 생성됩니다.

이 역할에 사전 준비에서 생성한 정책을 연결합니다.

  • IAM Console에 접속 > 왼쪽 메뉴 > AWS Account > 역할 선택

  • 메인 화면 > 검색 창 > codebuild 입력 > codebuild-cicd-demo-service-role 선택

  • 권한 탭 > 정책 연결 버튼 선택

  • 정책 필터 > codebuild 입력 > CodeBuildECRPolicy-cicd-demo-ap-northeast-2 선택 > 정책 연결 버튼 선택

CodeBuild 시작

  • CodeBuild 콘솔에 접속 > 왼쪽 메뉴의 빌드 > 프로젝트 빌드 선택

  • 메인 화면 > cicd-demo 프로젝트 선택 > 빌드 시작 버튼 선택

  • 빌드가 성공적으로 종료되면 상태가 성공함으로 변경됩니다

  • ECR의 cicd-demo 저장소에 접속해보면 새로운 이미지가 생성되어 있습니다.

CodeBuild 캐시 설정(선택)

위에서 빌드 결과를 보면 빌드에 소요된 시간이 14분 55초로 다소 오래 걸립니다.

빌드 기록을 선택해 상세보기 페이지로 이동한 후 단계 세부 정보를 확인해보면 BUILD 단계에서 14분이 소요된 것을 확인할 수 있습니다.

빌드 로그 탭을 선택해 로그를 확인해보면 Maven Build를 하기 위해 의존성 라이브러리를 다운로드하는데 많은 시간이 소요되는 것을 확인할 수 있습니다.

CodeBuild 서비스에서는 소스코드를 빌드하기 위한 파일을 한번만 다운받고 이 후에는 다시 받지 않도록 캐시 옵션을 설정할 수 있습니다.

  • CodeBuild Console에 접속 > 빌드 > 프로젝트 빌드 > cicd-demo 선택 > 빌드 세부 정보 탭 선택

  • 아티팩트 > 편집 버튼 선택

  • 추가 구성 메뉴 확장 > 캐시 유형 Amazon S3 선택 > 캐시 버킷 선택(S3 콘솔에서 생성)

설정을 완료한 후 다시 빌드를 시작합니다. 빌드가 완료된 후 기록을 보겠습니다. 아래와 같이 기존 14분 55초에서 1분 54초로 빌드 시간이 단축되었습니다.

단계 세부 정보를 확인해보면 BUILD 단계가 기존 14분에서 1분으로 단축되었습니다.

다음으로 AWS에서 CI/CD 환경 구성 #4 - 파이프라인 구성(Rolling Update), CodePipeline 문서에서 파이프라인 서비스인 CodePipeline을 구성하는 방법을 살펴보겠습니다.