Yebali

GitHub Action으로 PR 마다 빌드 테스트 하기 본문

Etc

GitHub Action으로 PR 마다 빌드 테스트 하기

예발이 2022. 1. 25. 22:23

회사에서 개발을 하며 가끔씩 전체 테스트를 돌려보지 않고 PR을 요청하여
Prod/Dev 서버에 배포를 하는 도중 에러가 난적이 있다.

이런 경우를 방지하기 위해 GitHub Action을 통해서 PR이 발생할 때마다, 테스트를 진행하여 배포 중 발생할 수 있는 문제를 방지하기로 했다.

GitHub Action이란?

Github Action은 Github 저장소를 기반한 Workflow 자동화 도구이다.
Github 내부에서 프로젝트를 빌드, 테스트, 배포 등을 지원하는 CI/CD 도구이다.

GitHub Action의 주요 개념

Workflow

Workflow는 프로젝트를 빌드, 테스트 또는 배포하기 위한 전체적인 프로세스이다.
여러 개의 Job으로 구성되어 event기반으로 동작한다.

Event

Workflow를 실행시키는 특정 활동이나 규칙(Trigger)
ex) 특정 브랜치로 Push, 특정 브랜치로 Pull Request

Job

Job은 여러 Step으로 구성되고 가상 환경의 인스턴스에서 실행된다.
다른 Job에 의존 관계를 가질 수 있고, 독립적으로 병렬 실행도 가능하다.

Step
Task들의 집합으로 커맨드를 날리거나 action을 실행할 수 있다.

Action

Workflow의 가장 작은 블록.
Job을 만들기 위해 Step들을 연결할 수 있다.


Runner

Gitbub Action Runner 애플리케이션이 설치된 머신으로, Workflow가 실행될 인스턴스
Github-hosted runner는 Azure의 Standard_DS2_v2로 vCPU 2, 메모리 7GB, 임시 스토리지 14GB의 사양을 가진다.

Action 생성하기

GitHub Repository에서 Actions를 클릭한다.


gradle을 이용한 workflow를 생성하기 위해 미리 정의된 템플릿을 사용하면 더 쉽게 작성할 수 있다.

workflow를 작성 후 Start commnit을 클릭하면 repository/.github/workflows/??.yml 파일이 생성된다.


아래는 기본 템플릿에서 생성된 .yml파일로 Master 브랜치에 Push 또는 Pull Request가 올 경우 실행되는 스크립트이다.

name: Java CI with Gradle # 이벤트를 정의하는 부분 # master 브랜치에 Push나, Pull Request가 발생할 경우 workflow가 실행된다. on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: # build가 진행될 환경 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 # JDK 환경 설정 - name: Set up JDK 11 uses: actions/setup-java@v2 with: java-version: '11' distribution: 'temurin' # gradle build 실행 - name: Build with Gradle uses: gradle/gradle-build-action@4137be6a8bf7d7133955359dbd952c0ca73b1021 with: arguments: build


아래는 내가 실제로 작성한 부분이다.

name: pre_test_before_merge on: pull_request: branches: - "**" # 모든 브랜치에 Pull Request가 발생하면 workflow 실행 jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 11 uses: actions/setup-java@v2 with: java-version: 11 distribution: 'temurin' # Root Project 경로를 환경변수로 등록 - name: Set root project path as env variable run: echo "PROJECT_LOCATION=$PWD/mid-reservation" >> $GITHUB_ENV # Gradle wrapper 파일 실행 권한 부여 - name: Grant execute permission for gradlew run: chmod +x $PROJECT_LOCATION/gradlew # Gradle test를 실행 - name: Test with Gradle run: $PROJECT_LOCATION/gradlew -p $PROJECT_LOCATION test


참고로 workflow중 사용되는 환경변수를 설정해주기 위해서는 아래와 같은 방법을 사용해야 한다.

echo "PROJECT_LOCATION=$PWD/mid-reservation" >> $GITHUB_ENV


그리고 만약 gradlew 명령어 사용 시 root project의 위치가 맞지 않아 아래와 같은 에러가 발생할 수 있다.

Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* What went wrong:
Task 'test' not found in root project 'mid-reservation'.



* Try:
Run gradlew tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s

이때는 gradlew의 -p 옵션을 사용하여 root project의 위치를 주정해주면 정상적으로 빌드할 수 있다.

설정을 완료한 후 RP을 보냈을 때, 아래와 같이 테스트가 진행됨을 볼 수 있다.

'Etc' 카테고리의 다른 글

[Jenkins] Jenkins를 이용한 CI/CD  (0) 2022.09.11
Confluence OAuth 2.0 인증하기  (0) 2021.12.14
Confluence Cloud Basic REST API 사용법  (0) 2021.12.14
Git 사용법  (0) 2021.10.30