使用GitHub Actions进行C++ CI/CD简介
\n现代C++开发离不开构建和测试流程的自动化。CI/CD(持续集成/持续部署)使团队能够快速发现错误、自动构建二进制文件并部署应用程序。GitHub Actions是GitHub内置的强大工具,非常适合C++项目。在本文中,我们将详细介绍如何为C++配置完整的CI/CD流水线:从使用CMake编译到部署最终构建产物。
\n我们将探讨真实的代码示例、常见错误和最佳实践。阅读本文后,您将能够独立为您的C++项目实施CI/CD。
\n\n用于C++的GitHub Actions基础
\n工作流文件结构
\nGitHub Actions中的工作流由位于.github/workflows/目录下的YAML文件定义。让我们看一个C++项目的基本示例:
name: C++ CI/CD Pipeline\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Install dependencies\n run: |\n sudo apt-get update\n sudo apt-get install -y cmake g++ libboost-all-dev\n\n - name: Configure with CMake\n run: mkdir build && cd build && cmake ..\n\n - name: Build project\n run: cd build && make -j$(nproc)\n\n - name: Run tests\n run: cd build && ctest --output-on-failure\n此工作流在推送到main和develop分支以及创建pull request时触发。它会安装依赖项、通过CMake配置构建、编译项目并运行测试。
选择操作系统和编译器
\nGitHub Actions支持Linux (ubuntu)、macOS和Windows。对于跨平台项目,可以使用构建矩阵:
\njobs:\n build:\n strategy:\n matrix:\n os: [ubuntu-latest, macos-latest, windows-latest]\n compiler: [g++, clang++]\n runs-on: ${{ matrix.os }}\n\n steps:\n - name: Set compiler\n run: |\n if [ "${{ matrix.os }}" == "windows-latest" ]; then\n echo "CXX=cl.exe" >> $GITHUB_ENV\n else\n echo "CXX=${{ matrix.compiler }}" >> $GITHUB_ENV\n fi\n shell: bash\n这允许您检查代码与不同编译器和操作系统的兼容性。
\n\n高级配置:测试、缓存和构建产物
\n依赖项缓存
\nGitHub Actions中的每次构建都从干净的环境开始。为了加速此过程,可以缓存下载的包和库:
\n- name: Cache CMake build directory\n uses: actions/cache@v3\n with:\n path: build\n key: ${{ runner.os }}-cmake-${{ hashFiles('**/CMakeLists.txt') }}\n restore-keys: |\n ${{ runner.os }}-cmake-\n\n- name: Configure CMake\n run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release\n如果CMakeLists.txt文件未更改,则会恢复缓存,从而在重复构建时节省时间。
\n\n使用Google Test运行单元测试
\nC++经常使用Google Test。让我们添加一个测试阶段,并生成JUnit格式的报告:
\n- name: Build and run tests\n run: |\n cmake --build build --target all_tests\n cd build && ctest --output-junit test-results.xml\n\n- name: Upload test results\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: test-results-${{ runner.os }}\n path: build/test-results.xml\nif: always()标志确保即使测试失败也能上传报告。
创建和发布构建产物
\n成功构建后,可以保存二进制文件:
\n- name: Build release binary\n run: cmake --build build --config Release\n\n- name: Upload build artifacts\n uses: ac