지난 포스팅에서 Spring CI/CD 구축의 첫 단계로 VPC 설정을 하였다.
두번째로 Code Pipeline을 이용하여 깃허브 레포지토리에 푸쉬가 되면 자동으로 빌드하도록 해보려고 한다.
1. Code Pipeline 생성
AWS 파이프라인에서 '파이프라인 생성'을 클릭한다.
따로 추가적인 설정 없이 파이프라인 이름만 입력 후 다음으로 넘어간다.
소스 스테이지에서 소스 공급자를 선택할 수 있다.
여기서는 깃허브 레포지토리 main 브랜치와 연결하였다.
아래 트리거에서 파이프라인을 시작하는 트리거를 설정할 수 있다.
특정 브랜치나 풀요청 여러가지 설정할 수 있지만
여기서는 필터 없음으로 메인 브랜치에 푸시하면 바로 실행되도록 설정하였다.
빌드 스테이지에서 빌드 공급자를 선택할 수 있다.
여기서는 AWS CodeBuild를 이용하였다.
생성한 Codebuild 프로젝트가 없으므로 '프로젝트 생성'을 클릭한다.
액세스할 VPC와 서브넷, 보안 그룹을 설정해준다.
서브넷은 NAT 게이트웨이가 포함한 프라이빗 서브넷을 추가하고, 검증 버튼을 클릭하여 인터넷에 연결되어있는지 확인한다.
프로젝트에 buildspec.yml로 빌드 명령을 실행한다.
[ buildspec.yml ]
version: 0.2
phases:
install:
runtime-versions:
java: corretto17
pre_build:
commands:
- REGION=ap-northeast-2
- REPOSITORY_URI=173796993047.dkr.ecr.ap-northeast-2.amazonaws.com
- IMAGE_NAME=loatodo-main
- IMAGE_TAG=latest
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- BUILD_TAG=${COMMIT_HASH:=latest}
- CONTAINER_NAME=loatodo-main
- echo Logging in to Amazon ECR...
- aws --version
- aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $REPOSITORY_URI
build:
commands:
- echo Start gradle bootJar...
- ./gradlew clean bootJar
- echo End gradle bootJar...
- echo Start Docker image build...
- docker build -t $REPOSITORY_URI/$IMAGE_NAME:$IMAGE_TAG .
- docker tag $REPOSITORY_URI/$IMAGE_NAME:$IMAGE_TAG $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG
- echo End Docker image build...
post_build:
commands:
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI/$IMAGE_NAME:$IMAGE_TAG
- docker push $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG
- printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG > imagedefinitions.json
- cat imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
여기서 REPOSITORY_URI가 필요한데 ECR에서 생성 할 수 있다.
그 후 프로젝트를 생성하면 아까봤던 빌드 스테이지에 추가된다.
그 후 배포 스테이지로 넘어간다.
여기서는 아까 ECR에 올렸던 도커 이미지를 ECS로 실행할 예정이지만
아직 ECS를 만들지 않았으니 '배포 스테이지 건너뛰기'를 클릭한다.
그 후 파이프 라인을 생성한다.
2. Code Pipeline 빌드 실패
생성 후 바로 Source를 가져와서 빌드를 하면 아마 빌드가 실패할 것이다.
세부 정보를 보고 로그를 확인해보면
이렇게 ECR에 접근권한이 없다고 나온다.
그래서 접근권한을 추가해줘야 한다.
코드 빌드로 들어가서 서비스 역할을 클릭한다.
그후 베이스 정책 권한을 살펴보면
로그 빌드 S3에 대한 권한은 있지만 ECR에 대한 권한은 없다.
편집을 눌러서 아래 내용을 추가해준다.
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:GetAuthorizationToken",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "*"
}
그 후 Code Pipeline을 다시 실행한다.
빌드 성공!