
이전에 GitHub Actions를 사용하여 로컬 환경에서 git push 시 자동으로 빌드 파일을 생성하여 도커 허브에 업로드 해주는 기능을 구현해보았다.
- 이전 블로그 포스트
[Spring] GitHub Action을 이용한 CI 구현 (Docker 사용)
본 프로젝트에서 로컬에서 푸쉬한 프로젝트를 github actions를 통해 build하고 빌드된 파일을 도커 이미지로 업로드하여 EC2에서 pull 받아 사용하는 방식으로 아키텍쳐를 설계하였습니다. 1. CI 구
sksmsfbrjs51.tistory.com
이번엔 자동 빌드에서 끝나지 않고 자동 배포 (CD) 까지 구현해보도록 하겠다.
1. EC2에 연결하기 위한 GitHub Secret 환경 변수 등록

workflow에서 필요한 ec2의 host, key, user 정보에 대한 secret key를 생성한다.
2. GitHub Actions -> self hosted 수신 설정
github Actions에서 new self-hosted runner 연결을 하는 과정을 진행해야 한다.
runs-on: self-hosted 를 통해 ec2에서 이후 명령이 동작하도록 설정하자.
- GitHub Setting -> Actions -> Runners -> new self-hosted를 눌러 새로 생성한다!

위 빨간 줄까지만 EC2에서 실행한다.
3. Workflow 수정
# 이전 과정
...
run-docker-image-on-ec2:
# application-build 위 과정이 완료되어야 실행.
needs: application-build
runs-on: self-hosted
steps:
# 1. 최신 이미지를 풀받습니다
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/[image명]
# 2. 기존의 컨테이너를 중지시킵니다
- name: docker stop container run-docker-image-on-ec2:
needs: build-docker-image
#push 했을 때만 배포가 진행되도록
if: github.event_name == 'push'
runs-on: self-hosted
steps:
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKER_USERNAME }}/clerker:latest
- name: docker stop container
run: sudo docker stop clerker:latest || true
- name: docker run new container
run: sudo docker run --name github-actions-demo --rm -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/clerker:latest
- name: delete old docker image
run: sudo docker image prune -f
run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true
# 3. 최신 이미지를 컨테이너화하여 실행시킵니다
- name: docker run new container
run: sudo docker run -d --rm -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/[image명]
# 4. 미사용 이미지를 정리합니다
- name: delete old docker image
run: sudo docker system prune -f
1. key : EC2 인스턴스를 생성할 때 발급받은 키
.pem 파일 => Linux terminal에서 cat "파일명.pem" 명령어를 통해 확인 가능.
2. host : EC2 서버 IP주소
3. username : EC2 유저 이름
AWS Linux를 사용한다면 기본값은 ec2-user이다. EC2 인스턴스에서 whoami 명령어로 확인 가능!
4. script | 명령어
위 코드에서 보는 것처럼 각 명령어들을 실행한다. 명령어들을 살펴보도록 하자.
- 현재 실행 중인 도커 image 중지
$ sudo docker stop [dockerHub_ID]/[image명]
또는
$ sudo docker rm -f [dockerHub_ID]/[image명]
또는
$ sudo docker rm -f $(sudo docker ps -qa) // 현재 실행중인 이미지
- 미사용중인 images 삭제
$ sudo docker system prune -f
- 최신화된 docker image pull
$ sudo docker pull [dockerHub_ID]/[image명]
- docker image 실행
$ sudo docker run --rm -d -p 8080:8080 [dockerHub_ID]/[image명]
- --rm : 현재 컨테이너를 실행 후 종료 시 삭제하는 옵션
- -d : background에서 실행
- -p : port 설정
3. image monitoring
백그라운드로 실행 중인 image 로그를 확인하기 위해 다음과 같은 명령어를 실행할 수 있다.
# 컨테이너의 모든 로그를 보여주고, 로그를 실시간 모니터링 가능.
sudo docker logs -f [container_id]
전체 코드
name: CI/CD with Gradle and Docker
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build-docker-image:
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: Setup application.yml
run: |
cd ./src/main/resources
touch ./application-db.yml
touch ./application-aws.yml
touch ./application-jwt.yml
touch ./application-swagger.yml
touch ./application-oauth.yml
# 각각의 시크릿을 개별 파일로 저장
echo "${{ secrets.APPLICATION_DB }}" >> ./application-db.yml
echo "${{ secrets.APPLICATION_AWS }}" >> ./application-aws.yml
echo "${{ secrets.APPLICATION_JWT }}" >> ./application-jwt.yml
echo "${{ secrets.APPLICATION_SWAGGER }}" >> ./application-swagger.yml
echo "${{ secrets.APPLICATION_OAUTH }}" >> ./application-oauth.yml
shell: bash
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Build with Gradle Wrapper
run: ./gradlew clean build -x test
- name: docker image build
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/clerker:latest .
# DockerHub 로그인
- name: docker login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker Hub 이미지 푸시
- name: docker Hub push
run: docker push ${{ secrets.DOCKER_USERNAME }}/clerker:latest
run-docker-image-on-ec2:
needs: build-docker-image
#push 했을 때만 배포가 진행되도록
if: github.event_name == 'push'
runs-on: self-hosted
steps:
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKER_USERNAME }}/clerker:latest
- name: docker stop container
run: sudo docker stop clerker:latest || true
- name: docker run new container
run: sudo docker run --name github-actions-demo --rm -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/clerker:latest
- name: delete old docker image
run: sudo docker image prune -f
참고
https://tesseractjh.tistory.com/275
https://growth-coder.tistory.com/224
[Spring] 깃허브 액션(github action)과 도커(docker)를 사용하여 스프링 부트 서버 CI/CD 구축하기
이전에 github action만 이용해서 CI/CD를 구축하는 방법과 github action과 aws codedeploy를 사용하여 CI/CD를 구축하는 방법에 대해 알아보았다. [Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트) CI/CD
growth-coder.tistory.com
https://e-room.tistory.com/171#2.%20CD%20%EA%B3%BC%EC%A0%95%20%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0%20(%EB%B0%B0%ED%8F%AC%20%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0)-1
Docker + Github Actions로 SpringBoot CI/CD 구축하기
목표 : 깃허브 커밋을 하면 자동으로 EC2에 반영되도록 하는 CD/CD를 구축한다. 지난번에는 Docker를 이용하여 Spring boot 애플리케이션을 EC2에 배포를 했습니다. 이번에는 해당 과정을 로컬환경에서
e-room.tistory.com
https://e-room.tistory.com/145
Spring-boot Github Actions를 이용한 자동배포
Github Actions를 이용하여 EC2, Linode 등 ubuntu 서버에 자동배포를 알아보겠습니다. 우선 본인의 서버 pc에 접속하여 기본적인 세팅을 해줍시다. sudo apt update # 각자 원하는 버전을 설치하시면 됩니다 su
e-room.tistory.com
'Infra & Cloud > Docker' 카테고리의 다른 글
[Docker] Docker 사용 명령어 총정리 (0) | 2024.05.14 |
---|---|
[Infra] EC2 + GitHub Action + Docker를 이용한 CI / CD 구현 (1) (1) | 2024.05.12 |