C++ 코드를 GitHub Actions로 CI/CD 자동화하는 방법

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 페이지에서 다운로드할 수 있습니다.

  1. GitHub 저장소에서 Releases 탭 클릭
  2. 최신 릴리즈 확인
  3. 빌드된 실행 파일(.exe, .tar.gz 등) 다운로드 가능

이제 GitHub Actions를 활용하여 C++ 프로젝트의 빌드 결과를 업로드하고 자동으로 배포할 수 있습니다. 다음 단계에서는 GitHub Actions에서 발생하는 오류를 디버깅하고 문제를 해결하는 방법을 살펴보겠습니다.

GitHub Actions의 디버깅 및 문제 해결


GitHub Actions를 활용하는 과정에서 빌드 실패, 테스트 오류, 배포 문제 등이 발생할 수 있습니다. 이를 효과적으로 디버깅하고 해결하는 방법을 알아보겠습니다.

1. GitHub Actions 로그 확인


GitHub Actions에서 실행된 결과는 Actions 탭에서 확인할 수 있습니다.

  1. GitHub 저장소에서 Actions 탭 클릭
  2. 실행된 워크플로우 목록에서 실패한 작업 선택
  3. 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 자동화를 구축하는 방법을 단계별로 설명했습니다.

  1. GitHub Actions 개요 – CI/CD의 개념과 GitHub Actions의 기본 요소를 이해했습니다.
  2. C++ 프로젝트에서 CI/CD의 필요성 – 코드 품질 향상과 배포 자동화의 이점을 확인했습니다.
  3. GitHub Actions 설정.github/workflows/ci-cpp.yml 파일을 작성하여 빌드 및 테스트 자동화를 수행했습니다.
  4. CMake 및 Google Test를 활용한 빌드·테스트 자동화 – 운영 체제별 빌드와 테스트 수행 방법을 학습했습니다.
  5. 코드 커버리지 분석 및 보고 – GCov 및 Codecov를 활용하여 코드 커버리지를 측정하고 보고서를 생성했습니다.
  6. 아티팩트 업로드 및 릴리즈 자동화 – GitHub Releases를 사용하여 실행 파일을 자동으로 배포했습니다.
  7. 디버깅 및 문제 해결 – GitHub Actions의 로그 분석, SSH 디버깅, 캐시 활용을 통해 문제 해결 방법을 배웠습니다.

GitHub Actions를 활용하면 C++ 프로젝트의 개발·테스트·배포 과정이 자동화되어, 코드 품질을 유지하면서 생산성을 높일 수 있습니다. 이를 기반으로 더욱 효율적인 CI/CD 환경을 구축할 수 있습니다.