이전에 github action만 이용해서 CI/CD를 구축하는 방법과 github action과 aws codedeploy를 사용하여 CI/CD를 구축하는 방법에 대해 알아보았다.
<github action>
<github action + aws codedeploy>
이 당시에는 EC2에 직접 jdk를 설치하여 환경을 마련하는 방법으로 진행을 했었다.
환경을 직접 관리를 했어야 했는데 이번 포스팅에서는 도커를 통해 환경에 구애받지 않는 서버에 CI/CD를 적용해보기로 했다.
<도커 개념>
깃허브 액션만을 이용해서 구축할 예정이고 ssh를 통해 원격으로 EC2 서버에 접근할 예정이다.
가장 위의 "깃허브 액션으로 CI/CD 구축해보기"와 비슷한 방식이기 때문에 보고 오시는 것을 추천합니다.
이전 도커 포스팅에서는 openjdk 이미지를 받아서 컨테이너 실행 후 그 안에 jar 파일을 복사하고 다시 컨테이너에게 java -jar 명령어를 주는 방식으로 진행했었다.
그런데 이 방식은 시간이 많이 걸리고 귀찮은 방식이다.
이번에는 Dockerfile을 통해서 간단하게 진행해보려고 한다.
Dockerfile 설정
Dockerfile은 프로젝트 최상단에 생성해주면 되고 확장자 없이 Dockerfile이라는 이름으로 파일을 생성해주면 된다.
<Dockerfile>
FROM openjdk:19-alpine
ARG JAR_PATH=build/libs/*.jar
COPY ${JAR_PATH} /home/server.jar
ENTRYPOINT ["java","-jar","/home/server.jar"]
FROM
FROM은 기본 이미지를 지정해준다.
이미지 이름이 openjdk이고 태그가 19-alpine인 이미지를 기본으로 사용하겠다는 뜻이다.
자신의 버전에 맞게 이미지를 선택하면 된다.
ARG
그리고 ARG를 통해서 jar 파일의 위치를 지정해줬다.
jar 파일을 생성하고 나면 build/libs에 저장되기 때문에 build/libs/*.jar가 생성된 jar 파일의 경로가 된다.
참고로 gradle 빌드 시 일반적인 jar 파일과 plain이 붙은 jar 파일이 생성된다면 plain jar 파일이 생성되지 않도록 설정하는 것이 좋다.
build.gradle에 다음 코드를 작성해주면 jar 파일이 하나만 생길 것이다.
<build.gradle>
jar {
enabled=false
}
COPY
jar 파일을 컨테이너 내부로 복사한다.
COPY [생성된 로컬 jar 파일 경로] [컨테이너 내부 jar 파일 경로]
ENTRY POINT
entry point를 통해 컨테이너를 실행하면 자동으로 jar 파일을 실행하도록 한다.
ENTRYPOINT ["java","-jar","/home/server.jar"]
기본 환경 세팅
이전에 올렸던 github actions로 CI/CD 구축 포스팅과 거의 유사하다.
공통적인 부분은 따로 설명하지 않을 예정이므로 보고 오는 것을 추천합니다.
- EC2 인스턴스를 public subnet에 생성하고 탄력적 ip를 연결한다.
- EC2 인스턴스에 도커를 설치한다.
- 로컬에서 rsa 키를 생성한다.
- rsa 퍼블릭 키를 EC2 서버의 .ssh/authorized_keys 파일에 붙여넣는다.
- rsa 프라이빗 키를 깃허브 액션의 secrets에 등록한다.
- host, username, port도 같이 등록해준다.
- yml 파일을 작성해준다.
이전 포스팅에서 달라진 점은 도커를 설치한다는 점이다.
도커는 다음과 같은 명령어를 통해 설치하면 된다.
sudo yum update
sudo yum install docker
workflow 작성
name: Java CI with Gradle
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
- name: Docker build
run: |
docker login -u ${{ secrets.DOCKER_ID }} -p ${{ secrets.DOCKER_PWD }}
docker build -t [도커 허브 아이디]/[이미지 이름] .
docker push [도커 허브 아이디]/[이미지 이름]
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.PRIVATE_KEY }}
script: |
docker pull [도커 허브 아이디]/[이미지 이름]
docker stop server
docker run -d --rm --name server -p 8080:8080 growth123/test
"Build With Gradle"까지는 이전 포스팅과 동일하다.
Docker Build부터 본다면 우선 docker에 로그인을 하고 이미지를 생성한 다음 도커 허브에 이미지를 push 한다.
그리고 Deploy에서는 ssh-action을 사용하여 원격으로 EC2에 명령어를 입력한다.
우선 로컬에서 올린 이미지를 가져오고 기존 실행 중이던 서버를 내리고 새로운 이미지를 통해 서버를 올린다.
Dockerfile을 설정했기 때문에 컨테이너를 실행만 시켜도 서버가 자동 실행된다.
'공부 > Spring' 카테고리의 다른 글
[Spring][Redis] 스프링 부트에서 redis 연동 및 RedisTemplate 사용법 (0) | 2023.07.14 |
---|---|
[Spring] 스프링 부트 Redis를 사용하여 refresh token 저장하기 (1) (0) | 2023.07.12 |
[Spring] 깃허브 액션과 AWS CodeDeploy로 CI/CD 구축 (스프링 부트) (0) | 2023.07.03 |
[Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트) (0) | 2023.07.02 |
[Spring][인프런 스프링 DB] 스프링, 자바 예외 처리 (0) | 2023.07.01 |
댓글