在现代软件开发过程中,自动化构建和持续集成/部署(CI/CD)是提高开发效率、保证代码质量的重要手段。本文将介绍如何利用Jenkins和CMake搭建一个自动化构建系统,实现每次提交后自动构建、测试、静态代码分析,并支持扩展自动部署(CD)功能。
自动化构建系统是CI/CD流程的基础,它能够确保每次代码提交都能快速反馈问题,减少人为错误,提高开发效率。对于公司而言,除了工具本身,更重要的是要理解并接受CI/CD背后的理念。
本文以一个基于Qt和C++的简单桌面应用为例,介绍如何通过Jenkins的声明式流水线(Declarative Pipeline)进行构建。该示例应用基于CLion生成的CMake项目。静态代码分析工具选用cppcheck,测试框架则使用Catch2。
假设读者已经对Jenkins有基本了解。如果不熟悉Jenkins,可以访问获取更多信息。Jenkins的核心是声明式流水线,定义在名为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执行流水线,需要在项目配置中指定从哪个仓库拉取代码。选择“Pipeline script from SCM”选项即可。如果Jenkins配置正确,并且有稳定的网络连接,可以通过Webhook将Jenkins与GitHub连接起来,这样每次提交都会触发构建。