티스토리 뷰
[CI/CD] GitHub Actions, Docker, EC2, Spring Boot 무중단 배포 시스템 만들기 1
리미32 2024. 3. 28. 10:53https://hasumang.tistory.com/89
⬆️이전 단계⬆️
EC2 인스턴스에 Docker를 활용하여 Spring 컨테이너를 만들었습니다. 그런데 로컬에서 이미지 푸시하고 EC2에서 이미지 풀 받아오는 과정을 자동화시키고 싶었습니다. GitHub Actions을 활용하면 push나 PR이 올라올 경우 바로 EC2가 갱신되도록 할 수 있다는 사실을 발견했습니다!
이런 자동화시키는 일련의 과정이 CI/CD입니다. 즉, CI/CD는 소프트웨어 개발의 전반적인 과정을 자동화하여 빠른 소프트웨어 제공을 가능하게하는 개념입니다. CI는 지속적 통합(Contiuous Integration), CD는 지속적 배포(Continuous Deployment)를 의미합니다.
이때, CI 는 개발자를 위한 자동화 프로세스를 제공하고, CD는 downtime(서비스 중단 시간)을 최소화하여 사용자들이 서비스에 대한 연속적인 접근성을 유지하면서도 최신 버전의 소프트웨어를 이용할 수 있도록 도와줍니다.
CI에 대해 더 알아보자면, 우리가 코드 작성을 완료하고 깃헙에 push, PR할 경우(commit과 같은 다른 액션도 가능), 하나하나 일일이 코드 상태를 확인하지 않아도 패키지다운 및 Test, 충돌 문제를 자동화하여 개발 코스트를 줄여줍니다.
따라서, 이번 포스팅은 GitHub Actions를 활용해서 PR을 보낼 경우 바로 빌드하고 docker 이미지가 갱신되는 과정까지를 개발해보겠습니다. EC2에 올리는 과정은 다음 포스팅에서 올리겠습니다!
1. GitHub Actions 설정
GitHub Actions 에서 gradle.yml 파일 생성
1. GitHub Repository에서 New workflow 선택
2. gradle 검색 후 Java with Gradle 선택
3. 다음 화면이 나올 경우 생성 완료
GitHub Actions 코드 수정하기
name: Java CI with Gradle & Docker
# push와 PR이 발생했을 경우 실행
on:
push:
branches: [ "develop", "feat/*", "cicd/*", "fix/*", "hotfix/*", "refactor/*", "chore/*", "docs/*", "style/*", "test/*" ]
pull_request:
branches: [ "develop", "feat/*", "cicd/*", "fix/*", "hotfix/*", "refactor/*", "chore/*", "docs/*", "style/*", "test/*" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
#자바 버전 설정
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 브랜치 전환
- name: Checkout
uses: actions/checkout@v3
# Spring Boot 어플리케이션 Build (1)
- name: Spring Boot Build
run: ./gradlew clean build -x test --warning-mode=all --stacktrace
# Docker 이미지 Build (2)
- name: docker image build
run: docker build -t rimi3226/gamegoo .
# DockerHub Login (3)
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PW }}
# Docker Hub push (4)
- name: docker Hub push
run: docker push rimi3226/gamegoo
Trouble Shooting
에러 1 : clean build를 하려고 옵션으로 clean build --exclude-task test 을 넣었더니 빌드 에러가 남
해결 : ./gradelw 명령어로 빌드함
에러 2 : 도커 이미지 만드는거니까 그래도 test 파일 빼야 빌드가 빨리 될 것 같아서 clean build 하려다가 에러남
* What went wrong:
Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':compileClasspath'.
시도 1 : 에러 로그 중에 버전이 안맞다는 로그를 찾아냈다.
-> build.gradle 파일에서
java {
sourceCompatibility = '17'
}
이거 대신에
sourceCompatibility = '17'
이걸로 바꿔봄 -> 실패!
-> 자바 스프링 파일 빌드가 로컬에서 잘됐기때문에 스프링의 문제라기 보다는 깃헙 액션의 문제라고 판단
해결 : 깃헙 액션 yml 에 java version을 명시하는 코드를 삽입
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
빌드 완료!
2. Github Action Secret Key 설정
Settings/Secrets and variables/Actions에서 New repository secret을 선택해서 docker용 secret key 세개 설정
해결!!!!!
다음 포스팅을 참고해서 개발했습니다.
참고 :https://lucas-owner.tistory.com/49
참고 : https://jinmay.github.io/2020/05/13/git/github-action-syntax/
'👩🏻💻개발공부 > AWS' 카테고리의 다른 글
SSH 비밀번호 오류 해결 (Permission denied) (6) | 2024.04.08 |
---|---|
[설치부터 응용까지] Java Spring Boot, Docker 활용해서 EC2에 배포하기 (0) | 2024.03.24 |
Java Spring Boot EC2에 배포하기 (0) | 2024.03.23 |
[Nginx] NodeJS, React 서버 배포하기 (0) | 2023.07.24 |
데이터베이스(MariaDB,MySQL) 서버에 올려서 공용으로 사용하기 (0) | 2023.07.19 |
- Total
- Today
- Yesterday
- SQL
- C++
- 깃 예제
- AWS
- 리눅스
- JavaScript
- 백준
- 공룡책
- 운영체제
- 자바스크립트
- MySQL
- 개발
- 프로젝트
- 스페인 교환학생
- 해커톤
- Linux
- 백엔드 개발
- 혼공단 SQL
- 혼공단 9기
- Process
- 스페인
- 혼공학습단
- JS
- 교환학생
- Signal
- googleapis
- 혼공단
- 개발일지
- 혼공
- nodejs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |