일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- string
- mutable
- compiler
- QueryDSL
- 알고리즘
- template
- CodeDeploy
- JPA
- java
- git
- springboot
- kotlin
- Airflow
- rds
- workflow
- 토비의 스프링
- db
- JUnit
- Action
- Spring
- immutable
- EC2
- AOP
- aws
- redis
- 사이드 프로젝트
- Github
- build_test
- Today
- Total
개발 일기
Github action 과 aws codeDeploy를 이용하여 SpringBoot 프로젝트 ec2에 배포하기 - 2 본문
Github action 과 aws codeDeploy를 이용하여 SpringBoot 프로젝트 ec2에 배포하기 - 1
이제 Github 에서 배포 설정을 해보겠습니다.
Master 에 Push 나 Pull_Request 가 발생하면
바로 EC2에 배포가 되게 해보겠습니다.
1. workflow 작성하기
github action 으로 이동하여 워크 플로우를 작성해 줍시다.
workflow 를 작성하기 전에 action 에서 aws cli 를 이용 할 수 있는지 검색해 봅시다.
위와 같은 cli 를 지원하는군요
바로 작성해 보겠습니다.
name: Deploy SpringBoot Project
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: CheckOut
uses: actions/checkout@v2
- name: 자바 JDK 8 설치
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
- name: gradlew 권한 부여
run: chmod +x gradlew
- name: Gradle Build
run: ./gradlew build
- name: 압축 시작.
run: zip -qq -r ./we-are-dj-server.zip .
shell: bash
- name: AWS 설정
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: S3 업로드
run: aws s3 cp --region ap-northeast-2 we-are-dj-server.zip s3://dj-project-build/deploy/we-are-dj-server.zip
- name: CodeDeploy
run: aws deploy create-deployment --application-name DJ-Project-CodeDeploy --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name DJ-Project-Deploy-Group --s3-location bucket=dj-project-build,bundleType=zip,key=deploy/we-are-dj-server.zip
S3에는 소스코드 를 통으로 못올리기 때문에 zip 타입으로 압축을 해줍니다.
Aws 설정만 설명을 드리겠습니다.
cli를 보면 요구조건에 access-key-id와 secret key를 요구합니다.
이 키는 공개가 되면 안되기에 github repository 에 secrets 로 숨겨줍니다.
Repository의 setting 으로 이동한 후 secrets 메뉴로 이동합시다.
New repository secret를 클릭하고 1편에서 만들었던 사용자 키와 값을 넣어줍니다.
- name: S3 업로드
run: aws s3 cp --region ap-northeast-2 we-are-dj-server.zip s3://dj-project-build/deploy/we-are-dj-server.zip
- name: CodeDeploy
run: aws deploy create-deployment --application-name DJ-Project-CodeDeploy --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name DJ-Project-Deploy-Group --s3-location bucket=dj-project-build,bundleType=zip,key=deploy/we-are-dj-server.zip
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-s3-commands.html
AWS CLI에서 상위 수준(s3) 명령 사용 - AWS Command Line Interface
PowerShell을 사용하는 경우 셸은 CRLF의 인코딩을 변경하거나, 파이프 입력이나 출력 또는 리디렉션된 출력에 CRLF를 추가할 수 있습니다.
docs.aws.amazon.com
s3 업로드 명령어는 공식 문서에서도 확인 할 수 있습니다.
aws s3 cp 복사 명령어로
region 은 이전시간에 만든 버킷의 리전을 써줍시다.
그 이후 workflow 명령어에서 zip 로 압축시켜준 파일이름을 써준후
s3:://버킷이름/경로/파일이름
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/deployment-configurations.html
CodeDeploy 의 배포 구성 작업 - AWS CodeDeploy
을 통한 Amazon ECS 블루/그린 배포 관리AWS CloudFormation은 (는) MXP, CPT, KIX 또는 BJS/ZHY 리전에서는 사용할 수 없습니다.
docs.aws.amazon.com
CodeDeploy 쪽을 보겠습니다
--application-name = 저번 포스팅에 생성했던 애플리케이션 이름을 적어줍시다.
--deployment-config-name = 배포 방식입니다 이것도 애플리케이션 생성할 때 등록한걸 적어줍시다.
--deployment-group-name = 저번 포스팅에서 생성했던 group name 을 적어줍니다.
--s3-location:
bucket = 버킷 이름
bundleType = 버킷에 있는 파일 타입
key = 경로 + 파일이름
자 이제 workflow 설정은 끝입니다.
2. CodeDeploy , deploy.sh 작성하기
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file.html
CodeDeploy pec 파일 참조 - AWS CodeDeploy
tar 및 압축 tar 아카이브 파일 형식 (.tar 및 .tar.gz) 은 Windows Server 인스턴스에서 지원되지 않습니다.
docs.aws.amazon.com
appspec 파일을 작성합니다.
프로젝트의 최상단에 있어야하며
codedeploy과 수행할 명령입니다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app # 경로
overwrite: yes
permissions:
- object: /home/ec2-user/app # 경로
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: scripts/deploy.sh # 실행 쉘 경로
timeout: 60
runas: ec2-user # 실행자
설명은 주석으로 작성해두겠습니다.
이제 deploy.sh를 작성해봅시다
프로젝트의 scriptes/deploy.sh 로 작성하겠습니다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app
START_REPOSITORY=/home/ec2-user/start
echo "> 구동 할 애플리케이션을 복사 합니다."
cp $REPOSITORY/build/libs/*.jar $START_REPOSITORY
echo "> 현재 구동중인 애플리케이션 pid 확인"
APP_NAME=we-are-dj
CURRENT_PID=$(pgrep -f $APP_NAME)
echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -9 $CURRENT_PID"
sudo kill -9 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls -tr $START_REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
sudo chmod +x $JAR_NAME
sleep 2
echo "> $JAR_NAME 실행"
sudo nohup java -jar \
-Dspring.config.location=classpath:/application.yml,/home/ec2-user/properties/application-db.yml \
-Dspring.profiles.active=real \
$JAR_NAME > $START_REPOSITORY/nohup.out 2>&1 &
sh 파일의 작성법은 따로 설명 하지는 않겠습니다.
이제 마스터에 푸시를 해봅시다.
성공 적으로 workflow가 실행되었습니다.
CodeDeploy 도 배포가 잘되었네요
서버를 확인해 보겠습니다.
SpringBoot 프로젝트가 실행이 된걸 볼 수 있습니다..!
빠진 부분이 있거나 잘못된게 있을수도 있습니다.
문제가 생기면 댓글을 남겨주세요!
'Spring' 카테고리의 다른 글
SpringBoot 2.5.X 버전 이상에서 QueryDsl 설정하기 (0) | 2021.08.05 |
---|---|
SpringBoot 에서 Test DB H2 로 설정하기 (0) | 2021.08.02 |
Github action 과 aws codeDeploy를 이용하여 SpringBoot 프로젝트 ec2에 배포하기 - 1 (0) | 2021.07.25 |
AWS RDS 와 Spring Boot 연동하기 (0) | 2021.07.23 |
Spring Boot 프로젝트 초기 생성 (0) | 2021.07.14 |