12 Oct 2020

Spring boot에서 배포자동화 구성[1]

배포 자동화 구성


script경로

deploy.sh

#!/bin/bash

REPOSITORY=/home/ec2-user/{앱이있는 경로}
PROJECT_NAME={자신의 프로젝트 이름}

echo "> Build 파일 복사"

cp $REPOSITORY/zip/*.jar $REPOSITORY/

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

CURRENT_PID=$(pgrep -fl pjh-server | 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 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

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


코드 설명

cp $REPOSITORY/zip/*.jar $REPOSITORY/
  • $REPOSITORY/zip 경로에 있는 *.jar을 $REPOSITORY경로로 복사한다.


CURRENT_PID=$(pgrep -fl pjh-server | grep jar | awk '{print $1}')
  • pgrep [패턴] name을 가지고 있는 프로세스를 찾는다

  • -f: -l 옵션과 함께 사용하면 명령어의 경로를 출력한다.

  • -l: pid와 함께 일치하는 프로세스의 이름을 출력한다.

  • grep [패턴] 패턴을 검색한다.

  • awk : 여기서는 pgrep -fl 을 하면 $1 : pid $2 : 명령어의 경로 등이 출력되는데 print $1은 그 중 첫번째 열인 pid를 출력하라는 소리다.


if [ -z "$CURRENT_PID"  ];
  • -z [문자열] : 문자열 길이가 0이면 참


kill -15 $CURRENT_PID
  • kill -15 [pid] : 여기서 -15옵션은 소프트웨어 종료 시그널이다.


$(ls -tr $REPOSITORY/*.jar | tail -n 1)
  • ls : 해당 디렉토리의 목록 출력

  • -t : 최근 파일 순으로 보여준다

  • -r : 역순

  • -tr: 최근 파일의 역순이면 오래된 파일순으로 보여준다는 소리

  • tail -n [k] : 뒤에서 k번째것 가져오기


chmod +x $JAR_NAME
  • 실행을 위한 실행권한 부여


nohup java -jar \
    -Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-real-db.properties \
    -Dspring.profiles.active=real \
    $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
  • nohup: 쉘스크립트 파일을 데몬형태로 실행시키는 프로그램 터미널 세션이 끊겨도 실행을 멈추지 않고 동작하도록 한다.

  • & : 프로세스를 실행할때 백그라운드에서 동작하도록 만든다.


travis.yml

language: java
jdk:
  - openjdk8

branches:
  only:
    - master

# Travis CI 서버의 Cache 활성화
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

# clean 후 Build (Build시 자동으로 test 수행)
script: "./gradlew clean build"

before_deploy:
  - mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 디렉토리 생성
  - cp scripts/*.sh before-deploy/
  - cp appspec.yml before-deploy/
  - cp build/libs/*.jar before-deploy/
  - cd before-deploy && zip -r before-deploy * # before-deploy로 이동후 전체 압축
  - cd ../ && mkdir -p deploy # 상위 디렉토리로 이동후 deploy 디렉토리 생성
  - mv before-deploy/before-deploy.zip deploy/{프로젝트이름}.zip

before_install:
  - chmod +x gradlew

# CI 실행 완료시 메일 알림
notifications:
  email:
    recipients:
      - {이메일}


appspec.yml

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/{압축파일경로}
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ec2-user
  • permissions: codeDeploy에서 EC2서버로 넘겨준 파일들을 모두 ec2-user권한을 갖도록 한다.

  • hooks

    • codeDeploy배포 단계에서 실행할 명령어를 지정한다.

    • ApplicationStart라는 단계에서 deploy.sh를 ec2-user권한으로 실행하게 된다.

    • timeout:60으로 스크립트 실행 60초 이상 수행되면 실패가 된다.(무한정 기다리면 안되기 때문에)


Tags:
0 comments