自动化构建与持续集成/部署实践

在现代软件开发过程中,自动化构建持续集成/部署(CI/CD)是提高开发效率、保证代码质量的重要手段。本文将介绍如何利用Jenkins和CMake搭建一个自动化构建系统,实现每次提交后自动构建、测试、静态代码分析,并支持扩展自动部署(CD)功能。

构建自动化构建系统的必要性

自动化构建系统是CI/CD流程的基础,它能够确保每次代码提交都能快速反馈问题,减少人为错误,提高开发效率。对于公司而言,除了工具本身,更重要的是要理解并接受CI/CD背后的理念。

构建示例:QtC++桌面应用

本文以一个基于QtC++的简单桌面应用为例,介绍如何通过Jenkins的声明式流水线(Declarative Pipeline)进行构建。该示例应用基于CLion生成的CMake项目。静态代码分析工具选用cppcheck,测试框架则使用Catch2。

Jenkins基础

假设读者已经对Jenkins有基本了解。如果不熟悉Jenkins,可以访问获取更多信息。Jenkins的核心是声明式流水线,定义在名为Jenkinsfile的文件中,该文件应位于项目根目录。

Jenkinsfile示例

Jenkinsfile使用Groovy作为DSL(领域特定语言),提供了非常灵活的方式来定义构建过程。以下是一个示例Jenkinsfile的配置:

pipeline { agent any options { buildDiscarder(logRotator(numToKeepStr: '10')) } parameters { booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Run Tests?') booleanParam(name: 'RUN_ANALYSIS', defaultValue: true, description: 'Run Static Code Analysis?') booleanParam(name: 'DEPLOY', defaultValue: true, description: 'Deploy Artifacts?') } stages { stage('Build') { steps { cmake arguments: '-DCMAKE_TOOLCHAIN_FILE=~/Projects/vcpkg/scripts/buildsystems/vcpkg.cmake', installation: 'InSearchPath' cmakeBuild buildType: 'Release', cleanBuild: true, installation: 'InSearchPath', steps: [[withCmake: true]] } } stage('Test') { when { environment name: 'RUN_TESTS', value: 'true' } steps { ctest 'InSearchPath' } } stage('Analyse') { when { environment name: 'RUN_ANALYSIS', value: 'true' } steps { sh(label: '', returnStatus: true, script: 'cppcheck . --xml --language=c++ --suppressions-list=suppressions.txt 2> cppcheck-result.xml') publishCppcheck(allowNoReport: true, ignoreBlankFiles: true, pattern: '**/cppcheck-result.xml') } } stage('Deploy') { when { environment name: 'DEPLOY', value: 'true' } steps { sh(label: '', returnStatus: true, script: 'cp jenkinsexample ~\ncp test/testPro ~') } } } }

Jenkinsfile以pipeline块开始,定义agent,指定构建执行的环境。options指令用于定义构建参数,如保留最近的10个构建结果。parameters指令允许定义构建参数,如是否运行测试、静态代码分析或部署。

构建过程详解

构建过程分为几个阶段:构建(Build)、测试(Test)、分析(Analyse)和部署(Deploy)。每个阶段都可以通过when指令控制是否执行,这取决于用户定义的参数。

如何启动Jenkins流水线

要让Jenkins执行流水线,需要在项目配置中指定从哪个仓库拉取代码。选择“Pipeline script from SCM”选项即可。如果Jenkins配置正确,并且有稳定的网络连接,可以通过Webhook将Jenkins与GitHub连接起来,这样每次提交都会触发构建。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485