GitHub Actions는 GitHub에서 제공하는 자동화 도구로, 개발자가 CI/CD(Continuous Integration/Continuous Deployment) 파이프라인을 쉽게 구축할 수 있도록 돕습니다. 이를 활용하면 C++ 프로젝트의 빌드, 테스트, 배포 과정을 자동화하여 개발 속도를 높이고 코드 품질을 향상시킬 수 있습니다.
특히 C++ 프로젝트에서는 다양한 운영 체제와 컴파일러 환경을 고려해야 하며, GitHub Actions를 사용하면 여러 플랫폼에서의 빌드 및 테스트를 자동화할 수 있습니다. 본 기사에서는 GitHub Actions의 기본 개념부터 C++ 프로젝트에 적용하는 방법까지 단계별로 설명합니다.
GitHub Actions란?
GitHub Actions는 GitHub에서 제공하는 자동화 워크플로우 실행 도구로, CI/CD(Continuous Integration/Continuous Deployment) 파이프라인을 손쉽게 설정할 수 있도록 지원합니다. 이를 활용하면 코드 변경 사항을 자동으로 빌드하고 테스트하며, 필요 시 배포까지 수행할 수 있습니다.
GitHub Actions의 핵심 개념
GitHub Actions는 다음과 같은 개념으로 구성됩니다.
- 워크플로우(Workflow): 자동화 프로세스를 정의한 YAML 파일로, 특정 이벤트 발생 시 실행됩니다.
- 작업(Job): 하나의 워크플로우 내에서 실행되는 개별 작업 단위로, 여러 개의 작업을 병렬 또는 순차적으로 실행할 수 있습니다.
- 단계(Step): 각 작업 내에서 실행되는 개별 명령어로, 여러 단계를 조합하여 원하는 빌드 및 테스트 과정을 만들 수 있습니다.
- 런너(Runner): GitHub Actions를 실행하는 환경으로, GitHub이 제공하는 호스팅된 런너 또는 자체 호스팅 런너를 사용할 수 있습니다.
GitHub Actions를 사용하는 이유
GitHub Actions는 GitHub 저장소와 완벽히 통합되며, 다음과 같은 장점이 있습니다.
- 자동화된 빌드 및 테스트: 코드 변경이 있을 때마다 자동으로 빌드하고 테스트하여 코드 품질을 유지합니다.
- 다양한 환경 지원: Windows, Linux, macOS 등의 환경에서 빌드를 수행할 수 있습니다.
- 손쉬운 배포: CI/CD 프로세스를 설정하여 빌드된 애플리케이션을 자동으로 배포할 수 있습니다.
- 오픈소스 및 커뮤니티 지원: 다양한 오픈소스 액션(Action)을 활용하여 CI/CD 설정을 간편하게 구성할 수 있습니다.
이제 GitHub Actions가 C++ 프로젝트에서 어떻게 활용될 수 있는지 살펴보겠습니다.
C++ 프로젝트에서 CI/CD의 필요성
C++ 프로젝트에서는 코드의 빌드와 테스트 과정이 복잡할 수 있으며, 운영 체제나 컴파일러에 따라 호환성이 달라질 수 있습니다. CI/CD(Continuous Integration/Continuous Deployment)를 활용하면 이러한 문제를 자동으로 관리하여 코드 품질을 유지하고 개발 속도를 높일 수 있습니다.
CI/CD가 C++ 프로젝트에 미치는 영향
CI/CD를 도입하면 다음과 같은 이점을 얻을 수 있습니다.
- 자동화된 빌드 및 테스트: 코드 변경이 발생할 때마다 자동으로 빌드하고 테스트하여 코드의 안정성을 유지할 수 있습니다.
- 플랫폼별 호환성 확인: GitHub Actions를 활용하면 Linux, Windows, macOS 등의 다양한 환경에서 자동으로 빌드를 실행하여 호환성을 검증할 수 있습니다.
- 코드 품질 향상: 정적 분석 도구 및 코드 커버리지 분석을 자동화하여 코드 품질을 지속적으로 모니터링할 수 있습니다.
- 배포 자동화: 최종 빌드된 실행 파일을 특정 서버나 패키지 저장소에 자동으로 배포할 수 있습니다.
CI/CD 도입 전후 비교
항목 | CI/CD 미도입 | CI/CD 도입 |
---|---|---|
빌드 및 테스트 | 수동 실행, 환경에 따라 오류 발생 가능 | 코드 변경 시 자동 실행, 환경별 테스트 지원 |
코드 품질 | 개발자가 직접 테스트해야 함 | 정적 분석 및 코드 커버리지 자동 실행 |
배포 과정 | 수동으로 실행 파일 업로드 필요 | GitHub Actions에서 자동 배포 가능 |
유지보수 | 개발자별로 환경 차이가 발생할 수 있음 | 일관된 환경에서 테스트 및 배포 가능 |
C++ 프로젝트에서는 운영 체제와 컴파일러가 다양하기 때문에 CI/CD를 적용하면 일관된 환경에서 코드가 정상적으로 동작하는지 확인할 수 있습니다. GitHub Actions를 활용한 CI/CD 구축 방법을 다음 단계에서 자세히 설명합니다.
GitHub Actions의 기본 구성 요소
GitHub Actions를 활용한 CI/CD 파이프라인을 구축하려면 기본적으로 워크플로우(Workflow), 작업(Job), 단계(Step), 런너(Runner)의 개념을 이해해야 합니다.
워크플로우(Workflow)
워크플로우는 자동화된 작업의 흐름을 정의하는 YAML 파일입니다. .github/workflows/
디렉토리에 저장되며, 특정 이벤트(예: 코드 푸시, 풀 리퀘스트 생성)가 발생할 때 실행됩니다.
예제: ci-cpp.yml
name: C++ CI Workflow
on: [push, pull_request] # 푸시 또는 PR 발생 시 실행
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: C++ 빌드 실행
run: g++ -o main main.cpp
작업(Job)
작업은 독립적인 실행 단위로, 여러 개의 작업을 포함할 수 있습니다. 예를 들어, 한 작업은 코드 빌드를 담당하고, 다른 작업은 테스트를 수행할 수 있습니다.
단계(Step)
각 작업 내부에는 여러 개의 단계가 포함되며, 각 단계는 명령어를 실행합니다.
- GitHub 제공 액션 사용 (예:
actions/checkout@v3
→ 저장소 클론) - 커스텀 명령 실행 (예:
g++ -o main main.cpp
→ C++ 빌드)
런너(Runner)
런너는 GitHub Actions의 작업을 실행하는 환경입니다. GitHub이 제공하는 호스팅된 런너(Hosted Runner) 또는 사용자가 직접 설정하는 셀프 호스팅 런너(Self-hosted Runner)를 사용할 수 있습니다.
런너 유형 | 특징 |
---|---|
GitHub 호스팅 런너 | Ubuntu, Windows, macOS 환경 제공 |
셀프 호스팅 런너 | 개발자가 직접 설정한 서버에서 실행 |
이제 GitHub Actions를 사용하여 C++ 프로젝트의 CI/CD 환경을 설정하는 방법을 알아보겠습니다.
C++ 프로젝트용 GitHub Actions 설정
GitHub Actions를 활용해 C++ 프로젝트의 CI/CD 환경을 구축하려면 워크플로우 YAML 파일을 생성하고, 이를 .github/workflows/
디렉토리에 배치해야 합니다.
1. 워크플로우 파일 생성
우선, .github/workflows/ci-cpp.yml
파일을 생성하고 다음과 같이 CI 프로세스를 정의합니다.
name: C++ CI
on: [push, pull_request] # 코드 푸시 또는 PR 발생 시 실행
jobs:
build:
runs-on: ubuntu-latest # 빌드 실행 환경 지정
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3 # 코드 저장소를 가져옴
- name: C++ 컴파일러 설치 확인
run: g++ --version # g++ 설치 여부 확인
- name: C++ 프로젝트 빌드
run: |
g++ -o main main.cpp # g++을 사용한 C++ 코드 컴파일
- name: 실행 파일 테스트
run: ./main # 빌드된 실행 파일 실행
2. GitHub Actions 실행 방식
이제 .github/workflows/ci-cpp.yml
파일을 저장소에 푸시하면, GitHub Actions가 자동으로 빌드와 테스트를 수행합니다.
- 코드 변경 감지:
on: [push, pull_request]
설정으로 인해 코드 변경 시 자동 실행 - 저장소 체크아웃:
actions/checkout@v3
를 사용하여 최신 코드 가져오기 - 컴파일러 확인:
g++ --version
을 실행하여 C++ 컴파일러가 올바르게 설정되었는지 확인 - 프로젝트 빌드:
g++ -o main main.cpp
명령어로 C++ 코드 빌드 - 테스트 실행:
./main
을 실행하여 정상적으로 동작하는지 확인
3. Windows 및 macOS에서의 실행
C++ 프로젝트는 다양한 운영 체제에서 실행될 수 있기 때문에 Windows 및 macOS에서도 빌드할 수 있습니다.
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
이제 C++ 프로젝트를 GitHub Actions에서 자동으로 빌드 및 테스트할 준비가 되었습니다. 다음 단계에서는 빌드 및 테스트 자동화에 대해 더 자세히 살펴보겠습니다.
C++ 코드 빌드 및 테스트 자동화
GitHub Actions를 활용하여 C++ 프로젝트의 빌드(Build) 및 테스트(Test) 프로세스를 자동화하면 코드의 신뢰성을 높이고, 운영 체제별 호환성을 보장할 수 있습니다.
1. GitHub Actions에서 CMake를 활용한 빌드
C++ 프로젝트에서는 일반적으로 CMake를 사용하여 빌드 시스템을 관리합니다. 아래와 같이 ci-cpp.yml
에서 CMake를 활용한 빌드 프로세스를 정의할 수 있습니다.
name: C++ CI with CMake
on: [push, pull_request]
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest] # 다중 OS 지원
runs-on: ${{ matrix.os }}
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: CMake 및 빌드 도구 설치 (Ubuntu)
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y cmake g++
- name: CMake 및 빌드 도구 설치 (Windows)
if: runner.os == 'Windows'
run: choco install cmake
- name: 빌드 디렉토리 생성
run: mkdir build && cd build
- name: CMake 설정 및 빌드
run: |
cd build
cmake ..
cmake --build .
2. C++ 코드 테스트 자동화
CI 프로세스에서 빌드 후 자동으로 테스트를 실행하여 코드의 안정성을 검증할 수 있습니다. C++에서 가장 널리 사용되는 테스트 프레임워크 중 하나인 Google Test를 사용하여 GitHub Actions에서 자동 테스트를 수행할 수 있습니다.
예제 ci-cpp.yml
에서 Google Test 실행 추가:
test:
needs: build
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: 테스트 실행
run: |
cd build
ctest --output-on-failure
3. GitHub Actions에서 테스트 결과 확인
GitHub Actions의 로그 출력을 통해 실행된 테스트 결과를 확인할 수 있습니다.
- 모든 테스트가 성공하면 ✅ 정상적으로 CI가 완료됨
- 특정 테스트가 실패하면 ❌ 오류 메시지와 함께 CI가 중단됨
이제 GitHub Actions를 활용하여 C++ 프로젝트의 빌드 및 테스트를 자동화하는 방법을 설정했습니다. 다음 단계에서는 코드 커버리지 측정 및 보고 기능을 추가하는 방법을 알아보겠습니다.
코드 커버리지 측정 및 보고
CI/CD 환경에서 코드 커버리지(Code Coverage)를 측정하면 테스트가 코드의 어느 부분을 실행하고 있는지 파악할 수 있습니다. C++ 프로젝트에서는 GCov, LCOV, Codecov 등의 도구를 사용하여 코드 커버리지를 분석하고 GitHub Actions와 연동할 수 있습니다.
1. 코드 커버리지 도구 소개
- GCov: GCC에서 제공하는 코드 커버리지 분석 도구
- LCOV: GCov의 데이터를 HTML 보고서로 변환하는 도구
- Codecov: GitHub Actions와 연동하여 커버리지 보고서를 시각적으로 제공하는 서비스
2. GitHub Actions에서 코드 커버리지 측정
아래는 GCov 및 LCOV를 활용하여 코드 커버리지를 측정하고, GitHub Actions에서 실행하는 예제입니다.
name: C++ Code Coverage
on: [push, pull_request]
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: 빌드 도구 설치
run: sudo apt-get update && sudo apt-get install -y gcovr lcov g++
- name: CMake 설정 및 커버리지 빌드
run: |
mkdir build && cd build
cmake -DCMAKE_CXX_FLAGS="--coverage" ..
cmake --build .
- name: 테스트 실행 및 커버리지 수집
run: |
cd build
ctest --output-on-failure
gcovr -r ../ --xml-pretty -o coverage.xml
- name: 커버리지 보고 업로드
uses: codecov/codecov-action@v3
with:
files: build/coverage.xml
fail_ci_if_error: true
3. GitHub Actions에서 코드 커버리지 결과 확인
위 설정을 적용하면, GitHub Actions 실행 후 Codecov에서 코드 커버리지 결과를 시각적으로 확인할 수 있습니다.
- PR 내역에서 커버리지 변화 확인
- 웹 대시보드를 통해 상세 분석 가능
- 커버리지가 일정 기준 이하일 경우 빌드 실패 트리거 가능
4. 커버리지 리포트 예시
실행 후 Codecov에서 확인할 수 있는 코드 커버리지 보고서 예시입니다.
Lines: 85.4% (123/144)
Functions: 92.1% (47/51)
Branches: 78.3% (94/120)
이제 GitHub Actions에서 코드 커버리지를 측정하고, 테스트 품질을 자동으로 분석하는 방법을 설정했습니다. 다음 단계에서는 빌드된 실행 파일을 업로드하고 배포 자동화를 수행하는 방법을 살펴보겠습니다.
아티팩트 업로드 및 배포 자동화
C++ 프로젝트에서 GitHub Actions를 활용하면 빌드된 실행 파일(아티팩트, Artifact)을 저장하고, 자동으로 배포할 수 있습니다. 이를 통해 사용자는 릴리즈된 실행 파일을 쉽게 다운로드하고 사용할 수 있습니다.
1. GitHub Actions에서 아티팩트 업로드
GitHub Actions는 actions/upload-artifact
액션을 사용하여 빌드된 실행 파일을 저장할 수 있습니다.
아래 예제는 C++ 프로젝트에서 빌드된 실행 파일을 업로드하는 GitHub Actions 워크플로우입니다.
name: Build and Upload Artifacts
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: CMake 및 빌드 실행
run: |
mkdir build && cd build
cmake ..
cmake --build .
- name: 아티팩트 업로드
uses: actions/upload-artifact@v3
with:
name: Cpp-Build
path: build/*
2. 릴리즈 자동화
GitHub Actions를 활용하면 특정 태그(Push to Tag)가 생성될 때 GitHub Releases에 빌드된 실행 파일을 자동으로 업로드할 수 있습니다.
아래 예제는 새로운 릴리즈가 생성될 때 실행 파일을 GitHub Releases에 업로드하는 방법입니다.
name: Release Build
on:
push:
tags:
- "v*.*.*" # v1.0.0, v2.1.0 등 태그가 생성될 때 실행
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: CMake 및 빌드 실행
run: |
mkdir build && cd build
cmake ..
cmake --build .
- name: GitHub Releases에 빌드된 실행 파일 업로드
uses: softprops/action-gh-release@v1
with:
files: build/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3. GitHub Actions에서 릴리즈 자동화 확인
이제 GitHub에서 릴리즈 태그(v1.0.0 등)를 생성하면 자동으로 실행 파일이 업로드됩니다.
✅ Push 태그 → GitHub Actions 실행 → 빌드 → 실행 파일 업로드
4. 실행 파일 다운로드 방법
릴리즈된 실행 파일은 GitHub Releases 페이지에서 다운로드할 수 있습니다.
- GitHub 저장소에서 Releases 탭 클릭
- 최신 릴리즈 확인
- 빌드된 실행 파일(.exe, .tar.gz 등) 다운로드 가능
이제 GitHub Actions를 활용하여 C++ 프로젝트의 빌드 결과를 업로드하고 자동으로 배포할 수 있습니다. 다음 단계에서는 GitHub Actions에서 발생하는 오류를 디버깅하고 문제를 해결하는 방법을 살펴보겠습니다.
GitHub Actions의 디버깅 및 문제 해결
GitHub Actions를 활용하는 과정에서 빌드 실패, 테스트 오류, 배포 문제 등이 발생할 수 있습니다. 이를 효과적으로 디버깅하고 해결하는 방법을 알아보겠습니다.
1. GitHub Actions 로그 확인
GitHub Actions에서 실행된 결과는 Actions 탭에서 확인할 수 있습니다.
- GitHub 저장소에서 Actions 탭 클릭
- 실행된 워크플로우 목록에서 실패한 작업 선택
- Jobs 섹션에서 오류 발생 부분 확인
로그 예시:
CMake Error: Could not find CMAKE_CXX_COMPILER
위와 같은 오류가 발생하면, C++ 컴파일러 설치가 누락되었을 가능성이 있습니다.
2. 빌드 실패 문제 해결
빌드 과정에서 실패하는 가장 흔한 원인은 의존성 부족, 컴파일러 문제, CMake 설정 오류입니다.
✅ 해결 방법:
- 의존성 확인: 필요한 패키지가 설치되었는지 검토
- CMake 설정 확인:
CMakeLists.txt
에서 올바르게 설정되었는지 점검 - OS별 차이 고려: Windows, macOS, Ubuntu에서 각기 다른 빌드 설정이 필요한 경우 반영
아래와 같이 OS별로 조건문을 추가하여 컴파일러를 설치할 수 있습니다.
- name: C++ 컴파일러 설치
if: runner.os == 'Linux'
run: sudo apt-get install -y g++
3. 테스트 실패 문제 해결
테스트가 실패하는 경우, 출력 로그를 확인하여 원인을 분석합니다.
테스트 실패 로그 예시:
Expected: 42
Actual: 40
이 경우, 코드 내부에서 계산 결과가 예상과 다르게 동작하고 있음을 의미합니다.
✅ 해결 방법:
- 테스트 환경 확인: 로컬 환경과 GitHub Actions 환경에서 동작 차이가 있는지 확인
- 메모리 오류 검사:
valgrind
를 사용하여 메모리 관련 오류 확인
- name: Valgrind 메모리 검사
run: valgrind --leak-check=full ./main
4. GitHub Actions 실행 환경에서 문제 해결
GitHub Actions는 컨테이너 기반으로 실행되므로 로컬 환경과 차이가 있을 수 있습니다. 이를 해결하기 위해 SSH 디버깅을 사용할 수 있습니다.
✅ GitHub Actions에서 SSH 접속 활성화
- name: SSH 디버깅 활성화
uses: mxschmitt/action-tmate@v3
이 코드를 추가하면 GitHub Actions에서 SSH 접속이 가능해지며, 직접 컨테이너 내부를 확인할 수 있습니다.
5. GitHub Actions에서 캐시 활용
자주 사용하는 의존성(예: CMake 빌드 결과, 패키지 다운로드)을 캐싱하면 속도를 향상시킬 수 있습니다.
✅ C++ 빌드 캐시 설정
- name: CMake 캐시 사용
uses: actions/cache@v3
with:
path: build/
key: ${{ runner.os }}-build-${{ hashFiles('**/CMakeLists.txt') }}
이제 빌드 속도를 최적화하고 불필요한 실행 시간을 줄일 수 있습니다.
6. 문제 발생 시 GitHub Discussions 및 Issue 활용
- GitHub Discussions: 다른 개발자들과 GitHub Actions 관련 문제를 공유하고 해결책을 논의
- GitHub Issue: 프로젝트의 문제를 기록하고 해결 방안을 관리
GitHub Actions의 디버깅과 문제 해결 방법을 이해하면 CI/CD 환경에서 보다 안정적으로 C++ 프로젝트를 자동화할 수 있습니다. 이제 전체 과정을 요약하며 마무리하겠습니다.
요약
본 기사에서는 GitHub Actions를 활용하여 C++ 프로젝트의 CI/CD 자동화를 구축하는 방법을 단계별로 설명했습니다.
- GitHub Actions 개요 – CI/CD의 개념과 GitHub Actions의 기본 요소를 이해했습니다.
- C++ 프로젝트에서 CI/CD의 필요성 – 코드 품질 향상과 배포 자동화의 이점을 확인했습니다.
- GitHub Actions 설정 –
.github/workflows/ci-cpp.yml
파일을 작성하여 빌드 및 테스트 자동화를 수행했습니다. - CMake 및 Google Test를 활용한 빌드·테스트 자동화 – 운영 체제별 빌드와 테스트 수행 방법을 학습했습니다.
- 코드 커버리지 분석 및 보고 – GCov 및 Codecov를 활용하여 코드 커버리지를 측정하고 보고서를 생성했습니다.
- 아티팩트 업로드 및 릴리즈 자동화 – GitHub Releases를 사용하여 실행 파일을 자동으로 배포했습니다.
- 디버깅 및 문제 해결 – GitHub Actions의 로그 분석, SSH 디버깅, 캐시 활용을 통해 문제 해결 방법을 배웠습니다.
GitHub Actions를 활용하면 C++ 프로젝트의 개발·테스트·배포 과정이 자동화되어, 코드 품질을 유지하면서 생산성을 높일 수 있습니다. 이를 기반으로 더욱 효율적인 CI/CD 환경을 구축할 수 있습니다.