Github Actions 를 이용한 CI

황인우·2025년 3월 7일

프로젝트를 진행하면서 새로운 기능을 추가하고 PR을 올려도

해당 코드가 제대로 돌아가는지 알 수 없어서

일단 승인을 하고 개발 브랜치에 병합이 되면 pull 을 해서

테스트가 제대로 돌아가는지 확인해야하는 어려움이 있었다.


아니면 테스트의 실패나 컴파일 오류가 있는데 인지하지 못하고

급하게 PR 을 올려 잘못된 코드가 메인 개발 브랜치에 올라간 적도 있었다.


그래서 이것을 해결하기 위해 깃허브 액션을 사용해

CI, 테스트를 자동화하기로 하였다.


0. 요약

  1. 기본 작업 :
    깃헙액션 워크플로우 yml 파일 작성 후 브랜치 보호 규칙에서 설정

  2. secret 관리 :
    깃허브 설정에서 secret 을 설정하고
    application-secret.yml 과 똑같은 템플릿 파일을 만들어
    워크플로우 작업 중
    템플릿 파일에 secret 변수 값을 넣어 application-secret.yml 로 만듦

<최종 : 깃헙 액션을 통한 CI>

  1. 템플릿 설정파일을 생성한다.
  2. 깃허브에서 리포지터리 시크릿을 설정한다.
  3. 워크플로 파일을 생성한다.
  4. 브랜치 규칙을 설정한다.

1. GitHub Actions 워크플로우 파일 작성

.github/workflows/test.yml 파일을 생성하고 해당 내용을 추가하면 된다.

→ 새로운 파일 생성

→ 워크플로우 파일 생성 (파일 이름은 중요하지 않음)

→ 추가한 내용 저장!

워크플로우 파일 내용

# 워크플로우 이름
name: Run Tests Before Merging

on:
  pull_request: # pull_request 이벤트에 대해 실행
    branches:
      - main  # main 브랜치에 대한 PR 만 해당됨

jobs:
  test: # "test"라는 이름의 작업(job)을 정의
    runs-on: ubuntu-latest # 우분투 최신 버전에서 아래 내용들 실행

    steps: # 각 단계를 정의
    
      # 1. 리포지토리 체크아웃, 해당 리포지토리에서 작업하기 위한 필수 작업
      - name: Checkout repository
        uses: actions/checkout@v4

      # 2. JDK 설정
      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'  # Temurin 배포판
          java-version: '21'       # JDK 21 버전

      # 3. 빌드 및 테스트 실행
      - name: Build and run tests
        run: |
          ./gradlew build --no-daemon # 프로젝트 빌드
          ./gradlew test # 테스트 실행

“ --no-daemon ” ?

  1. CI 환경에서의 안정성:
    • 데몬은 이전 빌드 상태를 유지하려고 하는데 CI 에서 문제가 될 수 있기 때문에 새롭게 빌드하기 위함
    • 예기치 않은 상태나 캐시 문제 생길 수 있음
  2. 메모리 사용 최적화:
    • Gradle 데몬은 백그라운드에서 계속 실행되며 메모리를 사용, CI 환경에서는 빌드가 끝나면 바로 종료되므로 불필요한 메모리 사용을 줄이기 위함
  3. 더 명확한 로그:
    • 데몬과 관련된 로그가 제외되므로, 빌드 및 테스트 결과를 확인할 때 로그가 더 명확해짐

요약:

  • 빌드가 독립적이고 깨끗하게 실행되며, 불필요한 메모리 사용을 줄이고 로그를 더 명확하게 할 수 있습니다.
  • 로컬 개발 환경에서는 Gradle 데몬을 사용하여 빌드 성능을 최적화할 수 있지만,
    CI에서는 매번 깨끗한 빌드를 실행하는 것이 더 중요합니다.

(라고 챗GPT가…)


2. 브랜치 보호 규칙 설정

→ Setting > Rules > Rulesets > New ruleset > New branch ruleset

→ 규칙 이름과 활성화

→ 적용을 원하는 브랜치 이름 설정

→ 아래에 Require status checks to pass 설정하고 + Add checks 에 Job 이름 (워크플로 파일 안에서 설정) 으로 추가

→ Create 로 규칙 생성 > 적용됨

→ 이제 PR 을 올리면 아래 워크플로가 돌아가면서 체크

→ 작업 중인 내용을 클릭하거나 Checks 탭, 혹은 전체 리포지터리의 Actions 탭을 통해 진행상황을 확인할 수 있다.

→ 모든 테스트가 실행되면 결과가 나온다. 테스트를 실패했기 때문에 Merge 버튼이 활성화되지 않음.

→ 진행 내역을 확인해보면 실패한 테스트와 코드 라인 번호까지 알 수 있다.

PostControllerTest > Post 생성 테스트 코드 FAILED
java.lang.AssertionError at PostControllerTest.java:50

“PostControllerTest” 의 “Post 생성 테스트 코드” 라는 테스트가 실패했음을 알 수 있고

50번째 줄의 코드에서 실패했음까지 알 수 있다.

→ 실패한 부분을 수정하면 다시 빌드와 테스트가 진행되고 성공하면 병합 버튼이 활성화돤다.


3. 문제점 : 현재 프로젝트에서는 비공개 설정파일을 사용

.gitignore 파일에서 application-secret.yml 파일을 깃허브에 올라가지 않게 설정했기 때문에

깃허브 액션의 워크플로에서 빌드와 테스트를 진행할 때 문제가 생긴다.

문제 와 해결 예시

→ 컨트롤러 안에 설정파일에서 값을 불러오는 변수를 설정

→ 해당 변수는 application-secret.yml 에서 값을 불러옴

→ application-secret.yml 가 있는 인텔리제이에서는 테스트가 성공하지만 깃헙액션 상으로는 실패함

→ 시크릿 설정파일과 똑같은 템플릿 파일 생성

→ Setting > Secrets and variables > Actions > New repository secret

→ 변수 이름과 값 설정 (Add secret 하면 이 값을 다시 확인할 수 없고 새로운 값으로 변경과 삭제만 가능하니 주의)

→ 워크플로에 application-template.yml 에 시크릿 값을 넣어 application-secret.yml 로 바꾸는 스탭 추가 (덮어쓰기됨)

“ envsubst ”

환경 변수 값을 문자열에서 찾아 실제 값으로 치환(substitution)하는 명령어.
< : 입력 리다이렉션 - 파일 내용을 읽어서 명령어에 전달.
> : 출력 리다이렉션 - 치환된 내용을 해당 파일로 저장.

→ 시크릿 값을 잘 적용하여 빌드 및 테스트 작업 성공, 병합 버튼 활성화


4. 추가

1) gradlew 파일 실행 권한 문제

- name: Grant execute permission to gradlew
  run: chmod +x backend/gradlew

실행 권한이 없어서 추가하는 스탭을 빌드, 테스트 스탭 전에 추가함

2) 프로젝트 디렉토리 문제

- name: Build and run tests
  run: |
    cd backend
    ./gradlew build --no-daemon
    ./gradlew test

프로젝트 안에 backend, frontend 로 디렉토리가 있기 때문에

백엔드 디렉토리 안으로 들어가는 cd backend 추가

0개의 댓글