AWS에서 CI/CD 환경 구성 #3 - 코드 빌드, CodeBuild
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을 구성하는 방법을 살펴보겠습니다.