08.ec2 서버에 프로젝트를 배포
08_01 ec2에 프로젝트 clone 받기
=> 깃에서 클론을 받아오기 때문에, 블로그 초반에 하지 않았던 깃 공유를 해서 깃에 프로젝트를 올렸음
푸티로 접속해서 작업을 진행함
- git 다운
$ sudo yum -y install git
- git 버전 확인
$ git --version
- git clone으로 프로젝트를 저장할 디렉터리 생성
$ mkdir ~/app && mkdir ~/app/step1
$ ls -R ~/app
=> 디렉터리들이 잘 만들어 진것을 확인할 수 있음
~ 는 사용자 홈디렉터리를 의미함
cd ~ => 해당 사용자의 홈디렉터리로 이동
- git 클론을 진행
$ cd app/step1/
$ pwd
=> 만든 디렉터리로 이동해서
git에서url을 복사해서 클론 작업을 진행해줌
=> 오타가 난건가해서 여러번 시도를 해봤는데, 계속 똑같은 오류가 보이길래 찾아봤더니
2021.9월 이후에 비밀번호 대신에 개인 token으로 접속을 해야한다고 한다
토큰을 만들러 가자
github 로그인 => 프로필 클릭 => setting => developer settings => persional access key => token
=> 이런 화면이 보이는데, generate 해주면 됨
=> 성공적으로 생성함(체크가 엄청 많을텐데, 블로그에서도 잘 모르겠으면 다 체크하라고 해서 일단 다 체크하고 만듬)
=> 토큰을 사용해서 로그인하니 잘 받아짐
=> 내용들이 잘 들어와있음
- 테스트 진행
./gradlew test
권한 오류가 떠서 sudo로 하면 될줄 알았더니 안됐다
책을 확인해보니
실행 권한을 추가해주라해서, 추가해준후에 다시 test를 돌렸더니
==> 성공적으로 진행된것을 볼 수 있었음
08_02 배포 스크립트 만들기
배포 => 작성한 코드를 실제 서버에 반영하는것
책에서 의미하는 배포
- git clone / git pull을 통해 새 버전의 프로젝트를 받음
- gradle / maven 을 통해 프로젝트 테스트와 빌드
- EC2 서버에서 해당 프로젝트를 실행 / 재실행
쉘 스크립트를 작성하는 과정이다
국비 교육과정에서 쉘 스크립트를 짜는 법을 배워서 괜찮을것 같았다
애초에 vi(m)은 맨날 쓰는 중이기도 하고 ㅎㅎ
모른다고 해도 따라치기만 하면 되서 삽입i/a/o/O 키만 알고 있으면 크게 문제는 없을 것 같다
i : 커서 왼쪽에 삽입(작성)
a : 커서 오른쪽에 삽입(작성)
o : 커서 아래쪽에 줄 삽입 후 작성
O : 커서 위쪽에 줄 삽입 후 작성
- 쉘 스크립트 파일 생성
$ sudo vi ~/app/step1/deploy.sh
==> 여기다가 작성
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1/springboot
PROJECT_NAME=springboot-webservice-dev
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITOYRY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
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 -t $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
- 생성한 스크립트에 실행 권한 추가
chomd +x ./deloy.sh
$ ll
total 4
-rwxr-xr-x 1 ec2-user ec2-user 753 Aug 24 10:26 deploy.sh
drwxrwxr-x 4 ec2-user ec2-user 51 Aug 23 17:28 springboot
-스크립트 실행
$ ./deploy.sh
=> 빌드가 성공했다고 뜨지만, jar name에는 아무것도없고 마지막 저렇게 뜬 후에 무한 로딩 중이다
홈디에 생성되는 nohup.out에 모든 에러 정보가 나와있다고해서, 그걸 보고 JAR Name이 안뜨는 이유를 봤더니
=> 환경변수에 오타가 있는걸 발견하고 다시 돌림
=> 이름이 잘 뜸 => 하지만
???
==> 구글링해봄
**
springiboto 2.5.0이상 버전 부터 gradle로 빌드할 때 jar 파일이 두개가 생성되는데
=> 얘네 둘이다 기본.jar 파일 / plain.jar파일
1. 앱이름.jar -> bootJar Task로 생성된것
2. 앱이름-plain.jar -> build Task로 생성된것
첫번째 jar는 해당 프로젝트에 필요한 모든 의존성이 같이 추가된것으로 MANIFEST.MF까지 모두 정상적인 형태로 나온다.
하지만, plain.jar는 의존성을 제외하고 딱 프로젝트에 있는 자원들만 jar로 만든것으로 spring 관련 의존성이 빠져 MANIFEST.MF에 Main메소드의 위치가 나오지 않는다.
==> 라는 정보를 발견함
그래서 책에 나온대로 스크립트문 속의 명령문을 직접 써봄
=> 출력되는 순서가 다른것을 볼 수 있음
ls -tr
-r : 순서를 거꾸로 출력함
tail : 끝에서 (숫자)만큼 출력함
grep ~ : ~를 포함하고 있는 것만 출력
책에서 쓰인 명령어가
=> springboot라는 디렉터리 -> jar을 포함하는 것만 -> 거꾸로 출력 -> 끝에서 1개
라는 뜻인데, 책에서 나온대로 치면 plain즉 의존성이 포함되지 않은 파일을 출력하게 됨
사용하는 버전이 바뀌면서,생성되는 파일의 개수 달라져서 기본에 써놓았던 방법이 정상작동 되지 않은것이였음
그래서 쉘 스크립트를 짤때 r을 제외하고, 끝에 .jar기본 파일이 위치할 수 있게 함
=> 책에 있는것처럼 화면이 나옴
=> 잘 도는듯 보이지만,
=> 실은 실패한
==> 다음 글에서 마저 다뤄보기로함
*********
+.+ 호스트 명 바꾸기(다시 시도)
1. => 책에 나온 방법
$ sudo vi /etc/sysconfig/network
=> 여기서 부터 아마존 공식 문서에 나온 방법들
2.
$ sudo vi /etc/hosts
3.
$ sudo vi /etc/cloud/cloud.cfg
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/set-hostname.html
Amazon Linux 인스턴스에서 호스트 이름 변경 - Amazon Elastic Compute Cloud
Amazon Linux 인스턴스에서 호스트 이름 변경 프라이빗 VPC에서 인스턴스를 시작하는 경우 Amazon EC2에서 게스트 OS 호스트 이름을 할당합니다. Amazon EC2에서 할당하는 호스트 이름의 유형은 서브넷 설
docs.aws.amazon.com
===========> 여기까지 했을때는 적용이 안됐는데
4.
$ sudo hostnamectl set-hostname springboot.webserver
=> 이 명령어를 쓰니까 성공적으로 잘 적용된것을 볼 수 있었음
'프로젝트 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스_실습' 카테고리의 다른 글
스프링부트와 AWS로 혼자 구현하는 웹 서비스 17_AWS (0) | 2023.08.28 |
---|---|
스프링부트와 AWS로 혼자 구현하는 웹 서비스 15_AWS (0) | 2023.08.25 |
스프링부트와 AWS로 혼자 구현하는 웹 서비스 14_AWS (0) | 2023.08.24 |
스프링부트와 AWS로 혼자 구현하는 웹 서비스 13_AWS (0) | 2023.08.23 |
스프링부트와 AWS로 혼자 구현하는 웹 서비스 12_AWS (0) | 2023.08.22 |