Skip to content

Publishing Docker images - AWS CodeBuild

개발 빌드 환경 구성 및 Container 빌드 자동화 실습

CodeBuild를 통해 코드의 Pull Request가 일어나면 도커 빌드 및 레지스트리에 이미지 등록 자동화 실습

Time to Complete: 2-3 hours

Tutorial Prereqs:

System Architecture

ci system architecture

1. Create an AWS CodeBuild Project

Make a BuildSpec file for CodeBuild

최상위 디렉토리에 CodeBuild의 작업을 정의한 buildspec.yml를 생성

Build Specification reference 문서

예시)

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Docker Hub...
      - docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PW
      - TAG=$TAG_VERSION
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_REPO_NAME:$TAG .
      - docker tag $IMAGE_REPO_NAME:$TAG $IMAGE_REPO_NAME:$TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $IMAGE_REPO_NAME:$TAG

만약 TAG 버전을 unique한 commit hash로 저장 하고 싶다면

      - TAG="$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8)"

Setup the codebuild

Go to CodeBuild console

  1. Project configuration
    • Project 이름 입력
    • Enable build badge 활성화
  2. Source
    • Connecting using OAuth 로 GitHub과 연동
    • 만약, Personal access token으로 진행시 GitHub Personal access token 생성 필요 참고 및 권한은 repo, admin:repo_hook 참고
  3. Primary source webhook events
    • Webhook: 코드 변경이 이 리포지토리에 푸시될 때마다 다시 빌드
    • Event Type: PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED, PULL_REQUEST_REOPENED
    • 만약, 특정 Branch 이름이나 Tag로 이벤트를 감지 하고 싶다면 Start a build under these condition에 필터 추가 참고 문서 e.g., feature/ 브랜치 이벤트만 HEAD_REF: ^refs/heads/feature/*
  4. 환경(Environment)
    • Environment image: 관리형 이미지, Amazon Linux 2, Standard, aws/codebuild/amazonlinux2-x86_64-standard:4.0
    • Privileged: 권한 승격 활성화 (Enable this flag if you want to build Docker images or want your builds to get elevated privileges)
    • 서비스 역할: 새 서비스 역할 (Name: default e.g., codebuild-[project_name]-service-role)
    • Additional configuration 에 환경 변수 설정:
      • TAG_VERSION(일반 텍스트): latest , 위에서 TAG_VERSION을 commit hash로 받는 설정을 하였을 경우는 설정 필요 없음
      • IMAGE_REPO_NAME(일반 텍스트): Docker Repo Name e.g., cloudacode/devops-flask
      • DOCKERHUB_USER(Secrets Manager): dockerhub:username
      • DOCKERHUB_PW(Secrets Manager): dockerhub:password codebuild-env

      Note

      username, password 보안을 위해 Secrets Manager를 활용하여 암호 관리 필요. 참고

  5. BuildSpec
    • 상위 디렉토리에 buildspec.yml이라는 파일로 이름을 정했으므로 별도의 입력값 필요 없음
  6. Artifact: 없음
  7. CloudWatch: Default(CloudWatch 로그 선택)

2. Configure Secrets Manager

Go to SecretsManager console

Store a new secret

  • Type: Other type of Secrets
  • Secret key/vale에 username: DOCKERHUB 계정이름, password: DOCKERHUB 계정패스워드 입력
  • Secret Name: dockerhub secretmanager-keyvalue

참고: DockerHub 자격 증명저장

3. Configure IAM policy

SecretManager에서 정의한 dockerhub secret도 읽는 권한을 부여 하기 위해 CodeBuildSecretsManagerPolicy-<YOUR_BUILD_PROJECT_NAME>-ap-northeast-2의 Resource에 secretsmanager dockerhub ARN 추가

Confirm the dockerhub secrets ARN

Go to Secertmanager dockerhub ARN

secretsmanager dockerhub arn

Add the dockerhub secrets resource in IAM Policy

Go to IAM Policy console

CodeBuildSecretsManagerPolicy-<YOUR_BUILD_PROJECT_NAME>-ap-northeast-2 에서 수정 진행(JSON에서 Resource의 마지막 줄에 추가)

secretsmanger policy

4. Verify Codebuild Job manually

수동으로 수행 및 Codebuild 콘솔에서 확인

DockerHub image

이미지가 정상적으로 DockerHub에 업로드 되었는지 확인

Pull Request 테스트

별도의 Branch를 만들어 static/css/main.css의 backgroud-color 수정 후 main으로 PR 수행 및 CI 도구가 변경 사항을 인지하여 자동으로 수행 되는지 확인

PR

🎉 Congratulations, you have completed Publishing Docker images - AWS CodeBuild tutorial

이 글이 유용하였다면 ⭐ Star를, 💬 1:1 질문이나 기술 관련 문의가 필요하신 분들은 클라우드어코드 카카오톡 채널 추가 부탁드립니다.🤗

참고 자료

  • https://docs.aws.amazon.com/ko_kr/whitepapers/latest/introduction-devops-aws/introduction-devops-aws.pdf
  • https://docs.aws.amazon.com/ko_kr/whitepapers/latest/practicing-continuous-integration-continuous-delivery/practicing-continuous-integration-continuous-delivery.pdf
  • https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/sample-docker.html
  • https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/github-webhook.html