본문 바로가기
프로젝트/RanDrive

Github Actions를 통한 CI/CD 구축(Docker + EC2)

by HWK 2023. 10. 10.

Runner

먼저 코드를 입력하기 전에 Git Bash를 통해 EC2 서버에 접속해 다음과 같은 과정을 실행한다.

Setting -> Actions -> Runner -> New self-hosted runner 이후 아래의 코드를 하나씩 입력해준다.

 

CI/CD

이후 아래와 같은 코드를 작성해준다. Actions -> new workflow에서 자신의 환경에 맞는 workfolw를 선택해준다.

name: Spring Boot Gradle CI/CD

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:
    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'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with Gradle
      run: ./gradlew build
      
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}
      
    # Docker 이미지 빌드
    - name: Docker Image Build
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/dockeract .

    # DockerHub Push
    - name: DockerHub Push
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/dockeract
      
    # 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 xenodochial_swirles
          sudo docker rm -f xenodochial_swirles
          sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/dockeract
          sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dockeract
          sudo docker run -p 8080:8080 --name xenodochial_swirles -d ${{ secrets.DOCKERHUB_USERNAME }}/dockeract

각각의 secret key에 대한 설명은 아래와 같다.

DOCKERHUB_USERNAME:
Docker Hub 계정의 사용자 이름을 나타냅니다. Docker 이미지를 빌드하고 푸시할 때 사용됩니다.
Docker Hub에 로그인하고 이미지를 업로드하려면 필요합니다.

DOCKERHUB_TOKEN:
Docker Hub 계정의 액세스 토큰 또는 패스워드를 나타냅니다. 이는 Docker Hub에 로그인할 때 사용됩니다.
보안을 위해 액세스 토큰을 사용하는 것이 좋습니다.

EC2_HOST:
EC2 인스턴스의 호스트 주소(IP 주소 또는 도메인 이름)를 나타냅니다.
SSH 연결을 설정하고 EC2 인스턴스로 접속할 때 사용됩니다.

EC2_USERNAME:
EC2 인스턴스에 SSH로 접속할 때 사용될 유저 이름을 나타냅니다.
대부분의 경우 이는 "ubuntu" 또는 "ec2-user"가 될 것입니다.

EC2_KEY:
EC2 인스턴스에 SSH로 접속할 때 사용될 프라이빗 키파일의 내용입니다.
SSH 연결을 설정하고 EC2 인스턴스로 안전하게 접속할 수 있도록 합니다.

 

과정

Step 1: 코드 체크아웃

- uses: actions/checkout@v3

Step 2: JDK 설치

- name: Set up JDK 17
  uses: actions/setup-java@v3
  with:
    java-version: '17'
    distribution: 'temurin'

Step 3: Gradle build

- name: Build with Gradle
  run: ./gradlew build

Step 4: Docker login

- name: Login to DockerHub
  uses: docker/login-action@v2
  with:
    username: ${{secrets.DOCKERHUB_USERNAME}}
    password: ${{secrets.DOCKERHUB_TOKEN}}

Step 5: Docker 이미지 빌드 및 푸시 

- name: Docker Image Build
  run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/dockeract .

- name: DockerHub Push
  run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/dockeract

Step 6: 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 xenodochial_swirles
      sudo docker rm -f xenodochial_swirles
      sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/dockeract
      sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dockeract
      sudo docker run -p 8080:8080 --name xenodochial_swirles -d ${{ secrets.DOCKERHUB_USERNAME }}/dockeract

위의 sudo docker kill xenodochial_swirles 등에서 보이는 xenodochial_swirles는 컨테이너의 이름이다. 그냥 이미지 이름과는 다르다.

처음에 Git Bash로 접속한 EC2 환경에거 sudo docker ps를 쳐보면 맨 마지막 부분에 Names가 있는데, 바로 그 부분이다.

 

주의할 점

EC2를 삭제 후 재구매시 그에 맞는 환경을 secret key에 잘 저장해 놓도록 하자.

 

'프로젝트 > RanDrive' 카테고리의 다른 글

Random-Drive-Project 기본 MVC 구현(기본 네비게이션)  (1) 2023.10.14
팀 Repo에 Docker및 CI/CD 구축  (1) 2023.10.11
Docker와 EC2 사용한 배포  (0) 2023.10.08
Docker 적용  (1) 2023.10.07
SA 설계 마치기  (0) 2023.10.06