AWS - EC2배포 ubuntu [git pull + travis]
■ Jekins
Jekins 사용하면 좋겠지만, AWS에서는 EC2 하나 더 사용해야 한다고 함
> CID는 github + Travis 사용 예정
■ Ububtu JDK 8 설치
(Ubuntu는 기본 7 설치, 없는 경우 SKIP!)
추가 참조 : blog.naver.com/PostView.nhn?blogId=dudrb523&logNo=221475876695
[자동설정법]
1) sudo update-alternatives --config java
2) 자바 옵션 선택 후 Enter
[수동설정법]
1) sudo apt-get install openjdk-8-jdk
2) java -version
> 설치된 자바 버전확인
3) sudo vi /usr/bin/java8
(a)아래 내용 추가 ( linuxize.com/post/how-to-save-file-in-vim-quit-editor/ )
> vim editor 사용 시 저장 방법들
①번 방법 : ESC→ : wq
②번 방법 : : x
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$JAVA_HOME/bin:$PATH
(b) 파일 소유권 / 권한 변경
sudo chown root:root /usr/bin/java8
sudo chmod 775 /usr/bin/java8
(c) Alias 설정
sudo vi /etc/bash.bashrc
(아래 내용 추가)
alias java8='source /usr/bin/java8'
■ yml 파일 설정
( CLI 위해 - java JDK 자체에서 빌드시 test 빌드하고 수행
Travis CI 와는 다름 - 그쪽에서도 별도 설정할 수 있음)
> yml 파일을 사용하면, 한번에 configureation 설정이 가능
■ git을 EC2에 설치
1) sudo apt-get install git
> 깃 설치
2) git --version
> git 버전 확인
3) project를 위한 dir setup
※ 폴더 생성은 mkdir 커맨드로 생성!
현재 폴더구조
home
└- ec2-user
└- app
└- app / git
└- deploy.sh
└- nginx_setup.sh
------------------------- git repo 구조
└- awsEC2_React_Spring
└- (React - root dir)
└- myapp_spring (folder for Springboot)
> app / git에 git clone [repository url]
로 프로젝트를 복사한 후, 파일이 잘 위치하였는지 확인
4) deploy script 권한 설정 및 실행
> (root) <sudo> chmod 774 [ file / folder ]
OR chmod 777 [ file / folder ]
OR chmod +x [ file / folder ]
> script 실행은 ./[ file ]
※ Window에서는 cmd에서 cd로 해당 location으로 이동해서 ./ 없이 bat file 실행
5) 권한 확인은 다음 명령어
> nginx_setup.sh
- 스크립트 자체는 deploy.sh에서 실행
#!/bin/bash
ROOT_DIR=/etc/nginx
# nginx 설치시 기존 존재하는 기본 configuration과 충돌하지 않기 위함
echo "> deleting pre-exising defaults in nginx!"
sudo rm $ROOT_DIR/sites-available/default
sudo rm $ROOT_DIR/sites-enabled/default
# myapp.conf를 출력
echo "> creating config file!"
config_file=$ROOT_DIR/sites-available/myapp.conf
sudo rm $ROOT_DIR/sites-available/myapp.conf
echo "server{" >> $config_file
echo "listen 3000;" >> $config_file
echo "location / {" >> $config_file
echo "root /home/ec2-user/app/git/awsEC2_React_Spring/build;" >> $config_file
echo "index index.html index.html;" >> $config_file
echo "try_files \$uri \$uri/ /index.html;" >> $config_file
echo "}" >> $config_file
echo "}" >> $config_file
cat $config_file
# sites-enabled에서 공유하기 위해 symbol-link 작성
echo "> create symbolic link"
sudo ln -s $ROOT_DIR/sites-available/myapp.conf $ROOT_DIR/sites-enabled/myapp.conf
# 실행 name 중에 nginx 존재하면 shutdown 후 nohub으로 deomn으로 실행
echo "> re-run nginx"
sudo systemctl stop nginx
sudo nohup systemctl start nginx > ngnix.log &
> deploy.sh
#!/bin/bash
# repository를 변수로 저장(=는 붙여서 써야함)
TOPLOC=/home/ec2-user/app/git
REPOSITORY=$TOPLOC/awsEC2_React_Spring
cd $REPOSITORY/
# 강제로 pull 하기위함, git에 로그인되어있어야 동작
echo "> Git Fetch and Pull"
git fetch --all
git reset --hard origin
git pull
# package.json으로 react위한 npm dependency 설치
echo "> Get nodes"
npm install
# 위에서 언급한 react를 구동하기위한 nginx configuration 스크립트 실행
echo "> RUN nginx_setup.sh "
$TOPLOC/nginx_setup.sh
# react 빌드는 ec2에서 모종의 성능 이유로 빠른 배포가 이루어지지 않음
# push하는 로컬에서git hook을 통해 pre-build를 한 후
# github에 push해주고 그것을 EC2에서 사용하는 방식
echo "> BUILD React will be done locally"
# cd $REPOSITORY/myapp
# npm run build
cd $REPOSITORY/myapp_spring/
# spring-boot 설치
echo "> 프로젝트 Build 시작"
# gradlew 권한 부여
chmod +x gradlew
# gradlew로 springboot jar 생성
./gradlew build
echo "> Build 파일 복사"
cp ./build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f myapp_spring)
echo "$CURRENT_PID"
# 구동중인 spring stop 이후 build 된 jar 사용
if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -2 $CURRENT_PID"
# kill command 12 등도 있다고 함, 리눅스 좀더 잘 알게되면 nginx도 함께 고치는 것으로
kill -9 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'myapp_spring' | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &
6) Travis 설정
root 위치에 .travis.yml 로 설정
> 차후 travis의 cache 설정과 React test도 추가 예정
# https://travis-ci.com
language: java
jdk:
- openjdk8
branches:
only:
- main
# Travis CI 서버의 Home
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "chmod +x ./myapp_spring/gradlew && cd myapp_spring && ./gradlew build --info"
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- didghwns0514@gmail.com
- gradlew 권한때문 chomod +x 사용
- gradlew build --info 로 세부 빌드로그 확인 가능
※ Travis / AWS S3 문제
React + Springboot를 쓰는 입장에서
Travis를 사용하여 S3에 밀어넣는 작업이 원할하지 않음
Document를 보고 yml작업하기 어렵다는 단점..?
> 다음과 같은 yml job 2개로
zip file 잘 생성하였음
# .travis.yml 파일
jobs:
include:
- language: java
jdk:
- openjdk8
branches:
only:
- main
# Travis CI 서버의 Home
cache:
directories:
#- '$HOME/.m2/repository'
- '$HOME/build/didghwns0514/myapp_spring/.gradle'
script:
# /home/travis/build/didghwns0514/awsEC2_React_Spring/node_modules
#- "chmod +x ./myapp_spring/gradlew && cd myapp_spring && ./gradlew build --info"
- "echo $HOME" # /home/travis
- "pwd" # /home/travis/build/didghwns0514/awsEC2_React_Spring
- "ls -a"
- "chmod +x ./myapp_spring/gradlew && cd myapp_spring &&./gradlew clean build --info"
#- "cd .."
# https://devconnected.com/how-to-copy-directory-on-linux/
before_deploy:
- mkdir -p ./myapp_deploy
- mkdir -p ./deploy
- cp -R ./build/libs/*.jar ./myapp_deploy # jar to deploy
# - cp -R ./build/* ./myapp_deploy
- zip -r ZIP_Spring ./myapp_deploy/*
- mv ZIP_Spring.zip ./deploy/ZIP_Spring.zip
# deploy할 aws s3
deploy:
- provider: s3
local_dir: deploy
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: myapp-react-spring-bucket # 생성한 S3 버킷
region: us-east-2
skip_cleanup: true
acl: public_read
wait-until-deployed: true
on:
repo: didghwns0514/awsEC2_React_Spring #Github 주소
branch: main
- language: node_js
node_js:
- 'stable'
cache:
directories:
#- '$HOME/.m3/repository'
- '$HOME/build/didghwns0514/.tmp_react'
script:
#- npm test # no apt js test yet
- npm run-script build:env-travis
# https://devconnected.com/how-to-copy-directory-on-linux/
before_deploy:
- mkdir -p ./myapp_deploy
- mkdir -p ./deploy
# - cp -R ./myapp_spring/build/libs/*.jar ./myapp_deploy # jar to deploy
# - cp -R ./build/* ./myapp_deploy
- zip -r ZIP_React ./build/*
- mv ZIP_React.zip ./deploy/ZIP_React.zip
# deploy할 aws s3
deploy:
- provider: s3
local_dir: deploy
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: myapp-react-spring-bucket # 생성한 S3 버킷
region: us-east-2
skip_cleanup: true
acl: public_read
wait-until-deployed: true
on:
repo: didghwns0514/awsEC2_React_Spring #Github 주소
branch: main
# 전체 codebucket deploy
deploy:
- provider: codedeploy
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: myapp-react-spring-bucket # 생성한 S3 버킷
key:
- ZIP_React.zip
- ZIP_Spring.zip
bundle_type: zip
region: us-east-2
wait-until-deployed: true
application: myapp-React-Spring
deployment_group: myapp-react-spring-deployGroup
on:
repo: didghwns0514/awsEC2_React_Spring #Github 주소
branch: main
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- didghwns0514@gmail.com
참조 :
jojoldu.tistory.com/263?category=635883
5) 스프링부트로 웹 서비스 출시하기 - 5. EC2에 배포하기
이번 시간엔 지금까지 개발한 내용을 EC2에 배포 해보겠습니다. (모든 코드는 Github에 있습니다.) 5-1. EC2에 Git 설치 및 프로젝트 Clone 배포에 앞서 기반작업이 되는 Java와 Git을 EC2에 설치하겠습니다
jojoldu.tistory.com