티스토리 뷰
이번 블로그에서는 여러 EC2들을 대상으로 CI/CD를 구축하는 과정을 알아보도록 하겠습니다.
우선 CI/CD 도구는 깃허브 액션을 사용할것이고, 스프링 서버를 기반으로 배포를 진행할 것입니다.
CI/CD를 구축할 서버 구조환경은 아래의 글에서 확인 하실 수 있습니다.
EC2 도메인 연결 및 HTTPS 적용하기
이번엔 AWS에서 서버 배포를 할때, 도메인을 적용시키고, 추가적으로 HTTP가 아닌 HTTPS로 적용시켜 배포하는것을 알아보도록 하겠습니다. 우선, 이 과정을 진행하기 위해선 필요한것들은 다음과
tioon.tistory.com
즉, 아래가 저희가 CI/CD를 구축해야할 서버의 환경입니다. 로드밸런서와 RDS는 CI/CD를 구축할 필요가 없으므로, EC2 3개에 CI/CD를 구축해보도록 하겠습니다.
전체 CI/CD 과정
우선 전체적인 CI/CD플로우를 전체적으로 훑어 보겠습니다.
- master 브랜치 코드 변경 탐지 (코드업데이트 시 CI/CD 시작)
- 최신 코드 체크아웃
- 스프링서버 빌드
- 도커 허브에 이미지 push
- EC2 SSH 접속 후 이미지 pull
- 도커 컴포즈이용해 컨테이너 실행
CI/CD는 위와 같은 단계로 이루어 집니다. CI/CD는 깃허브의 master브랜치에 코드가 변경되었을떄 자동적으로 진행되며,마지막에는 각 EC2에 SSH로 원격 접속을 하여 도커 컨테이너를 실행하는 방식으로 CI/CD가 진행됩니다. 저는 도커로 배포를 하였지만, 스프링 jar 파일로 배포를 진행해도 상관없습니다.
이제 차례대로 CI/CD 코드와 같이 진행 해보도록 하겠습니다.
master 브랜치 코드 변경 탐지
깃허브 액션의 제일 처음에 있는 코드입니다. 위의 코드에서 보이다싶이,
master 브랜치의 코드에 push가 발생기면 바로 탐지하여, CI/CD를 진행을 하게 됩니다.
이때, master 브랜치로의 직접 push, 다른 브랜치에서의 Pull Request 등의 master 브랜치에 변화를 발생시키는 모든 작업이 포함됩니다.
최신 코드 체크아웃
이제 저희가 push했던 master 최신 코드를 체크아웃합니다. 이 동작은 로컬, ec2에서 진행되는게 아니라, 깃허브 자체 가상서버에서 진행이 됩니다.
즉,깃허브에서 진행되는 코드들은 다 깃허브 자체 가상 서버에서 진행이 되는거기 때문에, 로컬의 환경과 아무 상관없이 독립적으로 진행이 됩니다.
아무튼, 깃허브 서버에서 가장 최신 코드로 받아가지고 옵니다.
스프링 서버 빌드
이제 깃허브 서버에서 스프링 서버를 빌드할 JDK 버전설정 후, Gradle을 사용하여 빌드를 합니다.
저는 스프링 서버를 JDK 11 버전으로 제작했기에, 11버전으로 설정을 하고, 스프링서버 루트 디렉토리로 가서 gradlew를 이용해 스프링서버를 빌드하여 jar 파일을 생성합니다.
도커 허브에 이미지 Push
이제 깃허브 서버에서 도커 허브에 로그인을 한 후, 스프링 서버를 도커 이미지로 빌드한 후, 바로 도커 허브에 push하는 단계입니다.
도커 로그인 같은 경우는 docker/login-action이라는 오픈소스를 사용했습니다.
자세한 사용법은 아래의 링크에서 확인해주세요.
https://github.com/docker/login-action
GitHub - docker/login-action: GitHub Action to login against a Docker registry
GitHub Action to login against a Docker registry. Contribute to docker/login-action development by creating an account on GitHub.
github.com
EC2 SSH 접속 후 이미지 pull
이제 SSH원격 접속 후 도커 허브에 존재하는 도커 이미지를 Pull한 후, 각 EC2에서 도커 컴포즈로 컨테이너 배포를 하는 과정입니다.
SSH 접속은 appleboy님의 ssh-action 오픈소스를 활용하였습니다. 해당 오픈소스의 사용법은 아래 글에서 확인해주세요.
https://github.com/appleboy/ssh-action
GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.
GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.
github.com
또한, 저는 EC2 3개에 배포를 해야하므로, SSH를 각HOST마다 한번씩 실행을 합니다.
이렇게 SSH로 원격접속을 하게되면, 도커 컴포즈 파일이 있는 스프링 루트 디렉토리로 이동한 후,
도커 허브로부터 도커 이미지를 Pull 받아온 후, 도커 컴포즈를 이용해 컨테이너를 실행합니다.
이때,--remove-orphans 옵션을 통해 기존에 실행중인 컨테이너가 있을 시 제거를 합니다.
이렇게 순차적인 과정을 통해 코드 업데이트를 할때마다, EC2 3개에 자동으로 최신 코드 기반으로 서버를 재 배포를 할 수 있습니다.
아래는 CI/CD의 전체 코드입니다!
name: Build and Test on Pull Request
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
# 작업을 실행할 가상 환경 설정
steps:
# 깃허브 저장소를 체크아웃
- name: Checkout Repository
uses: actions/checkout@v2
# JDK 11 설정
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '11'
# Gradle을 사용하여 빌드
- name: Build with Gradle
run: |
cd hello-spring
chmod +x gradlew
./gradlew build
# Docker Hub 로그인
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker 이미지를 빌드후 Docker Hub 푸시
- name: Build and push Docker image
run: |
cd hello-spring
docker build -t ${{ secrets.DOCKER_IMAGE_NAME }} .
docker push ${{ secrets.DOCKER_IMAGE_NAME }}
# 각 서버에 SSH로 접속하여 도커 컴포즈로 배포
- name: SSH to SERVERS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER1_IP }},${{ secrets.SERVER2_IP }},${{ secrets.SERVER3_IP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
cd login_practice/hello-spring
docker pull ${{ secrets.DOCKER_IMAGE_NAME }}
sudo docker-compose up -d --remove-orphans
'클라우드' 카테고리의 다른 글
[Kafka] 아파치 카프카란? (0) | 2024.03.19 |
---|---|
SSH, SCP 명령어 정리 (0) | 2024.03.02 |
도커로 스프링 서버 배포 (0) | 2023.12.29 |
로드밸런서를 활용한 Scale-Out (수평확장) (0) | 2023.12.28 |
EC2 도메인 연결 및 HTTPS 적용하기 (3) | 2023.12.27 |