개발 일기

Github action 과 aws codeDeploy를 이용하여 SpringBoot 프로젝트 ec2에 배포하기 - 2 본문

Spring

Github action 과 aws codeDeploy를 이용하여 SpringBoot 프로젝트 ec2에 배포하기 - 2

dev-jo 2021. 7. 25. 13:59

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 프로젝트가 실행이 된걸 볼 수 있습니다..!

 

 


 

빠진 부분이 있거나 잘못된게 있을수도 있습니다.

 

문제가 생기면 댓글을 남겨주세요!