Github Actions는 Github 리포지토리에서 소프트웨어 빌드, 테스트, 배포 등의 작업을 자동화할 수 있도록 Github에서 제공하는 서비스이다. 이를 활용하여 Pull Request 요청시 자동으로 테스트가 진행되도록 설정해보자.
환경
- JDK 17
- Spring Boot 3.1.5
- IDE : Intellij
워크플로우는 Github Actions에서 실행할 작업들을 정의한 설정 파일이며 .github/workflows
디렉토리에 저장된다. 디렉토리를 생성한 뒤 pr-test.yml
워크플로우 파일을 생성하였다.
on
: 이벤트 트리거
Job
: 워크플로우 내에서 실행되는 단일 작업 단위
Step
: 각 Job 내에서 수행할 작업 추가
필요에 따라 외부 Action 사용 가능
name: PR Test
on:
pull_request:
branches: [ "main" ] # main branch에 PR을 보낼 때 실행
jobs:
test:
runs-on: ubuntu-latest # 우분투 가상환경
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
# Gradle wrapper 파일 실행 권한주기
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle test 실행
- name: Test with Gradle
run: ./gradlew --info test
# 테스트 후 Result 출력
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v1
if: ${{ always() }} # 'always' : 테스트 실패해도 Result 출력
with:
files: build/test-results/**/*.xml
# 캐시 파일 삭제
- name: Cleanup Gradle Cache
if: ${{ always() }}
run: |
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties
⚠️ 테스트 후 출력되는 Result를 보기 위해서는 Github 리포지토리의 Settings -> Actions -> General
의 Workflow permissions
이 Read and wirte permissions
로 설정되어 있어야 한다.
이후 main에 PR 요청을 하면 자동으로 test가 실행되고 result를 보여준다.
result를 설정하든 설정하지 않든 성공/실패 여부는 하단에서 확인할 수 있다.
Github Actions에 환경 변수 설정하다가 상당히 애를 먹었는데 문제점을 찾는것도, 해결하는것도 쉽지 않았던터라 이 글에 남겨두려 한다. (해결하고 보니 어려운 문제는 아니었지만...
테스트가 진행되다가 403 에러가 발생했다. 이는 application-test.properties
파일에 JWT_SECRET_KEY 값이 존재하지 않아 발생하였고 키 값을 넣어주니 해결되었다.
깃허브에 시크릿키를 그대로 노출시킬 수는 없으니 환경 변수로 바꾸어 다시 테스트를 진행하였다. 그러나 이때 통합 테스트 파일에서 계속 initializationError -> JWT_SECRET_KEY 값을 읽어오지 못하는 에러가 발생했다. 여러 번의 시도 끝에 workflow yml 구문 오류임을 깨달았다. 다음은 설정 방법이다.
Github Actions에 환경 변수 설정하는 법
env
설정jobs:
test:
runs-on: ubuntu-latest
env:
JWT_SECRET_KEY: ${{ secrets.JWT_SECRET_KEY }}
steps:
- uses: actions/checkout@v2
Settings -> Secrets and variables -> Respository secrets
에 환경 변수 선언이렇게 해주면 secrets의 환경 변수를 읽어올 수 있다. 방법이 어렵지 않은데 env를 엉뚱한 곳에 선언을 해서 삽질을 한창한걸 생각하면 눈물이 앞을 가릴지도... 아무튼 해결했으니 되었다.