2023.12.28 - [CI,CD] - [CI/CD] Docker로 프로젝트 배포 및 중단
1. Github Actions로 CI/CD 파이프라인 구축 방법
- 이전 게시글에서 생성해 둔 레포지토리와 샘플 프로젝트 사용
1-1. Github Actions 시작
- 레포지토리에 들어가서 Actions 탭 클릭
- Get started with GitHub Actions > Java with Gradle 클릭 (없다면 검색)
- 생성된 gradle.yml 에 아래 코드 붙여넣기 -> 커밋
# Workflow 이름
name: Spring Boot & Gradle CI/CD
# 어떤 이벤트가 발생하면 workflow 실행할 지 명시
on:
# main 브랜치에 push나 pull request 발생 시
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# 위 이벤트 발생 시 실행될 작업들
jobs:
build:
# VM의실행 환경 지정 => 우분투 최신 버전
runs-on: ubuntu-latest
# 실행될 jobs를 순서대로 명시
steps:
- name: Checkout
uses: actions/checkout@v3
# JDK 21 설치
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
# Gradle Build를 위한 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle Build (test 제외)
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
# DockerHub 로그인
- name: DockerHub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# Docker 이미지 빌드
- name: Docker Image Build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} .
# DockerHub Push
- name: DockerHub Push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
# EC2 인스턴스 접속 및 애플리케이션 실행
- name: Application Run
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
sudo docker kill ${{ secrets.PROJECT_NAME }}
sudo docker rm -f ${{ secrets.PROJECT_NAME }}
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker run -p ${{ secrets.PORT }}:${{ secrets.PORT }} \
--name ${{ secrets.PROJECT_NAME }} \
-e SPRING_DATASOURCE_URL=${{ secrets.DB_URL }} \
-e SPRING_DATASOURCE_USERNAME=${{ secrets.DB_USERNAME }} \
-e SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} \
-d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
1-2. 개인 정보를 위해 변수로 선언한 정보를 설정
- Settings > Secrets and Variables > Actions 클릭
- New repository secret 클릭 (환경 변수 추가)
- Name : Secret 형식
- DOCKERHUB_USERNAME : 회원가입 한 Docker Hub의 username
- DOCKERHUB_PASSWORD : 회원가입 한 Docker Hub의 비밀번호
- PROJECT_NAME : 프로젝트 이름
- 해당 이름으로 Docker Hub에 올라가게 됨
- 또한 Docker Container도 해당 이름으로 설정됨
- PORT : 8080
- DB_URL : jdbc:mysql://[RDS의 엔드포인트]:[포트번호]/[DB 이름]
- DB_USERNAME : RDS의 마스터 사용자 이름
- DB_PASSWORD : RDS의 마스터 비밀번호
- EC2_HOST : 인스턴스의 퍼블릭 IPv4 DNS
- EC2_USERNAME : 인스턴스의 username (ex: ubuntu)
- EC2_KEY : 생성한 key pair (pem 키) 값
- 터미널에서 명령어 cat [pem 키 경로] 를 통해서 확인
- -----BEGIN RSA PRIVATE KEY----- 와 -----END RSA PRIVATE KEY----- 포함한 값 붙여넣기
1-3. Actions 동작 확인
- 다시 Actions 탭으로 돌아가서 Re-run
- build 가 완료되면 Github Actions 를 통한 CI/CD 파이프라인 구축 완료
2. 코드 수정을 통해 통합 + 제공 + 배포 자동화 확인
2-1. 배포 결과 확인
- 주소창에 [인스턴스 퍼블릭 IPv4 DNS]:8080 입력하여 배포 결과 확인
2-2. 코드 수정 후 깃허브에 푸시
- 수정된 결과가 자동으로 통합부터 배포까지 이루어지는 지를 확인하기 위함
- 수정 결과를 한 눈에 보기 쉽게 "회원가입 한 유저 리스트" -> "회원가입 명단 리스트" 로 변경
- 변경 후 깃허브에 푸시
- 푸시 후 2~3분 후에 새로고침
깃허브에 코드 수정 내용을 푸시만 했을 뿐인데 자동으로 수정 결과 반영되어 배포됨
즉, CI/CD 파이프라인이 제대로 구축되었음을 확인
'DevOps > CI,CD' 카테고리의 다른 글
[CI/CD] Spring 프로젝트 AWS CodePipeline 사용한 배포 자동화 적용 방법 (0) | 2024.11.12 |
---|---|
[CI/CD] Docker로 프로젝트 배포 및 중단 (0) | 2023.12.28 |
[CI/CD] AWS EC2 인스턴스 SSH 접속 + Docker 설치 (0) | 2023.12.28 |
[CI/CD] AWS EC2 인스턴스 생성 방법 (0) | 2023.12.28 |
[CI/CD] AWS RDS 생성 방법 + MySQL 워크벤치와 연동 (0) | 2023.12.27 |