[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에서 norminette와 codecov를 실행하는 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-norminette와 check-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++ 코드 커버리지 측정 방법
'C & C++' 카테고리의 다른 글
[C/C++] C 언어에서 상속과 다형성 구현하기 (0) | 2024.07.29 |
---|---|
[C/C++] 개발 환경 구성하기 05 (miniLibX) (0) | 2024.07.23 |
[C/C++] 개발 환경 구성하기 03 (gcovr, codecov) (0) | 2024.07.22 |
[C/C++] 개발 환경 구성하기 02 (cmake, libft, google test) (1) | 2024.07.22 |
[C/C++] 개발 환경 구성하기 01 (아키텍처 설계, 브랜치 전략) (0) | 2024.07.21 |