CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(1)
빌드 배포 흐름
사전준비
AWS IAM 역할(Role) 설정
EC2CodeDeployRole 생성
CodeDeployRole 생성
AWS EC2 IAM 역할 수정
AWS IAM 사용자 추가
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(2)
AWS S3 버킷 생성
AWS CodeDeploy 생성
AWS EC2 접속하여 CodeDeploy Agent 설치
AWS EC2 Postgresql 설치
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(3)
소스코드 수정
.circleci > config.yml파일
프로젝트폴더 > appspec.yml
프로젝트폴더 > scripts > deploy.sh
프로젝트폴더 > src > main > resources > application.yml
CircleCI Context설정
AWS 환경변수 저장
프로젝트 환경변수 저장
깃허브 소스코드 push하여 빌드 배포 확인
팀플하면서 공부한 내용이다 (사실 공부도 아니고 어떻게 동작하는지만 찍어먹어본 정도..)
잘 이해하지 못한 부분도 많고 엄청 헤매었다. 일단 어떻게 동작되었는지 남겨놓는 용도로 작성하는 글이다
소스코드 수정
.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
jobs:
build:
docker:
- image: circleci/openjdk:11-jdk
environment:
DATABASE_URL: ${MY_POSTGRES_URL} #CircleCI Project Settings > Environment의 내용
steps:
- checkout
- run:
name: gradlew 권한 부여
command: chmod +x ./gradlew
- run:
name: gradle 빌드
command: ./gradlew build
- run:
name: 소스 압축
command: |
zip back.zip -r ./* #현재 폴더의 하위내용까지 포함하여 back.zip파일 생성
mkdir -p deploy
mv back.zip deploy/back.zip #back.zip파일 deploy폴더로 이동
- persist_to_workspace: #build와 deploy 단계가 나뉘어졌기때문에 압축한 파일이 deploy단계에서 사라질 수 있다
root: .
paths: deploy #deploy 폴더는 그대로 유지하겠다
deploy:
docker:
- image: circleci/python:2.7
steps:
- attach_workspace: #저장한 폴더 가져오기
at: .
- aws-s3/copy:
from: deploy/* #deploy 내부의 모든 파일을 aws s3로 보낸다
to: 's3://ec2-s3-mybucket' #s3://생성한 버킷명
aws-region: AWS_DEFAULT_REGION #CircleCI에 설정한 Context의 내용이 들어갈것이다
- aws-code-deploy/deploy-bundle:
application-name: EC2CodeDeployTest #CodeDeploy 애플리케이션 이름 작성
deployment-group: EC2CodeDeployTestGroup #EC2CodeDeployTest가 속한 배포그룹명 작성
deployment-config: CodeDeployDefault.AllAtOnce #EC2CodeDeployTestGroup의 배포그룹세부정보의 배포구성의 값 작성
bundle-bucket: ec2-s3-mybucket #s3://생성한 버킷명
bundle-key: back #보내는 파일 이름
bundle-type: zip #보내는 파일 확장자
workflows:
version: 2.1
build-deploy:
jobs:
- build
- deploy:
context: test #CircleCI에 설정한 Context 이름을 작성한다 (aws 계정정보 들어있는)
requires:
- build
프로젝트폴더 > appspec.yml
version: 0.0
os: linux
files:
- source: / #CodeDeploy에서 전달해 준 파일 전부를 destination으로 전달하겠다
destination: /home/ubuntu/deploy
overwrite: yes
permissions: #CodeDeploy에서 받은 파일의 권한을 설정한다 (ubuntu는 aws ec2 기본사용자)
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks: #CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
ApplicationStart: #deploy.sh를 ubuntu권한으로 실행합니다.
- location: scripts/deploy.sh
timeout: 60 #스크립트 실행 60초 이상 수행되면 실패가 됩니다.
runas: ubuntu
프로젝트폴더 > scripts > deploy.sh
#!/bin/bash
cd /home/ubuntu/deploy/build/libs
nohup java -jar jlpt-0.0.1-SNAPSHOT.jar > /home/ubuntu/jlpt/nohup.out 2>&1 &
# nohup실행 시 CodeDeploy는 무한 대기 합니다. 이 이슈를 해결하기 위해 nohub.out파일을 표준 입출력용으로 별도로 사용합니다.
# 이렇게 하지 않으면 nohup.out파일이 생기지 않고, CodeDeploy 로그에 표준 입출력이 출력됩니다. nohub이 끝나기 전까지 CodeDeploy도 끝나지 않으니 꼭 이렇게 해야합니다.
프로젝트폴더 > src > main > resources > application.yml
spring:
datasource:
url: ${MY_POSTGRES_URL} #jdbc:postgresql://~~:5432/jlpt
username: ${MY_POSTGRES_USER}
password: ${MY_POSTGRES_PASSWORD}
#CircleCI Project Settings > Environment에 정의된 값들이 들어올 것이다
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL10Dialect
show_sql: true
format_sql: true
CircleCI Context설정
AWS 환경변수 저장
1. CircleCI > Organization Settings > Contexts > Create Context
2. Add Environment Variable 클릭하여 3가지 변수를 추가해준다.
default region은 ap-northeast-2(서울)로 작성하고, accesskey와 secretkey는 [AWS IAM 사용자 추가] 에서 저장한 csv파일의 내용을 작성해준다.
프로젝트 환경변수 저장
Project로 넘어와서 Project Settings > Environment Variables에 데이터베이스 내용을 추가해준다
깃허브 소스코드 push하여 빌드 배포 확인
참고
https://velog.io/@hwany/AWS-EC2-CodeDeploy-연동하기
https://jojoldu.tistory.com/281
https://stackoverflow.com/questions/46195725/accessing-postgresql-9-6-from-spring-boot-in-circleci
https://www.sunny-son.space/AWS/Github%20Action%20CICD/
https://jinmay.github.io/2020/05/13/aws/how-to-install-code-deploy-agent-ubuntu/
https://backtony.github.io/spring/aws/2021-08-22-spring-cicd-2/
'Infra' 카테고리의 다른 글
AWS Lambda | 람다란? 동작방법, DB 커넥션, InvocationType, Serverless (0) | 2022.09.18 |
---|---|
AWS S3 SFTP로 접속하기 (0) | 2022.06.01 |
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(2) (0) | 2022.03.18 |
CircleCI로 SpringBoot+Postgresql 프로젝트 빌드 배포하기(1) (0) | 2022.03.18 |
AWS EC2 Jenkins 설치 (0) | 2022.03.18 |