AWS CodeBuild로 빌드 후 S3에 빌드 결과파일 업로드
이번 글에서는 AWS CodeCommit에 있는 스프링부트 소스코드를 AWS CodeBuild를 통해서 빌드를 수행한 후 빌드된 결과파일(아티팩트(JAR))을 S3에 업로드하는 실습을 진행해볼 것이다.
이 글의 순서는 다음과 같다.
- AWS CodeBuild란 무엇인가?
- 사전준비
- AWS CodeBuild 설정
- AWS CodeBuild 테스트
1. AWS CodeBuild란 무엇인가?
AWs CodeBuild란 클라우드의 완전 관리형 빌드 서비스로, 소스코드를 컴파일하고 단위테스트를 실행하며 배포할 준비가 완료된 아티팩트 파일을 생성한다. CodeBuild는 빌드서버를 프로비저닝 및 관리할 필요가 없으며 Maven, Gradle과 같은 널리 사용되는 프로그래밍 언어 및 도구에 맞게 사전 패키지된 빌드 환경을 제공한다.
AWS CodeBuild는 다음과 같은 장점이 있다.
- 빌드 서버를 직접 설정(패치 및 업그레이드 등)하고 관리할 필요가 없다.
- 사전 빌드된 빌드환경을 제공하기 때문에 빌드스크립트 선택 및 작성 후 시작 가능하다.
- 빌드요구사항 충족을 위한 확장/축소가 가능하며 사용한 빌드 시간만큼만 비용을 지불한다
(비용정보 : https://aws.amazon.com/ko/codebuild/pricing/)
2. 사전준비
이번 실습을 수행하기 위해서는 다음과 같은 준비가 되어 있어야 한다.
- AWS CodeCommit 저장소 생성(https://twofootdog.tistory.com/33 참고) 스프링부트 소스 업로드
- AWS S3 생성(https://twofootdog.tistory.com/36 참고)
3. AWS CodeBuild 설정
그럼 AWS CodeBuild 설정을 해보도록 하자. 설정 순서는 우선 1)AWS CodeBuild를 생성한 후 2)프로젝트 소스의 Root 디렉토리에 buildspec.yml파일을 생성하면 된다.
3-1. AWS CodeBuild 생성
AWS 홈페이지에서 [콘솔에 로그인] -> [CodeBuild] -> [빌드 프로젝트 생성]을 선택한다.
[프로젝트 구성]에서 [프로젝트 이름]을 입력한다.
[소스]에서는 [소스 공급자]를 AWS CodeCommit으로 선택하고(AWS CodeCommit의 소스를 빌드할 것이기 때문에),
AWS CodeCommit의 리포지토리를 선택한다. [참조 유형]은 브랜치를 선택하고 [브랜치]는 master 브랜치를 선택하여 master 브랜치에 push된 소스를 빌드하도록 한다.
[환경]에서는 [운영 체제]로 Amazon Linux2를 선택하고, 그 외의 설정은 아래와 같이 선택한다.
[Buildspec]의 [빌드 사양]은 [buildspec 파일 사용]을 선택하고, buildspec 이름을 적는다. 해당 buildspec 파일은 프로젝트 소스(스프링부트) root 디렉토리에 작성할 것이다.
[아티팩트]에서는 빌드 후 생성되는 아티팩트에 대한 설정을 하는 부분으로 [유형]에는 아티팩트 파일이 올라갈 곳을 지정한다. 이 글에서는 Amazon S3를 넣었다.
[버킷 이름]에는 아티팩트가 들어갈 버킷 이름을 적는다.
[경로]에는 버킷 다음 디렉토리 명들을 적는다.
[이름]에는 [아티팩트 패키징] 분류에 따라 다른데, 아티팩트 패키징이 없으면 [경로]다음 디렉토리가 되며 (S3내의 [버킷명]/[경로]/[이름]/XXX.jar 로 파일이 생성된다), 아티팩트 패키징이 zip인 경우는 zip파일명이 된다([버킷명]/[경로]/이름.zip으로 jar파일이 패키징된다)
아티팩트 패키징이 왜 필요한지 codebuild만 공부할 때는 잘 몰랐는데, codedeploy를 할 때 zip이나 tar등으로 패키징 된 아티팩트 파일을 서버로 가져와서 배포를 하기 때문에 S3에 아티팩트를 저장하게 되는 경우 꼭 필요한 것 같다(이건 codedeploy를 공부하게 되면 자연스럽게 이해가 된다).
아티펙트에서 [추가 구성]을 클릭한 후 [캐시 유형]에 Amazon S3를 입력한다. 캐시는 서비스가 빌드 될 때 빌드에 필요한 의존성 파일들(예를 들면 maven dependency 등)을 저장해 놓고 빌드할 때 쓸 수 있게끔 한다.
[로그]에서는 빌드 로그를 CloudWatch와 S3에 적재할 것인지를 선택한다. 해당하는 것을 선택한 후 [빌드 프로젝트 생성] 버튼을 클릭한다.
그러면 다음과 같이 CodeBuild 프로젝트가 생성된다.
3-2. buildspec.yml 생성
다음으로 AWS CodeBuild의 buildspec에서 정의한 buildspec.yml파일을 CodeCommit에 있는 스프링부트 소스 Root 디렉토리에 생성한다.
buildspec.yml :
version: 0.2
phases:
build:
commands:
- echo Build Starting on `date`
- chmod +x ./gradlew
- ./gradlew build
post_build:
commands:
- echo $(basename ./build/libs/*.jar)
- pwd
artifacts:
files:
- build/libs/*.jar
discard-paths: yes
cache:
paths:
- '/root/.gradle/caches/**/*'
buildspec.yml 파일에 대해 간단히 설명하자면
- version : 0.2 권장
- phases.build.commands : 빌드 시 수행되는 명령어. gradlew에 실행권한을 준 후 gradlew build 수행
- phases.post_build step.commands : 빌드 후 수행되는 명령어. build/libs에 있는 jar파일명 화면 출력
- artifacts : 빌드결과파일. [discard-paths]에 yes값을 줘서 해당 빌드결과파일이 s3로 업로드 될 때 [files]에 기술된 path(build/libs)는 무시되고 파일명으로만 업로드 될 수 있도록 한다.
- cache.paths : 이곳의 파일을 S3 cache에 등록. maven의 경우는 '/root/.m2/**/*'
4. AWS CodeBuild 테스트
프로젝트 빌드를 수행하려면 [빌드 시작] 버튼을 클릭한다.
그리고 다음 화면에서도 [빌드 시작] 버튼을 누른다.
빌드를 수행하면 [빌드 상태]가 나오며 [빌드 로그] 확인이 가능하다.
[콘솔에 로그인] -> [S3]에서 버킷을 확인해보면 빌드결과파일(codebuild 디렉토리 내)과 cache 및 log가 생성된 것을 확인할 수 있다. 성공!!
참고
https://jojoldu.tistory.com/282
https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/build-spec-ref.html