프로젝트 테크 리더를 수행하면서 팀원들의 코드를 머지하고, 리뷰하는 일이 많아졌다. issue 브랜치를 week별 브랜치에 머지할때 실제로 팀원들의 코드가 제대로 동작하는지 일일이 빌드하기에는 시간요소가 많이 들었다. 또한 테스트 코드가 터지는지 일일이 돌리는 것도 시간이 너무 많이 들어서 해결책을 찾아야 했다.
github-actions를 통해 배포자동화가 가능하다면, 테스트 자동화 또한 가능하지 않을까? 라는 생각이 들었고 구글링을 하며 PR, Push등 몇몇 트리거를 통해 자동으로 테스트하고 테스트 결과를 PR 코멘트에 자동을 등록하는 방법을 찾았다
https://creampuffy.tistory.com/190#%ED%95%99%EC%8A%B5%20%EB%B0%A9%EB%B2%95-1
위 블로그가 많은 도움이 되었다.
deploy.yml을 쓰는 방법과 동일하게
.github/workflows/파일명.yml로 스크립트를 작성하면 된다.
나는
.github/workflows/test.yml 로 작성하였다.
name: Test
on:
pull_request:
branches: [ "Develop", "Master", "Weekly-8","Weekly-9", "issue/*" ]
permissions: write-all
jobs:
test:
runs-on: ubuntu-latest
# set up java
steps:
- name: Checkout Repository # 저장소를 체크아웃합니다.
uses: actions/checkout@v4
- name: Cache Gradle dependencies # 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: Set up JDK 21 # JDK 21을 설정합니다.
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
- name: Gradle 명령 실행을 위한 권한을 부여합니다
run: chmod +x ./gradlew
- name: Gradle build를 수행합니다.
run: ./gradlew clean build -Dspring.profiles.active=test
- name: 테스트 결과를 PR에 코멘트로 등록합니다
uses: EnricoMi/publish-unit-test-result-action@v1
if: always()
with:
files: '**/build/test-results/test/TEST-*.xml'
- name: 테스트 실패 시, 실패한 코드 라인에 Check 코멘트를 등록합니다
uses: mikepenz/action-junit-report@v3
if: always()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
token: ${{ github.token }}
on:
pull_request:
branches: [ "Develop", "Master", "Weekly", "issue/*" ]
permissions: write-all
나는 "Develop", "Master", "Weekly", "issue/*" 브랜치에 pull_request 동작에 대해서, 위 스크립트를 실행하도록 작성하였다.
이때 permissions이 중요했는데, 위 권한을 설정하지 않으면 PR에 comment를 남길수 없다.
- name: Cache Gradle dependencies # 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-
처음 test.yml 을 작성했을때에는 위부분이 없었다. 테스트 시간이 너무 오래걸려서 캐싱을 통해 시간을 단축시키고자 캐시하는 부분을 넣었다.아래와 같은 장점이 있다고 한다
- name: 테스트 결과를 PR에 코멘트로 등록합니다
uses: EnricoMi/publish-unit-test-result-action@v1
if: always()
with:
files: '**/build/test-results/test/TEST-*.xml'
테스트 결과를 로그를 통해 일일이 확인하기 번거롭기 때문에 PR에 코멘트로 테스트 결과를 달아주어 편의성을 높였다.

위 이미지를 참고



테스트가 실패할 시 실패한 코드 라인에 check 코멘트를 달아줆으로서 pr을 날릴때 바로 피드백을 받아볼수 있게 작성하였다.
테스트를 자동화하면서 팀원간 협업할 때 코드리뷰와 머지할때 드는 리소스를 상당부분 줄일 수 있었다. 특히 팀원의 코드가 제대로 작성이 된것인지 바로바로 알기때문에 안정성 면에서 효과를 많이 보았던 것 같다.