본문 바로가기

[Server] GitHubActions와 Docker 로 CICD 구축하기

민이(MInE) 2024. 5. 10.
반응형

 

 

 

이제 GitHub Actions와 Docker로 CICD를 만들어보겠습니다 ~

저는 Spring Boot 프로젝트를 하나 만들어 만들어보았습니다 ~!

 

우선 github에 repository를 하나 파주고 안에 Spring Boot 프로젝트를 올려줍니다.

그리고 Settings -> Secrets and variables -> Actions에 Docker Hub의 username과 password를 추가해줍니다.

 

 

 

그리고 Actions 로 들어가서 빌드 툴을 Java with Gradle로 만들어줍니다. 그러면 gradle.yml을 수정하는 페이지가 나올건데 아래와 같이 수정해줍니다 ! 

 

name: Java CI with Gradle

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

permissions:
  contents: read

jobs:
  build-docker-image:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Gradle 래퍼에 실행 권한 설정
      run: chmod +x ./gradlew

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

    - name: Gradle로 빌드
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean bootJar

    - name: 도커 이미지 빌드
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test .

    - name: 도커 로그인
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}

    - name: 도커 허브에 푸시
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test

 

 

그리고 커밋을 하고 조금 기다리면 ~ 아래와 같이 성공합니다

 

 

 

여기까지 하면 Docker Hub에 이미지를 올리는 것은 완료되었습니다.

이제 배포 자동화 과정인 CD 를 구축해보겠습니다.

 

우선 Settings -> Actions -> Runners -> New self-hosted runner 를 순서대로 클릭해줍니다.

 

그다음 Linux를 클릭하고 마지막의 .run.sh를 제외하고 EC2 서버에서 모두 실행시켜줍니다

 

 

 

위 과정을 다 하셨으면 gradle.yml을 아래와 같이 수정합니다.

 

name: Java CI with Gradle

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

permissions:
  contents: read

jobs:
  build-docker-image:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Gradle 래퍼에 실행 권한 설정
      run: chmod +x ./gradlew

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

    - name: Gradle로 빌드
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean bootJar

    - name: 도커 이미지 빌드
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test .

    - name: 도커 로그인
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}

    - name: 도커 허브에 푸시
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test

  run-docker-image-on-ec2:
    needs: build-docker-image
    runs-on: self-hosted

    steps:

      - name: docker pull
        run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test

      - name: docker stop container
        run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true

      - name: docker run new container
        run: sudo docker run --name github-actions-test --rm -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test

      - name: delete old docker image
        run: sudo docker system prune -f

 

 

그리고 Spring Boot 프로젝트를 수정하고 원격 저장소에 푸시를 하면 !!

 

 

이렇게 배포 자동화가 되어 main브랜치에 push 또는 pull-request가 수행되면 자동으로 최신화되어 서버가 배포됩니다.

 

반응형

댓글