본문 바로가기

PROGRAMMING/CI&CD

5. AWS EC2 Github Push로 자동 배포

이전 글

https://dvpdvp.tistory.com/197?category=996035

 

4-3. AWS EC2와 CodeDeploy 연동하기

이전글 https://dvpdvp.tistory.com/196 4-2. AWS EC2와 CodeDeploy 연동하기 이전글 https://dvpdvp.tistory.com/195?category=996035 4-1. AWS EC2와 CodeDeploy 연동하기 이전글 https://dvpdvp.tistory.com/19..

dvpdvp.tistory.com

 

EC2의 원하는 디렉토리에 파일을 올리는 과정까지 완료되었다.

이제 마지막 포스팅으로

1. 배포 스크립트 작성

2. EC2에 필요한 파일 + Jar 파일을 생성

3. CodeDeploy 설정 추가 (타임아웃 등등) 을 진행해보려 한다.

 

배포 스크립트는 이전에 수동 배포때 사용하던 스크립트에서 git pull과 build부분을 제거하여 사용하였다.

위치는 root의 scripts 디렉토리 아래 deploy.sh로 생성했다.

이는 배포 파일 생성 시 설정할 before_deploy에서 필요한 부분임으로 먼저 진행하였다.

 

#!/bin/bash

REPOSITORY=/home/ec2-user/app/deploy
PROJECT_NAME=taglog

echo "> Build 파일복사"
cp $REPOSITORY/zip/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fl taglog.*.jar | grep jar | awk '{print $1}')

echo "현재 구동중인 애플리케이션 Pid : $CURRENT_PID"

if [ -z "$CURRENT_PID"]; then
        echo "> 구동중 어플리캐이션 없음"
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 어플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

echo "> JAR NAME : $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"

cd $REPOSITORY/

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

nohup java -jar \
    -Dspring.config.location=classpath:/application-real.yml,/home/ec2-user/app/application-real-db.yml \
    -Dspring.profiles.active=real \
    $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

 

사실 스크립트는 개개인 환경에 따라 변경해야될 부분이 많아 공유한다고 해서 큰 도움이 될것같진 않지만... 

참고용으로 공유해본다..ㅎㅎ

맨 마지막 jar 배포에서 DB설정 파일은 git이 아니라 EC2 서버에 따로 보관하고 있기 때문에 이를 참조하도록 추가했다.

 

배포 스크립트를 생성하였으니

필요한 설정파일과 Jar파일을 before_deploy 설정으로 배포 폴더에 만들어보자

 

.travis.yml

before_deploy:
  - mkdir -p before-deploy #임시폴더 생성
  - cp scripts/*.sh before-deploy/ #배포 스크립트 copy
  - cp appspec.yml before-deploy/ #codeDeploy copy
  - cp build/libs/*.jar before-deploy/ #jar copy
  - cd before-deploy && zip -r before-deploy * #전체 압축
  - cd ../ && mkdir -p deploy #배포 폴더 생성
  - mv before-deploy/before-deploy.zip deploy/taglog.zip #배포 폴더로 이동

 

그 다음으론 CodeDeploy 설정을 추가해보자

appspec.yml

 

permission: #codeDeploy에서 넘겨받은 파일의 권한을 ec2-user에게 부여한다
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user
hooks: #배포 단계에서 실행할 명령어 지정
  ApplicationStart:
    - location: deploy.sh #배포 스크립트
      timeout: 60
      runas: ec2-user

 

우선 이렇게 설정하면 끝인데 

이상하게 Travis에서도 별 문제 없는데 프로세스가 뜨지 않았다.

CodeDeploy에도 배포 정상완료로 뜨고 희안하다 싶어서 nohup.out을 확인해보니 

 

no main manifest attribute in ~.jar 에러가 발생해 있었다.

 

검색해본 결과

스프링 부트 2.5부터는 jar 파일이 2개 생성되는데 하나는 그냥 jar, 다른 하나는 plain.jar 이다.

 

jar

 

차이는 그냥 jar는 프로젝트에 필요한 모든 의존성을 포함하고 있지만, 

plain.jar는 spring관련 의존성이 빠진 상태로 소스코드의 클래스 파일과 리소스만 포함한다.

 

근데 배포시 plain.jar를 사용하니 위 에러가 발생한것이었다.

방법은 배포 jar를 좀 더 상세하게 지정하거나 plain.jar를 생성하지 않으면 되는데 후자를 선택해 진행하였다.

 

build

 

bootJar는 그냥 jar를

jar는 plain.jar를 생성함으로 jar를 disabled하게 변경하면 plain.jar는 더 이상 생성되지 않는다.

build.gradle에 jar enabled false처리를 해주면 된다.

 

이때 소소하게 주의할 점은 jar 설정 위치다.

plugins나 buildscript보다 앞에 추가하면

only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks, no other statements are allowed 에러가 발생하게 된다. 

 

jar {
   enabled = false
}

 

이미 생성된 plain.jar를 EC2에서 제거해주고 다시 빌드를 하면

 

process

자동 배포가 성공적으로 완료되었다.

 

 

참조

https://dongjuppp.tistory.com/87

 

no main manifest attribute in 에러

 no main manifest attribute in 에러는 spring 애플리케이션을 빌드한 결과물로 나온 jar파일에서 처음 호출할 Main 메소드를 찾지 못했다는 에러다. 주로 jar파일을 "java -jar app.jar" 명령어로 실행을 시킬..

dongjuppp.tistory.com

https://kmhan.tistory.com/664

 

[Gradle] only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks, no other statements are al

에러 원인 : buildscript의 위치가 plugins보다 뒤에 있으면 안된다. 해결 1 2 3 buildscript {} plugins {} cs

kmhan.tistory.com