인프라/CI, CD

GitHub Actions로 CI/CD 파이프라인 구축하고 cloudtype에 배포하기

Griotold 2024. 12. 11. 12:44

1. Spring Boot Application을 GitHub Actions로 배포하기

개념도

 

코드를 GitHub에 push하면 Github Actions가 cloudtype에 배포해준다.

 

2. pull request 생성할 때 테스트하고, main에 push 할 때 배포하기

  1. feature/* 브랜치를 만들어서 test 코드를 포함한 수정 작업을 완료한 뒤 pull request 생성
  2. Github Actions가 pull request 이벤트를 감지하고 해당 브랜치에 대해 gradle test를 수행
  3. test가 실패한 경우, test 코드를 수정하여 pull request에 반영
  4. pull request가 승인되면 main 브랜치에 merge되고 
  5. cloudtype 서버에 배포 

 

3. cloudtype이란?

cloudtype은 컨테이너 기반의 Paas(Platform as a Service) 클라우드 서비스이다.

 

3 - 1. 주요 특징

  • 간편한 배포 프로세스
  • GitHub 코드를 클라우드 서버에 직접 배포 가능
  • 무료 서비스 제공
  • 프리뷰 도메인과 HTTPS(TLS) 인증서 자동 발급

 

4. yml 파일 생성

.github/workflows에 deploy-main.yml 파일과 test-pr.yml 파일을 만든다.

위에서 설명한 것 처럼 pull request 이벤트가 감지되면 test-pr.yml에 의해 Github Actions가 동작하게 되고,

main에 push 이벤트가 감지되면 deploy-main.yml 에 의해 동작하게 된다.

 

4 - 1. test-pr.yml

name: test every pr

on:
  workflow_dispatch:
  pull_request:
permissions:
  contents: read
  pull-requests: read
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: setup jdk
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: gradle
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
      - name: gradlew test
        run: ./gradlew test

steps 항목에서 맨 마지막에 ./gradlw test를 수행하고 있다.

 

4 - 1 - 1. `./gradlew test` 와 `./gradelw clean test`

일반적인 개발 과정에서는 `./gradlew test`를 사용하는 것이 효율적이다.

`./gradlew clean test`는 이전 빌드의 영향을 받지 않는 깨끗한 환경에서 테스트를 실행하므로

  • 빌드나 테스트에 문제가 있을 때
  • CI/CD 파이프라인에서 실행할 때
  • 최종 검증이 필요할 때

사용하면 적절하다.

따라서, 맨 마지막을 `./gradlew clean test`로 고치자

      - name: gradlew test
        run: ./gradlew clean test

 

4 - 2. deploy-main.yml

name: Deploy to cloudtype
on:
  workflow_dispatch:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Connect deploy key
        uses: cloudtype-github-actions/connect@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          ghtoken: ${{ secrets.GHP_TOKEN }}
      - name: Deploy
        uses: cloudtype-github-actions/deploy@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          project: gotjd9773/github-ci-cd
          stage: main
          yaml: |
            name: cicd
            app: java@17
            options:
              ports: 8080
            context:
              git:
                url: git@github.com:${{ github.repository }}.git
                ref: ${{ github.ref }}
              preset: java-springboot

현 시점에서 동작하지 않는 설정 파일이고,

cloudtype 토큰들을 입력해야하고 과 project 항목을 적절하게 변경해야 한다.

 

5. Github 설정 - cloudtype과 연동하기 위한 설정

https://github.com/settings/tokens 로 이동

5 - 1. Github Personal Token 발급하기

Github Personal Token을 생성하고 설정에서 secret으로 추가하는 작업이 필요하다.

 

Developer setting > Personal access tokens (classic)

Generate new token - Generate new token(classic)

 

필요 권한

  • repo
  • admin:public_key

 

토큰 생성이 완료되면 토큰 값이 표시된다.

토큰은 생성 시 최초 한 번만 값을 확인할 수 있으므로,

메모장에 복사에서 안전하게 관리해야 한다.

 

5 - 2. cloudtype 설정

cloudtype의 API Key 발급

오른쪽 상단 톱니바퀴 아이콘을 클릭하여 스페이스 설정 화면

계정 설정 탭에 인증 카테고리를 선택하고 새로운 API 키 생성 버튼 클릭

표시된 API 키 값은 다시 조회할 수 없으므로 메모장에 보관해야 한다.

 

5 - 3. cloudtype 프로젝트 생성

언어 프레임워크에 Spring Boot가 없다면, JVM 또는 Java를 선택한다.

버전을 프로젝트에 맞게 설정한다.

배포하기를 누르면 일단 실패한다.

아직 토큰들을 입력해주지 않았기 때문이다.

 

5 - 4. Github 설정

앞서 생성한 GitHub Personal Token을 저장소에 추가해준다.

Settings > Secrets > New repository secret

GitHub Personal token: GHP_TOKEN

 

cloudtype API Key: CLOUDTYPE_TOKEN

 

 

6. deploy-main.yml 에 project 항목 수정

cloudtype의 워크스페이스 이름과 프로젝트 이름을 확인한뒤

워크스페이스명/프로젝트명 

을 project 항목에 기입해준다.

 

        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          project: gotjd9773/github-ci-cd
          stage: main
          yaml: |

 

7. Actions 탭에서 deploy 확인

 

8. 배포 확인

cloudtype에서 접속하기 버튼을 클릭