💻문제점
jacoco로 테스트 커버리지 파일을 생성하고, PR을 보낼 때 커버리지가 Comment로 생성되기를 원했다. 하지만 Comment는 영 나올 생각을 안하고,,, CI도 계속 실패했다.
📃시도
name: Code Coverage sample
on:
push:
branches:
- 'develop'
- 'main'
pull_request:
branches:
- 'develop'
- 'main'
jobs:
code-coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew build jacocoTestReport
- name: Report to CodeCov
uses: codecov/codecov-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./build/reports/jacoco/test/jacocoTestReport.xml
이렇게 git actions workflow를 생성했는데, CODECOV_TOKEN이 없어서 발급받은 후 secrets에 등록해주었다.
그랬더니 다음과 같이 실패하고 마는데...!
로컬에서도 실행해보니 테스트가 실패했다.
application.yml에 profiles:include: secrets을 해줬는데 깃허브에는 gitignore로 설정되어 있어 푸시 되지 않았기 때문
actions main.yml에 동적으로 application-secret.yml 파일을 생성하는 코드 추가해주었다.
- name: Set YML
run: |
echo "${{secrets.APPLICATION_SECRET_YML}}" | base64 --decode > src/main/resources/application-secret.yml
find src
- name: Set TEST YML
run: |
echo "${{secrets.APPLICATION_TEST_SECRET_YML}}" | base64 --decode > src/test/resources/application-secret.yml
find src
오류 없이 workflow가 수행되었다!
그런데 여전히 PR을 보내면 코멘트가 안 써진다.
혹시 내가 설정한게 내가 PR 받을 때 코멘트 써지는 건가 해서 부계정으로 나한테 PR 보내봄 역시 안된다.
actions의 yml 파일도 수정을 해보았는데, Comment는 없었다...!
name: Java CI with Gradle
on:
push:
branches:
- 'main'
pull_request:
branches:
- 'main'
jobs:
code-coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
gradle-version: 7.5.1
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Set YML
run: |
echo "${{secrets.APPLICATION_SECRET_YML}}" | base64 --decode > src/main/resources/application-secret.yml
find src
- name: Set TEST YML
run: |
echo "${{secrets.APPLICATION_TEST_SECRET_YML}}" | base64 --decode > src/test/resources/application-secret.yml
find src
- name: Build with Gradle
run: ./gradlew build jacocoTestReport
- name: Report to CodeCov
uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./build/reports/jacoco/test/jacocoTestReport.xml
codecov 사이트에서는 이렇게 잘 뜨는데...
부계정으로 다시 시도했다. 레포지토리를 fork 하고 PR을 보내면 build 단계에서 실패했다.
왜지?
fork한 사람은 secrets 접근 권한이 없기 때문인가...?
그렇다기에는 yml 파일은 동적으로 잘 생성하던데..!
설마 개인 레포지토리가 아니라 Organization은 다른가..?
원본 레포지토리에 부계정을 콜라보레이터로 추가하고 PR을 보내도 안된다.
원인을 제대로 파악하지 못하니 처음으로 돌아가보자...
완전 새로운 프로젝트를 만들어서 간단한 테스트 코드를 생성했다.
actions의 yml 파일은 다음과 같이 작성했다.
name: Java CI with Gradle
on:
push:
branches:
- 'main'
pull_request:
branches:
- 'main'
jobs:
code-coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
gradle-version: 7.5.1
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew test
shell: bash
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
file: ./build/reports/jacoco/test/jacocoTestReport.xml
레포지토리 내에 test 브랜치를 만들어서 파일을 추가하고 main으로 PR을 보냈다.
workflow는 문제 없이 동작했지만, coverage 코멘트가 달리지 않았다.
yml에서는 쓰이지 않지만, 우선 app.codecov.io 에서 받은 시크릿 키를 레포지토리 secrets에 등록했다.
여전히 코멘트는 나오지 않았다.
프로젝트 루트 폴더 하위에 codecov.yml을 생성해서 다음 내용을 추가했다.
codecov:
require_ci_to_pass: yes
comment:
layout: "reach,diff,flags,files,footer"
behavior: default
require_changes: false
branches:
- main
마지막으로 레포지토리에 Codecov github app을 설치해주었다.
오래걸린다는 글을 보고 계속 기다려보았다. 10분 넘은 기다림 끝에 Comment가 달린 것을 확인할 수 있었다. (이 동안에도 이것도 실패인가 생각했다...)
부계정으로 레포지토리를 fork해서 PR을 보내도 Comment가 잘 나왔다.
🔍해결
이제 아까 해결이 안됐던 프로젝트에 다시 적용해보자.
1. 프로젝트에 jacoco를 적용하고 root 폴더 하위에 codecov.yml 생성하여 푸시
2. Codecov
codecov 화면은 다음과 같을 텐데, All my orgs and repos를 클릭하면 내 참여중인 Organization으로 변경할 수 있다.
레포지토리가 보이지 않는다면 다시 로그인하면 있을 것이다.
다음 Step1~2을 수행해준다.
3. actions 생성
name: Java CI with Gradle
on:
push:
branches:
- 'main'
pull_request:
branches:
- 'main'
jobs:
code-coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
gradle-version: 7.5.1
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name : Create Secret Yml
run : |
echo "${{secrets.APPLICATION_SECRET_YML}}" | base64 --decode > src/main/resources/application-secret.yml
find src
- name: Create Test Secret Yml
run: |
echo "${{secrets.APPLICATION_TEST_SECRET_YML}}" | base64 --decode > src/test/resources/application-secret.yml
find src
- name: Build with Gradle
run: ./gradlew test
shell: bash
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
file: ./build/reports/jacoco/test/jacocoTestReport.xml
4. 테스트
이전처럼 새로운 branch를 만들고 파일을 하나 생성해서 main 브랜치로 PR을 보내보자.
이번에는 부계정으로 해당 브랜치를 fork해서 PR을 보내보자.
실패했다.
정말 secrets이나 organization 둘 중 이유가 있는걸까.
일단은,,, 어차피 프로젝트 동안에 직접 main 브랜치로 push 하는 일은 없고, 다른 브랜치에 push해서 main 브랜치로 합치는 방식을 사용할 것이기 때문에 PR은 다른 브랜치로 보내고, 다른 브랜치에서 main으로 PR을 다시 보내는 방식을 사용하면 될 것 같다.
'TIL' 카테고리의 다른 글
[TIL - 20230531] webflux 채널 생성/조회 (0) | 2023.06.01 |
---|---|
[TIL - 20230530] Webflux + RSocket 채팅 (0) | 2023.06.01 |
[TIL - 20230525] Prometheus, Grafana 적용, 오류 해결 (0) | 2023.05.25 |
[TIL - 20230524] WebFlux 예제 구현 (0) | 2023.05.25 |
[TIL - 20230522] EC2 도커 이미지 한 번에 배포.. OBS 연결 실패 (0) | 2023.05.23 |