백엔드 공부

CI/CD 정리 3편 - Github Actions 를 통해 CD 실습해보기

김용녀 2024. 1. 30. 09:00

 

 

바로 CD 를 작성해보자!

 

ci랑 cd를 같이 작성하는 사람들도 있는데, 우린 분리해서 작성했다.

 


CD 작성 전 , 필요한 것

 

- Docker 회원 가입 및 설치

 

- Aws 회원 가입 및 ec2 서버 열기

 

- ec2 서버에서 Docker 설치

 

 

cd 파일은 저 파이프라인 동작 과정을 적는 것이다.(db부분 제외)

 


 

팀프로젝트에선 main - develop - feature branch로 나눠서 작업을 했다.

 

feature에서 분업 후,

develop 에서 데이터를 합쳤기 때문에 

 

CI가 일어나는 부분은 feature - develop 였다.

 

CD (배포하는 과정)는 develop -> main으로 push할 때만 작동하도록 작성했다.

 

name: Java CD with Gradle in smRt store

on:
  workflow_dispatch:
  push:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build-and-push-docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      # push 하기 위해 로그인
      - name: Docker Hub 로그인
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_ID }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      #도커 빌드 & 이미지 push
      - name: Docker build & Push
        run: |
          docker build -f Dockerfile -t ${{ secrets.DOCKER_ID }}/smrt_store .
          docker push ${{ secrets.DOCKER_ID }}/smrt_store

      #docker 파일을 ec2 서버에 배포(pull)
      - name: Deploy to Prod
        uses: appleboy/ssh-action@master
        id: deploy-prod
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_PEM_KEY }}
          port: 22
          script: |
            if [ ! -z "$(docker ps -q)" ]; then
            docker stop $(docker ps -q)
            fi
            if [ ! -z "$(docker ps -aq)" ]; then
            docker rm $(docker ps -aq)
            fi
            docker login -u ${{ secrets.DOCKER_ID }} -p ${{ secrets.DOCKER_PASSWORD }}
            docker pull ${{ secrets.DOCKER_ID }}/smrt_store
            docker run -d \
            --log-driver=awslogs \
            --log-opt awslogs-region=ap-northeast-2 \
            --log-opt awslogs-group=web \
            --log-opt awslogs-stream=log \
            --name smrt_store \
            -p 8080:8080 \
            -e TZ=Asia/Seoul \
            ${{ secrets.DOCKER_ID }}/smrt_store
            
            docker pull redis
            docker run -d \
              --name smrt-redis \
              -p 6379:6379 \
              redis
            
            docker system prune -f

 

 

 



Reference

 

 

https://velog.io/@jmjmjmz732002/%E5%AE%8C-Github-Action-Docker-EC2-Nginx-%ED%99%9C%EC%9A%A9%ED%95%9C-Springboot-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-7-Github-Actions-CICD-docker-compose