본문 바로가기
C & C++

[C/C++] 개발 환경 구성하기 04 (github action, norminette, codecov)

by yhames 2024. 7. 22.
728x90

[C/C++] 개발 환경 구성하기 01 (아키텍처 설계, 브랜치 전략)

[C/C++] 개발 환경 구성하기 02 (cmake, libft, google test)

[C/C++] 개발 환경 구성하기 03 (gcovr, codecov)

[C/C++] 개발 환경 구성하기 04 (github action, norminette, codecov)

[C/C++] 개발 환경 구성하기 05 (miniLibX)

 

이번에는 github action에서 norminettecodecov를 실행하는 workflow를 작성하겠습니다.
 
github action은 자동으로 빌드, 테스트, 배포할 수 있게 해주는 CI/CD(Continuous Integration/Continuous Deployment) 서비스입니다. github action을 사용하면 소프트웨어 개발 워크플로우를 자동화할 수 있으며, 코드 변경 사항을 감지하여 정의된 작업(예: 테스트 실행, 빌드 생성, 배포 등)을 실행합니다.

 

github action으로 CI/CD를 구성하기 위해서는 .github/workflows/ 경로에 workflow를 정의하는 yml 파일을 작성해야합니다. workflow는 여러개의 jobs를 가지며, 각 job은 여러개의 steps로 구성됩니다. 또한 trigger를 지정하여 언제 해당 workflow가 실행되는지 설정할 수 있습니다.

 

Github Action Workflows 

check norminette and compile flags

먼저 norminette컴파일 옵션(-Wall -Wextra -Werror)을 검증하는 workflow입니다.

name: 👮 check norminette and compile flags

on:	   # set trigger
  push:
    branches: [dev]
  pull_request:
    branches: [dev]

jobs:
  check-norminette:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: 🛒 Install 42-norminette
        run: |
          sudo apt-get update
          sudo apt-get install -y python3 python3-pip
          python3 -m pip install --upgrade pip setuptools
          python3 -m pip install --upgrade norminette

      - name: 👮 Run norminette
        run: norminette **/*.[ch]

  check-compile-flags:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: 🛒 Install build-essentials
        run: sudo apt-get install -y gcc cmake make
      
      - name: 🚩 Compile with options -Wall -Wextra -Werror
        run: |
          mkdir build
          cd build
          cmake ..
          make

 

위에 정의된 워크플로는 check-norminettecheck-compile-flags라는 두 가지 jobs로 구성되어있습니다. 또한 각 job은 서로 다른 step을 구성하여 필요한 패키지를 설치하고 명령어를 실행합니다. 두 가지 jobs에서 모두 runs-on 프로퍼티를 통해 우분투에서 실행될 수 있도록 설정했습니다.

 

 

해당 워크플로가 실행되면 위와 같이 Github 레포지토리에서 Actions가 실행되는 모습을 확인할 수 있습니다.


Run tests and Upload to codecov

다음은 테스트를 실행하고, 테스트 커버리지 파일을 codecov에 업로드하는 workflow 입니다.

name: ✅ run tests

on:
  push:
    branches: [dev]
  pull_request:
    branches: [dev]

jobs:
  run-tests:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: 🛒 Install build-essentials
        run: sudo apt-get install -y gcc cmake make gcovr
      
      - name: 🛠️ Build and Run Tests
        run: |
          cmake -B./build -DENABLE_COVERAGE=ON .
          cmake --build ./build --target minirt_test
          ./build/minirt_test

      - name: 📊 Generate coverage report
        run: |
          mkdir ./build/reports
          gcovr -r . -e 'build/_deps/*' -e 'build/test/*' -o './build/reports/test-coverage.xml'

      - name: 📪 Upload Test Coverage to Codecov
        uses: codecov/codecov-action@v4.0.1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          file: ./build/reports/test-coverage.html
          flags: unit_test
          fail_ci_if_error: true
          verbose: true

 

실행 환경은 우분투로 동일하며, CLI에서 cmake로 컴파일해서 테스트를 실행합니다. 테스트가 실행된 이후에 커버리지 레포트를 생성하고, 이를 codecov에 업로드합니다.

 

codecov가 동작하기 위해서는 Github repository에서 Codecov 설정을 해야하고, Codecov에서도 해당 레포지토리에 대한 config를 완료해야합니다. 자세한 내용은 Codecov 공식문서를 참고하시면 됩니다.

 

 

해당 워크플로가 실행되면 위와 같이 Github 레포지토리에서 Actions가 실행되는 모습을 확인할 수 있습니다.

 

Codecov

마지막으로 codecov를 사용하여 커버리지 목표를 설정하기 위해서는 루트 경로에 codecov.yml 파일을 작성해야합니다.

codecov:
  require_ci_to_pass: yes

coverage:
  status:
    project:
      unit:
        target: 80% # 전체 프로젝트에 대한 커버리지 목표 설정
        flags: 
          - unit_test
    patch:
      default:
        target: 80% # PR에 대한 커버리지 목표 설정
        flags: 
          - unit_test

 

저희는 커버리지 목표를 80%로 설정했습니다. 위와 같이 설정하면 커버리지를 달성하지 못하면 해당 PR에 대한 Merge가 Block됩니다. project의 flags는 workflow에서 codecov에 업로드할 때 지정한 flag입니다. 또한 patch현재 PR에서 변경된 내용에 대해서 따로 커버지리를 평가합니다.

 

 

Codecov에서 분석이 완료되면 PR에서 위와 같이 확인할 수 있습니다.

 

참고자료

 
Codecov를 이용한 C++ 코드 커버리지 측정 방법

 

CodeCov 100%? 그만큼 확실하시다는 거지: Codecov를 이용한 C++ 코드 커버리지 측정 방법 - 인하대학교

코드 커버리지(Code Coverage): 소프트웨어 테스트에서 얼마나 테스트가 충분한가를 나타내는 지표 코드 커버리지는 Coverage라는 단어의 뜻 그대로, 테스...

int-i.github.io

Codecov - QuickStart

 

Codecov Documentation

A quick start guide for those that are brand new to Codecov.

docs.codecov.com

 

반응형