Home Cicd 수동
Post
Cancel

Cicd 수동

스터디 - 배포 과정 정리

현재 실행 중인 셸 세션을 종료하는 명령어

1
$ exit

image

현재 프로젝트에서는 gradle의 build를 클릭했을 때 test 때문에 에러가 생긴다. 따라서 수동으로 작성했다.

*intellij가 build하면 out폴더가 생기고 gradle이 build하면 build폴더가 생긴다.




local에서 java jar 빌드

1. terminal 에서 내 프로젝트 파일까지 이동한다.




2. test 제외하고 build하기

1
./gradlew build -x test

→ library에 파일이 하나 생긴다.




3. /build/libs 에 빌드된 jar 파일을 확인할 수 있다. ( ls -ll build/libs 로 확인가능하다.)

image

외부 라이브러리 제외하고 내가 작성한 코드만 넣어둔게 plain이다.




4. jar 실행 & 환경변수 전달

1
java -jar -Dspring.datasource.url=jdbc:mysql://{ipv4 주소}:{host port}/{schema} -Dspring.datasource.password={password} {jar 파일 위치 경로}/{project name}-0.0.1-SNAPSHOT.jar

ex) java -jar -Dspring.datasource.url=jdbc:mysql://1111.1.1:1234/chat -Dspring.datasource.password=1234 build/libs/hello-world-0.0.1-SNAPSHOT.jar

→ java 로 jar 파일 실행 -D[환경변수] -D[환경변수] 실행할 jar파일

image







EC2에서 직접 build 해서 실행

FilZilla에서 ec2를 연결한다.

image

ssh는 22번 포트이므로 22번으로 설정한다.




EC2에 jar 파일 넣기

image

jar파일을 ec2 서버로 옮긴다(왼쪽에서 오른쪽) 이때, plain이 아니라 plain없는 jar 파일을 옮기면 된다.




java 설치

1
sudo apt install openjdk-11-jre-headless

java2.x.x 버전을 사용중이어서 11 버전 사용했다.

java3.x.x 버전은 최소 17을 사용해야 한다.



자바 버전 확인

1
java --version




docker ip주소 명령어

기존에는 외부에서 ec2 접근하는 주소를 넣어줬는데 같은 네트워크 내부면 같은 ip를 넣어주므로써 굳이 나갔다가 들어오는 과정을 생략해준다.

→ docker주소를 넣어준다.

1
sudo docker inspect {container name}

나는 container name 대신에 sudo docker ps를 입력해서 나오는 container id를 작성했다.

network settings에 보면 Gateway, IPAddress를 볼 수 있는데 IPAddress가 docker ip주소이다.




jar 파일 실행

1
java -jar -Dspring.datasource.url=jdbc:mysql://{docker ip 주소}:3306/chat -Dspring.datasource.password=1234 {project 명}-0.0.1-SNAPSHOT.jar

여기서 jar 파일 주소명을 작성하지 않은 이유는 filezilla에서 jar 파일이 같은 위치에 있기 때문이다.

FileZilla의 작업 디렉토리(Working Directory)에 해당 jar 파일이 위치




접근방법

http://{ipv4 주소}:8080/{rest api 주소}

ex) http://{ipv4 주소}:8080/hello







EC2에 Dockerfile로 jar 파일을 Image로 빌드 후 container 실행하기

Dockerfile 작성

Docker docs
Docker hub


1
2
vi Dockerfile 
nano Dockerfile

둘 중에 아무거나 입력한다.



1
2
3
4
5
6
7
FROM openjdk:11-slim
WORKDIR /app
COPY ./{project name}-*-SNAPSHOT.jar ./app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "-Dspring.datasource.url=jdbc:mysql://{ipv4 주소}:3306/chat", "-Dspring.datasource.password=1234", "app.jar"]

WORKDIR : 도커 이미지를 실행할 때 작업 디렉토리를 설정하는 명령어

“/app”으로 작업 디렉토리를 설정했으므로 이후 명령어들은 “/app” 디렉토리 내에서 실행된다.


COPY : 현재 Dockerfile과 동일한 위치에 있는 “{project name}–SNAPSHOT.jar” 파일을 “/app/app.jar”로 복사하는 명령어

{host 파일 경로} {docker image 경로}

와일드카드(*)를 사용하여 버전이 변경될 수 있는 파일명에 대응하고 있다.


ENTRYPONT : 도커 이미지가 실행될 때 실행될 명령어를 설정하는 명령어

WORKDIR에서 작업 디렉토리를 “/app”으로 설정했기 때문에 “./”를 사용하지 않고 “app.jar”만 작성하여 실행된다.


ctrl + x(저장) 을 누르고 Y를 입력한 후 엔터하면 저장이 된다.

*만약 Dockerfile을 수정했다면 다시 build하고 run 해야한다.


위에서 FileZilla를 통해 jar파일을 옮겨놨기 때문에 COPY 명령어가 실행된 것이다.

만약 FileZilla를 사용안했다면 jar 파일을 넣어둬야한다.

image




절대경로와 상대경로

./app: ./은 현재 작업 디렉토리를 나타낸다.

즉, ./app은 현재 작업 디렉토리 아래의 app이라는 디렉토리를 나타낸다.

예를 들어, 현재 작업 디렉토리가 /home/user라면, ./app/home/user/app을 의미한다.


/app: /는 루트 디렉토리를 나타낸다.

즉, /app은 루트 디렉토리 아래의 app이라는 디렉토리를 나타낸다.

따라서 /app은 파일 시스템의 최상위 디렉토리에서부터 app 디렉토리를 찾는 것을 의미한다.


./app은 현재 작업 디렉토리를 기준으로 상대적인 경로를 나타내며,

/app은 파일 시스템의 루트 디렉토리를 기준으로 절대 경로를 나타낸다.


COPY 명령어에서 파일을 복사할 때 상대 경로를 사용하면 ENTRYPOINT에서 파일명만 작성하면되고

COPY 명령어에서 절대 경로를 사용하는 경우에는 ENTRYPOINT에서 파일의 전체 경로를 작성해줘야한다.

ex) COPY 명령어에서 /app/app.jar로 파일을 복사한 경우 (절대경로)

1
ENTRYPOINT ["java", "-jar", "-Dspring.datasource.url=jdbc:mysql://{ipv4 주소}:3306/chat", "-Dspring.datasource.password=1234", "/app/app.jar"]




Dockerfile 저장이 잘되었는지 확인

1
cat Dockerfile




image build

1
sudo docker build -t chat .

chat이라는 이름의 image build




container 실행

1
sudo docker run --name admeCon -p 8080:8080 -d chat:latest

sudo docker run --name [컨테이너이름] -p 8080:8080 -d {실행할 image명 지정}:latest


보안그룹 - 인바운드 규칙에서 8080포트(호스트)를 열어줘야 한다.

image


만약 port 번호를 바꾼다면?

Dockerfile에서 expose를 80으로 바꾼다면 포트 포워드를 할 때 뒤에 있는 port를 80으로 변경해야한다.

HTTP 80 port는 주소창에 port 번호를 입력하지 않아도 된다. (8080:80) but, 80포트 열어주기 필수

{ipv4 주소}/rest-api




log

1
sudo docker ps
1
sudo docker logs {container 명 or container id}

실행되는 것을 볼 수 있다.

image

{ipv4 주소}:8080/rest-api 주소를 입력해서 db에 저장될 만한 rest api url에 접속한 후

db를 새로고침하면 db가 띄워져있는 것을 볼 수 있다.

터미널창을 나가도 EC2에서 동작중임을 확인할 수 있다. → 배포 완료




여기까지 수동으로 작성을 했는데 다음에는 git actions를 활용하여 자동으로 배포하는 방법을 작성할 예정이다.

This post is licensed under CC BY 4.0 by the author.