Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Wil
  • 파이썬
  • 문자열
  • enum
  • SQL
  • 코틀린
  • webflux
  • ec2
  • 프리코스
  • elasticsearch
  • 우아한테크코스
  • spring
  • 안드로이드
  • 백준
  • rsocket
  • 프로그래머스
  • 내림차순
  • MariaDB
  • 코틀린 인 액션
  • java
  • 코딩테스트
  • kotlin
  • 다이나믹 프로그래밍
  • Docker
  • 레포지토리
  • 에라토스테네스의 체
  • grafana
  • Android
  • kibana
  • til

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230526] Github Actions Jacoco&Codecov
TIL

[TIL - 20230526] Github Actions Jacoco&Codecov

2023. 5. 27. 03:25

 

💻문제점

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을 다시 보내는 방식을 사용하면 될 것 같다.

728x90

'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
    'TIL' 카테고리의 다른 글
    • [TIL - 20230531] webflux 채널 생성/조회
    • [TIL - 20230530] Webflux + RSocket 채팅
    • [TIL - 20230525] Prometheus, Grafana 적용, 오류 해결
    • [TIL - 20230524] WebFlux 예제 구현
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바