서버 & Dev ops 인프라/AWS

AWS - EC2배포 ubuntu [git pull + travis]

코르시카 2021. 4. 23. 11:32

■ 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 와는 다름 - 그쪽에서도 별도 설정할 수 있음)

참조 : galid1.tistory.com/664

> yml 파일을 사용하면, 한번에 configureation 설정이 가능

위와 같이 configuration 변경
main run시 local로 설정 되어있는 것 확인

 

 

■ 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)

 

실제 awsEC2_React_Spring 밑의 구조

> 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

 

반응형