본문 바로가기

Development/Spring

[Spring]Github Actions로 Springboot CI 구현하기, postgres 설정

여기서 CI/CD란?

CI/CD는 Continuous Integration(지속적 통합) / Continuous Delivery(지속적 전달)의 줄임말입니다.

애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 배포할 수 있습니다.
CI/CD는 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제(일명 "통합 지옥(integration hell)")를 해결하기 위한 솔루션입니다.

 

"CI"는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다.  지속적인 통합이 제대로 구현되면 애플리케이션 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 리포지토리에 병합됩니다. 따라서 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌하는 문제를 이 방법으로 해결할 수 있습니다.

 

"CD"는 지속적인 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환하여 사용됩니다. 두 가지 의미 모두 파이프라인의 추가 단계에 대한 자동화를 뜻하지만 때로는 얼마나 많은 자동화가 이루어지고 있는지를 설명하기 위해 별도로 사용되기도 합니다. 지속적인 통합(CI)을 통해 만들어진 결과물을 자동화된 프로세스를 통해 릴리스 과정을 자동화하고, 사용자에게 빠르게 새로운 기능을 제공할 수 있습니다.

 

Github Actions

github에서 공식적으로 제공하는 CI / CD 툴(개발 워크 플로우 자동화 툴)이라고 보면 됩니다.

Actions탭을 클릭 후 New workflow를 클릭하면 다음과 같은 페이지로 이동합니다.

여러 프레임워크 및 언어를 위한

저는 Spring build tool로 Gradle을 사용하기 때문에 Java with Gradle을 사용하였습니다.

 

생성되는 파일과 Path는. github/workflows/gradle.yml입니다.

아래는 초기 설정입니다.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI with Gradle

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

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build

 

 

졸업 프로젝트에서 사용한 gradle.yml입니다. 

name: SpringBoot CI with Gradle

on:
  push:
    branches:
      - '**'
      - '!master'
  pull_request:
    branches:
      - '**'
      - '!master'

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      working-directory: ./api
    defaults:
      run:
        working-directory: ${{ env.working-directory }}
    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_USER: 
          POSTGRES_PASSWORD: 
          POSTGRES_DB: 
          POSTGRES_HOST: localhost
          POSTGRES_PORT: 5432
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
    steps:
      - uses: actions/checkout@v3

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

      - name: Cache gradle
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

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

      - name: Run Test
        run: ./gradlew test

      - name: Publish Test Results
        uses: EnricoMi/publish-unit-test-result-action@v2
        if: always()
        with:
          files: |
            api/build/test-results/**/*.xml

위에서부터 차근히 살펴보겠습니다.

 

name: Workflow의 이름을 나타냅니다.
on: Workflow가 실행되는 조건을 지정합니다. 위의 코드에서는 push 이벤트와 pull_request 이벤트가 발생했을 때, master 브랜치가 아닌 모든 브랜치에서 Workflow가 실행되도록 설정되어 있습니다.
jobs: 이 Workflow가 수행하는 작업을 정의합니다. 위의 코드에서는 build라는 이름의 작업이 정의되어 있습니다.
runs-on: 이 작업이 실행되는 환경을 지정합니다. 위의 코드에서는 ubuntu-latest 환경에서 실행되도록 설정되어 있습니다.
env: 이 작업에서 사용하는 환경 변수를 지정합니다. 위의 코드에서는 working-directory 변수를 지정하여 작업 디렉터리를 지정하고 있습니다.
services: 이 작업에서 사용하는 서비스를 지정합니다. 

postgres:

- image: 실행할 이미지를 지정합니다. 이 경우, PostgreSQL 14 버전 이미지인 postgres:14를 사용합니다.
-
 env: 컨테이너에서 사용할 환경 변수를 지정합니다. 
- POSTGRES_USER: 데이터베이스의 사용자 이름
- POSTGRES_PASSWORD: 사용자의 비밀번호
- POSTGRES_DB: 데이터베이스의 이름
- POSTGRES_HOST: 호스트 이름
- POSTGRES_PORT: 포트 번호
- ports: 컨테이너와 호스트 간의 포트 포워딩을 설정합니다. 이 경우, PostgreSQL 데이터베이스에서 사용하는 기본 포트인 5432를 호스트의 5432 포트와 연결합니다.
- options: 컨테이너를 실행할 때 추가적인 옵션을 설정합니다. 이 경우, PostgreSQL 데이터베이스가 실행되는 동안 컨테이너 상태를 모니터링하기 위한 옵션을 설정합니다.
--health-cmd pg_isready: pg_isready 명령을 사용하여 PostgreSQL 데이터베이스의 상태를 모니터링합니다.
--health-interval 10s: pg_isready 명령을 실행하는 주기를 10초로 설정합니다.
--health-timeout 5s: pg_isready 명령이 실행되는 최대 시간을 5초로 설정합니다.
--health-retries 5: pg_isready 명령을 재시도할 횟수를 5회로 설정합니다.

 

steps: 이 작업에서 수행하는 일련의 단계를 정의합니다. 위의 코드에서는 아래와 같은 단계가 수행됩니다.
actions/checkout@v3 단계: Git 저장소에서 코드를 체크아웃합니다.
actions/setup-java@v3 단계: JDK 11을 설치하고 환경 변수를 설정합니다.
actions/cache@v3 단계: Gradle 캐시를 저장하고 복원합니다.

  • uses: 이 액션에서 사용할 GitHub Actions를 지정합니다. 이 경우, actions/cache@v3를 사용하고 있습니다.
  • with: 이 액션에서 사용할 입력값을 지정합니다. 여기서는 path, key, restore-keys를 사용하고 있습니다.
    • path: 캐시로 사용할 파일 또는 디렉토리를 지정합니다. 이 경우, Gradle 캐시 파일이 저장된 경로인 ~/.gradle/caches와 ~/.gradle/wrapper를 지정합니다.
    • key: 캐시의 고유 키를 지정합니다. 이 키는 캐시를 검색하거나 저장할 때 사용됩니다. 여기서는 러너의 운영 체제(${{ runner.os }})와 Gradle 설정 파일의 해시값($hashFiles('**/*.gradle*', '**/gradle-wrapper.properties'))을 조합하여 고유 키를 생성합니다.
    • restore-keys: 캐시를 검색할 때 사용할 키를 지정합니다. 이 경우, 러너의 운영 체제(${{ runner.os }})와 "gradle"을 조합하여 키를 생성합니다.

 

./gradlew clean build: Gradle 빌드를 실행합니다.

./gradlew test: Gradle 테스트를 실행합니다.

EnricoMi/publish-unit-test-result-action@v2 단계: 테스트 결과를 게시합니다.

여기서 EnricoMi는 자동화된 테스트 실행 후, 테스트 결과를 깃허브에 게시하는 기능을 수행합니다.

자세한 내용은 아래 github에서 확인하실 수 있습니다.

https://github.com/EnricoMi/publish-unit-test-result-action

 

Actions에서 동작하는 모습

 

 

참고 자료:

https://hwasurr.io/git-github/github-actions/

 

Github Actions를 이용해 CI/CD 파이프라인 구성하기

Github Actions를 통해 코드 변경사항 반영에 따라 진행되는 workflow를 자동화하는 과정에 대해 기록합니다.

hwasurr.io

https://velog.io/@sontulip/github-actions-ci

 

Github Actions를 이용해 CI 구성하기 (Java, Gradle, Jacoco)

소개 Github Actions는 Github에서 제공하는 CI/CD 툴입니다. Github이 서버를 제공해주기 때문에 따로 CI/CD를 위한 서버를 구성해주지 않아도 되어 부담이 적고 간편하게 설정할 수 있다는 장점이 있습니

velog.io

https://www.redhat.com/ko/topics/devops/what-is-ci-cd