여기서 배포할 때 CodeDeploy서비스를 이용해 jar파일을 전달하기 위해서 먼저 s3을 ci도구와 연동이 필요합니다. (CodeDeploy는 저장 기능이 없기 때문)
Circle CI가 AWS의 S3와 CodeDeploy에도 접근할 수 있도록 해보겠습니다.
CodeDeploy는 깃허브 코드를 가져오는 기능을 지원하기 때문에 빌드도 하고 배포도 할 수 있지만, 그러면 CodeDeploy가 모든 것을 하게 될 떈 항상 빌드를 하게 되니 확장성이 많이 떨어짐
빌드와 배포가 분리되어 있으면 예전에 빌드되어 만들어진 jar를 재사용하면 되기 때문에 분리하는 것을 추천
일반적으로 AWS 서비스에 외부 서비스가 접근할 수 없기 때문에 접근 가능한 권한을 가진 key를 생성해서 사용해야함
AWS에서는 이러한 인증과 관련된 기능을 제공하는 서비스로 IAM(Identity and Access Management)를 제공
IAM을 통해 CI도구가 AWS의 S3와 CodeDeploy에 접근할 수 있도록 함
S3권한 및 CodeDeploy권한 설정
권한도 S3와 CodeDeploy를 분리해서 관리하기도 하지만 여기서는 합쳐서 관리
태그는 Name값을 지정
아래에 나온 [엑세스 키] 와 [비밀 엑세스 키] 는 Circle CI에서 사용될 키입니다.
Circle CI의 프로젝트설정 중에 AWS Permission 부분에 키값을 입력합니다.
아래와 같이 다른 값들은 환경변수로 등록이 가능합니다.
S3 버킷을 만드는 부분은 생략하였지만 이곳에 Circle CI에서 생성된 Build파일을 저장하도록 구성합니다. S3에 저장된 Build파일은 이후 CodeDeploy 에서 배포할 파일로 가져가도록 구성할 예정입니다. 또한 S3에 접근하려면 IAM의 키를 사용하여 접근합니다.
.circleci폴더의 config.yml파일에 세팅값을 입력합니다.
version: 2.1
orbs:
aws-s3: circleci/aws-s3@1.0.13
aws-code-deploy: circleci/aws-code-deploy@0.0.12
executors:
my-executor:
docker:
- image: circleci/openjdk:8-jdk
working_directory: ~/springboot2-webservice
jobs:
build:
executor: my-executor
# OOM오류를 피하기 위해 JVM 및 Gradle을 구성
environment:
_JAVA_OPTIONS: "-Xmx3g" # Heap memory
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.workers.max=2"
steps:
# workflow에서 트리거된 git branch를 checkout
- checkout
# Download and cache depen에dencies, keys에 저장된 키로 캐시에 저장된 내용을 복사
- restore_cache:
keys:
- v1-dependencies-{{ checksum "build.gradle" }}
- run:
name: Downloading Dependencies
command: ./gradlew dependencies
- save_cache:
paths:
- ~/.gradle
key: v1-dependencies-{{ checksum "build.gradle" }} # build.gradle 파일에서 무언가가 변경 될 때마다 캐시가 재생성되며,이 프로젝트의 다른 브랜치는 동일한 캐시 키를 생성합니다.
- run: ./gradlew clean build
- run:
name: before_deploy
command: |
tar cvzf springboot2-webservice.tgz scripts/*.sh appspec.yml build/libs/*.jar
- persist_to_workspace:
root: .
paths: .
deploy:
executor: my-executor
steps:
- attach_workspace:
at: .
- aws-s3/copy:
from: springboot2-webservice.tgz
to: 's3://hwany-springboot-build'
aws-region: AWS_DEFAULT_REGION
workflows:
version: 2.1
build-deploy:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: master