CD - Bitbucket, AWS


Bitbucket, AWS CodeDeploy 를 이용한 CD 간단 정리
향후 버전 변경 등으로 인해 동작 방식이 변경되거나 동작 하지 않을 수 있음!

프로세스 동작 순서

  1. 소스에 있는 bitbucket-pipelines.yml 을 Bitbucket이 커밋된 레포에서 읽음
  2. 설정된 step 순으로 동작한다.
  3. 설정 파일에서 AWS S3로 업로드 하도록 지정한다.
  4. 업로드되는 파일에 appspec.yml 파일을 CodeDeply가 읽어 설정대로 동작한다.

Bitbucket 설정

  • 설정파일에서 사용할 변수들 등록하기
  • Deployments, Repository variables 에 등록하면 됨

AWS 설정

  • 배포위치 정하기 및 생성
  • 업로드 할 S3 만들기
  • CodeDeploy 어플리케이션, 배포그룹 등록하기
  • 배포 대상에 CodeDeployAgent 설치하기

bitbucket-pipelines.yml 예제

image: node:latest

definitions:
  steps:
    - step: &npm-build-dev
        name: NPM build
        caches:
          - node
        script:
          - npm install
          - npm run build:dev
        artifacts:
          - dist/**
    - step: &npm-build
        name: NPM build
        caches:
          - node
        script:
          - npm install
          - npm run build
        artifacts:
          - dist/**
    - step: &packaging
        name: Packaging
        script:
          # 상황에 맞는 스크립트를 작성해서 등록할 것
          - bash -x ./scripts/package.sh
        artifacts:
          - application-name.tar

    - step: &deploy
        name: Deploy
        caches:
          - docker
        services:
          - docker
        script:
          - pipe: atlassian/aws-code-deploy:0.5.0
            variables:
              COMMAND: "upload"
              APPLICATION_NAME: $APPLICATION_NAME
              BUNDLE_TYPE: "tar"
              ZIP_FILE: "$APPLICATION_NAME.tar"
              AWS_DEFAULT_REGION: "ap-northeast-2"
              AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
              AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
              S3_BUCKET: $S3_BUCKET
              FOLDER: $APPLICATION_NAME
              VERSION_LABEL: "$APPLICATION_NAME-$BITBUCKET_COMMIT"
          - pipe: atlassian/aws-code-deploy:0.5.0
            variables:
              COMMAND: "deploy"
              APPLICATION_NAME: $APPLICATION_NAME
              BUNDLE_TYPE: "tar"
              AWS_DEFAULT_REGION: "ap-northeast-2"
              AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
              AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
              S3_BUCKET: $S3_BUCKET
              FOLDER: $APPLICATION_NAME
              VERSION_LABEL: "$APPLICATION_NAME-$BITBUCKET_COMMIT"
              DEPLOYMENT_GROUP: $BITBUCKET_BRANCH
              FILE_EXISTS_BEHAVIOR: "OVERWRITE"
              IGNORE_APPLICATION_STOP_FAILURES: "true"

pipelines:
  branches:
    DEV:
      - step: *npm-build-dev
      - step: *packaging
      - step: *deploy

appspec.yml

version: 0.0
os: linux
files:
  - source: /dist
    destination: /temp/application-name/dist
  - source: /start.sh
    destination: /temp/application-name
  - source: /stop.sh
    destination: /temp/application-name
  - source: /appspec.yml
    destination: /temp/application-name

permissions:
  - object: /temp/application-name
    pattern: "*.sh"
    mode: 766
    owner: centos
    type:
      - file
  - object: /temp
    pattern: "application-name"
    mode: 755
    owner: centos
    type:
      - directory

hooks:
  ApplicationStart:
    - location: start.sh
      timeout: 10
      runas: centos
  ApplicationStop:
    - location: stop.sh
      timeout: 10
      runas: centos