[AWS] CodeBuild 완벽 가이드: CI/CD 빌드 자동화의 모든 것 (buildspec.yml 포함)
소프트웨어 개발의 속도와 품질을 높이는 것은 모든 개발팀의 중요한 목표입니다. 이를 위해 지속적 통합(Continuous Integration, CI)과 지속적 배포(Continuous Deployment, CD)는 현대 개발 워크플로우의 핵심 요소로 자리 잡았습니다. AWS 생태계에서 이러한 CI/CD 파이프라인 구축을 돕는 강력한 서비스 중 하나가 바로 AWS CodeBuild입니다.
이번 포스팅에서는 CodeBuild가 무엇이며, 어떤 주요 기능과 기대 효과를 제공하는지, 그리고 핵심 구성 요소인 buildspec.yml
파일에 대해 자세히 알아보겠습니다.
1. AWS CodeBuild란 무엇일까요? 핵심 개념 이해하기
AWS CodeBuild는 개발자가 소스 코드를 컴파일하고, 테스트를 실행하며, 배포 가능한 소프트웨어 패키지를 생성하는 과정을 자동화하는 완전 관리형 빌드 서비스입니다. "완전 관리형"이라는 말은 개발자가 빌드 서버를 프로비저닝하거나, 소프트웨어를 설치하고, 확장하거나, 패치를 적용하는 등의 인프라 관리에 신경 쓸 필요가 없다는 의미입니다.
CodeBuild는 빌드 요청량에 따라 필요한 컴퓨팅 자원을 자동으로 확장 및 축소합니다. 덕분에 여러 빌드를 동시에 처리할 수 있어, 빌드 대기 시간을 줄이고 개발 생산성을 크게 향상시킵니다. 또한, AWS Key Management Service(KMS)를 통해 빌드 아티팩트(결과물)를 암호화하고, AWS Identity and Access Management(IAM)을 통해 서비스 접근 권한을 세밀하게 제어하여 보안성을 강화합니다.
2. CodeBuild의 매력 포인트: 주요 기능과 기대 효과
CodeBuild는 개발자에게 다양한 이점을 제공하며, 주요 기능과 그로 인한 기대 효과는 다음과 같습니다.
2.1. 유연한 빌드 환경
AWS가 제공하는 사전 패키징된 빌드 환경(Java, Python, Node.js, Ruby, Go, Android, .NET Core, Docker 등 다양한 런타임 지원)을 사용하거나, Docker 이미지를 활용하여 필요한 소프트웨어나 도구가 포함된 맞춤형 빌드 환경을 구성할 수 있습니다. 이를 통해 프로젝트의 특정 요구사항에 정확히 부합하는 환경에서 빌드를 실행할 수 있습니다.
2.2. 강력한 빌드 제어 (buildspec.yml)
CodeBuild의 핵심은 buildspec.yml
파일입니다. 이 YAML 형식의 파일에 빌드 각 단계에서 실행할 명령어, 환경 변수, 빌드 결과물(아티팩트) 처리 방법 등을 상세히 정의할 수 있습니다. 개발자는 이 파일을 통해 빌드 프로세스를 완벽하게 제어하고 자동화할 수 있습니다. (자세한 내용은 아래에서 다룹니다.)
2.3. CI/CD 파이프라인의 핵심
CodeBuild는 AWS CodeCommit, Amazon S3, GitHub, Bitbucket 등 다양한 소스 코드 리포지토리와 손쉽게 연동됩니다. 특히 AWS CodePipeline과 통합하면 코드 변경 시 자동으로 빌드 및 배포 파이프라인을 구축하여 진정한 CI/CD 환경을 구현할 수 있습니다. 이를 통해 개발자는 코드 변경 사항을 더욱 빠르고 안정적으로 프로덕션 환경에 배포할 수 있습니다.
2.4. 빌드 모니터링 및 알림
빌드 진행 상황, 성공/실패 여부, 로그 등의 상세 정보를 AWS Management Console, AWS CLI, SDK를 통해 실시간으로 확인할 수 있습니다. Amazon CloudWatch Logs와 연동되어 빌드 로그를 중앙에서 관리하고 분석하는 것도 용이하며, 빌드 상태 변경에 따른 알림(예: Amazon SNS) 설정도 가능합니다.
3. 빌드의 청사진: buildspec.yml 파헤치기
buildspec.yml
파일은 CodeBuild가 빌드 프로젝트를 어떻게 실행해야 하는지 알려주는 설계도와 같습니다. 이 파일은 일반적으로 소스 코드 리포지토리의 루트 디렉터리에 위치시키거나, CodeBuild 프로젝트 설정 시 직접 내용을 입력할 수도 있습니다.
buildspec.yml
파일의 주요 구성 요소와 각 단계(phase)의 역할은 다음과 같습니다.
version: 0.2 # buildspec 파일의 버전
env: # 환경 변수 설정
variables:
MY_VARIABLE: "my_value"
parameter-store:
LOGIN_PASSWORD: "/CodeBuild/dockerLoginPassword"
phases:
install:
runtime-versions: # 특정 런타임 버전 명시 (예: nodejs, python)
nodejs: 18
commands:
- echo "설치 단계: 필요한 패키지나 의존성을 설치합니다."
- npm install
pre_build:
commands:
- echo "빌드 전 단계: 사전 검사, 로그인, 환경 설정 등을 수행합니다."
- $(aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com)
build:
commands:
- echo "빌드 단계: 소스 코드를 컴파일하고 테스트를 실행합니다."
- npm run build
- npm run test
post_build:
commands:
- echo "빌드 후 단계: 아티팩트 패키징, Docker 이미지 푸시 등을 수행합니다."
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker push $IMAGE_REPO_NAME:$IMAGE_TAG
artifacts:
files:
- 'dist/**/*' # S3 등으로 업로드할 아티팩트 파일 또는 디렉터리 지정
- 'appspec.yml'
discard-paths: yes # 아티팩트 경로에서 files에 명시된 경로를 제외하고 저장
base-directory: 'dist' # 아티팩트의 기본 디렉터리 (files 경로의 기준)
cache:
paths: # 빌드 간 캐싱하여 속도를 높일 경로 (예: node_modules)
- 'node_modules/**/*'
각 구성 요소에 대한 간략한 설명입니다.
3.1. version
buildspec.yml
파일의 스키마 버전을 나타냅니다. 현재 권장되는 버전은 0.2
입니다.
3.2. env
빌드 과정 전반에 걸쳐 사용될 환경 변수를 정의합니다.
variables
: 직접 키-값 쌍으로 환경 변수를 설정합니다.parameter-store
: AWS Systems Manager Parameter Store에 저장된 파라미터를 환경 변수로 가져와 사용합니다. (보안 정보 관리에 유용)
3.3. phases
빌드 과정을 여러 단계로 나누어 각 단계에서 실행할 명령어를 정의합니다.
install
: 빌드 환경에 필요한 패키지 설치나 런타임 구성 등 환경 설정 관련 명령을 실행합니다. (예:npm install
,pip install
)pre_build
: 실제 빌드 전에 실행되어야 하는 명령들을 포함합니다. (예: 코드 정적 분석, Docker 레지스트리 로그인, 종속성 확인)build
: 소스 코드 컴파일, 단위 테스트 실행 등 핵심적인 빌드 작업을 수행합니다.post_build
: 빌드가 완료된 후 실행되는 명령들입니다. (예: 빌드 결과 패키징, Docker 이미지 생성 및 푸시, 통합 테스트 실행)
3.4. artifacts
빌드 결과물(아티팩트)을 어떻게 처리할지 정의합니다.
files
: S3 버킷 등에 업로드할 파일이나 디렉터리 패턴을 지정합니다.discard-paths
: 아티팩트 경로에서files
에 명시된 경로를 제외하고 저장할지 여부를 결정합니다.base-directory
:files
에 지정된 경로의 기준이 되는 디렉터리를 설정합니다.
3.5. cache
빌드 속도를 높이기 위해 특정 파일이나 디렉터리(예: node_modules
, .m2
)를 S3에 캐싱하여 다음 빌드에서 재사용하도록 설정합니다.
이처럼 buildspec.yml
파일을 통해 개발자는 복잡한 빌드 프로세스도 체계적으로 관리하고 자동화할 수 있습니다.
4. CodeBuild, 언제 사용하면 좋을까요?
AWS CodeBuild는 다음과 같은 다양한 시나리오에서 유용하게 활용될 수 있습니다.
- 자동화된 빌드 및 테스트: 소스 코드 변경이 발생할 때마다 자동으로 코드를 빌드하고 단위 테스트 및 통합 테스트를 실행하여 코드 품질을 지속적으로 관리하고 싶을 때.
- 서버리스 CI 환경 구축: 빌드 서버를 직접 구축하고 관리하는 데 드는 시간과 노력을 줄이고, 사용한 만큼만 비용을 지불하는 효율적인 CI 환경을 원할 때.
- AWS 서비스와의 긴밀한 통합: AWS CodeCommit, CodePipeline, S3, Amazon ECR(Elastic Container Registry) 등 다른 AWS 서비스와 원활하게 통합되는 빌드 시스템이 필요할 때.
- 컨테이너 이미지 빌드 및 관리: Docker 컨테이너 이미지를 빌드하고 Amazon ECR과 같은 컨테이너 레지스트리에 안전하게 푸시해야 할 때.
- 다양한 프로그래밍 언어 및 프레임워크 지원: 프로젝트에서 사용하는 프로그래밍 언어나 프레임워크에 구애받지 않고 유연하게 빌드 환경을 구성하고 싶을 때.
5. 마무리하며
AWS CodeBuild는 개발자가 인프라 관리에 대한 부담 없이 오롯이 코드 품질 향상과 빠른 기능 출시에 집중할 수 있도록 돕는 강력한 서비스입니다. buildspec.yml
을 통한 정교한 빌드 제어, 다양한 AWS 서비스와의 통합, 자동 확장성 등은 개발 생산성을 크게 높여줍니다.
S3 정적 웹사이트 구현을 포함하여 다양한 애플리케이션 개발 및 배포 파이프라인에서 CodeBuild를 활용한다면, 더욱 빠르고 안정적이며 효율적인 개발 워크플로우를 경험할 수 있을 것입니다. 이 글이 AWS CodeBuild를 이해하는 데 도움이 되었기를 바라며, 직접 경험해 보시는 것을 추천합니다!