반응형
OS : MacOS Sonoma 14.6.1
IDE : IntelliJ
Java v17
Spring Boot v3.3.2
-----
아래 내용이 전제 된 상태에서 실행한다.
1. 배포를 위한 ec2 서버가 실행되어 있음. (Ubuntu 22.04 LTS)
2. ec2 서버에 Docker 가 설치되어 있음.
1. Docker 사용 준비
1.1 Docker repository 생성
Docker hub에 접속하여 repository를 생성한다.
1.2 프로젝트 상위에 Dockerfile 생성
- spring boot 프로젝트 폴더 구조
- Dockerfile 내용
# open jdk 17 버전의 환경을 구성한다.
FROM openjdk:17-alpine
# build가 될 때 JAR_FILE이라는 변수 명에 build/ibs/*.jar 선언
# build/libs - gradle로 빌드했을 때 jar 파일이 생성되는 경로임
ARG JAR_FILE=build/libs/*.jar
# JAR_FILE을 be-yeogaekgi.jar로 복사 (이 부분(.jar)은 개발환경에 따라 다름)
COPY ${JAR_FILE} cicd-test.jar
# 운영 및 개발에서 사용되는 환경 설정을 분리한다.
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/cicd-test.jar"]
1.3 Docker Server 설정해주기
- Docker Desktop 설치 및 실행
- IntelliJIDEA > Preferences (Mac)로 또는 IntelliJIDEA > File > Settings (Windows/Linux) 또는
- Build, Execution, Deployment > Docker로 이동
- '+' 버튼을 클릭하여 새 Docker 연결 추가
- Docker for Windows/Mac을 사용 중이라면, 'Docker for Windows' 또는 'Docker for Mac'을 선택
- Unix 소켓을 사용한다면, 'Unix socket'을 선택하고 경로 지정 (보통 '/var/run/docker.sock')
- TCP 연결을 사용한다면, 'TCP socket'을 선택하고 호스트와 포트 지정 - 'Connect' 버튼을 클릭하여 연결 테스트
2. Docker Image 생성
2.1 실행 전 jar 파일 생성해보기
- IntelliJ 오른쪽에 있는 Gradle 탭을 열기
- [프로젝트명] > Tasks > build > bootJar를 더블클릭
- build/libs 디렉토리에 jar 파일 생성됐는지 확인
❗️application-private.properties 파일 사용시 application.properties 파일에 아래 내용 추가
spring.config.import=optional:classpath:application-private.properties
2.2 Dockerfile 실행시키기
그 전에 docker desktop 로그인 되어있는지 확인!
2.3 Docker hub repository에 Push
# docker build --build-arg DEPENDENCY=build/dependency -t {dockerName}/{dockerRepository} .
docker build --build-arg DEPENDENCY=build/dependency -t settong/cicd-test .
# docker push {dockerName}/{dockerRepository}
docker push settong/cicd-test
Docker Image 확인
- Docker desktop > hub 에서 제대로 업로드 되어있는지 확인
- EC2 에서 실행해보기
# ec2 서버에서 실행
sudo docker pull (도커 허브 ID)/(Repository 이름)
sudo docker run -p 8090:8090 -d (도커 허브 ID)/(Repository 이름) # 프로젝트 port 8090임.
3. Github Actions 으로 CI/CD 적용
3.1 Github Secrets 설정
DB, S3 관련 정보 같은 민감한 정보를 저장.
- GitHub 리포지토리에서 Settings로 이동
- 좌측 메뉴에서 Secrets and variables > Actions를 클릭
- New repository secret 버튼을 클릭
- Secrets 추가
- secret명은 특수문자 포함 불가능
- workflow에서 secrets. 으로 불러옴 (secrets.DOCKER_REPO)
- 추가해야할 내용들
- YML : application-private에 들어갈 내용들을 yml 파일 형식으로 저장
- DOCKER_USERNAME : Dockcer user(Namespace)
- DOCKER_PASSWORD : Docker password
- DOCKER_REPO : Docker repository 이름
- HOST_PROD : EC2 퍼블릭 IPv4 DNS
- PRIVATE_KEY : EC2 서버 접속 key. (key는 .pem 형식이어야 한다.)
3.2 workflow 작성
1. Actions → Choose a workflow → Java with Gradle 선택
2. [.github -> workflows] 폴더에 gradle.yml 파일이 생성된 것 확인
3. gradle.yml (스크립트 파일 수정)
name: Java CI with Gradle
on:
push:
branches: [ "develop", "main" ]
pull_request:
branches: [ "develop", "main" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# 환경별 yml 파일 생성
- name: make application.yml
if: contains(github.ref, 'main')
run: |
cd ./src/main/resources
touch ./application.yml
echo "${{ secrets.YML }}" > ./application.yml
shell: bash
# gradle chmod
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# gradle build
- name: Build with Gradle
run: ./gradlew clean build -x test
# docker login
- name: Docker Hub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# docker build & push to production
- name: Docker build & push to prod
if: contains(github.ref, 'main')
run: |
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}
## deploy to production
- name: Deploy to prod
uses: appleboy/ssh-action@master
id: deploy-prod
if: contains(github.ref, 'main')
with:
host: ${{ secrets.HOST_PROD }} # EC2 퍼블릭 IPv4 DNS
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
sudo docker ps
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_REPO }}/be-yeogackgi:latest
sudo docker run -d -p 8090:8090 {{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest
sudo docker image prune -f
728x90
반응형
'Devops > CICD' 카테고리의 다른 글
Github Actions으로 CICD 구축하기 (3) - React 빌드 파일 배포 (0) | 2024.09.03 |
---|---|
Github Actions으로 CICD 구축하기 (1) - 시스템 아키텍처와 필요한 개념 정리 (0) | 2024.08.24 |