CodeBuild란?
AWS CodeBuild란, 클라우드 상의 완전 관리형 빌드 서비스이다. CodeBuild에서는 자체 빌드 서버를 프로비저닝, 관리 및 확장할 필요가 없다. AWS의 CI(Continuous Integration) 서비스라고 보면 된다.
CodeBuild 작동 방식
CodeBuild는 다음 그림과 같이, 소스 공급자에 소스가 업로드되면 CodeBuild가 알아서 소스를 가져와 빌드를 진행한다. 그리고 빌드가 완료되면 아티팩트(빌드 결과물)를 아티팩트 저장소에 저장한다.
CodeBuild에서 지원하는 소스 공급자는 다음과 같다.
- Amazon S3
- AWS CodeCommit
- Github
- BitBucket
- Github Enterprise
CodeBuild가 빌드 환경에 소스 코드를 다운로드한 다음, buildspec(build specification)을 사용하게 된다. buildspec이란 빌드를 실행하는 데 사용하는 yaml 형식의, 빌드 명령 및 관련 설정 모음이다.
정리하자면 buildspec.yaml
이란, CodeBuild가 수행할 작업들을 yaml 형식으로 작성한 파일이라고 보면 된다.
아티팩스 저장소는 Amazon S3를 선택하거나 선택하지 않을 수 있다.
선택하지 않는 경우는, 빌드 후 절차에서 ECR에 저장하거나 단순 빌드 테스트하는 목적일 수 있다.
AWS CodeBuild Overview
Hands On!
이번 포스팅에서는 소스 공급자를 Github으로 하고,
Docker Image를 빌드한 뒤 ECR까지 푸시하는 것까지 진행해본다.
Github -> CodeBuild -> ECR
ECR
가장 먼저, 이미지를 저장할 ECR 리포지토리를 생성한다.
CodeBuild
ECR에 이미지를 푸시할 것이기 때문에, 별도로 아티팩트 저장소(S3)는 생성하지 않는다.
buildspec.yaml
을 작성하기 전에, buildspec에 조금 더 알아보자.
- buildspec은 단계(phase) 별로 원하는 명령을 입력한다.
- phase에는 install, pre_build, build, post_build가 있다.
- 모든 단계가 필수적인 것은 아니며, 목적에 따라 구분하여 작성한다.
- install : 빌드 전에 필요한 환경을 설치한다.
- pre_build : 빌드 전에 수행할 명령을 입력한다.
- build : 빌드를 수행할 명령을 입력한다.
- post_build : 빌드 후에 수행할 명령을 입력한다.
위의 사항을 숙지했다면, 이제 buildspec.yaml
을 작성해보자.
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
- 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
pre_build
: ecr에 로그인build
: docker image 빌드, image이름은 commit hash가 되도록 설정해주었다.post_build
: ecr에 이미지 푸시
이렇게 작성한 buildspec.yaml
은 소스 공급자 코드에 포함되어야 한다.
다음으로 CodeBuild 프로젝트를 생성한다.
글쓴이는 [소스 공급자]로 Github을 선택하였고, OAuth 방식을 통해 연결해주었다.
OAuth 방식을 사용하려면 [Github에 연결] 버튼을 눌러, 새로 뜬 창에서 Github 로그인을 해주면 된다.
그리고 사용하려는 레포지토리를 선택한다.
그 후, 각자 환경에 맞게 빌드 환경을 설정하면 된다.
이때, docker image를 빌드하기 위해 [권한이 있음] 부분을 꼭 체크해줘야한다.
buildspec.yml
을 작성했디 때문에 [buildspec 파일 사용]을 선택하고, 글쓴이는 루트 디렉토리에 파일이 있기 때문에 [Buildspec 이름]은 넘어간다. 루트 디렉토리가 아니라면, 경로를 적어주면 된다.
다음으로 buildpspec.yml
에 필요한 환경 변수를 설정해주자.
총 3가지 환경 변수 설정이 필요하다. 사용자의 환경에 맞게 세팅해준다.
AWS_ACCOUNT_ID
AWS_DEFAULT_REGION
IMAGE_REPO_NAME
다음으로 CodeBuild 권한을 수정해주자.
ECR에 이미지를 push해야하기 때문에, CodeBuild가 ECR에 접근할 수 있도록 권한을 부여해줘야한다.
새로 생성된 CodeBuild 역할에 AmazonEC2ContainerRegistryFullAccess
권한을 연결해준다.
Build Project
이제 빌드를 진행해보자!
[빌드 시작] 버튼을 누르고, 시간이 지나서 성공함을 확인할 수 있고,
ECR 리포지토리에서도 이미지가 업로드되어있는 것을 확인할 수 있다.
Reference