-
AWS - EC2배포 ubuntu [git pull + travis]서버 & Dev ops 인프라/AWS 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 와는 다름 - 그쪽에서도 별도 설정할 수 있음)
> 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
반응형'서버 & Dev ops 인프라 > AWS' 카테고리의 다른 글
AWS - EC2배포 Jenkins (0) 2021.07.21 AWS - EC2배포 자동화 [AWS Code Deploy & AWS S3] (0) 2021.04.23 AWS RDS 설정 (0) 2021.04.16 AWS - React & Springboot 환경 연결 (0) 2021.04.16 AWS - github 통한 배포 전 React + Spring boot 환경 설정 (0) 2021.04.16