目录
1.搭建Jenkins服务器
2.本地编写Cmake工程
3.Jenkins服务端的工程构建
4.总结
前言
Jenkins是一个开源经典的自动化CI/CD工具,采用Java语言开发,常用于项目的自动化构建、测试与部署。当然也可以将其用于C++项目的开发,需要结合CMake来实现。本文将介绍如何采用CMake、GTest、Jenkins进行C++项目的集成开发。
1.搭建Jenkins服务器
- 安装主要工具:GCC、CMake、Git。
-
安装Jenkins:官网上下载最新版安装包完成安装,Finish之后打开浏览器输入
http://<服务器ip>:8080/
,第一次打开Jenkins需要输入初始密码,按照提示找到initialAdminPassword
文件中的密码。
然后设置第一个账户及密码,该账户将作为系统的管理员:设置账户
登录到主界面之后,点击 Manage Jenkins >> Manage Plugins >> Available,搜索“CMake”插件并完成安装。安装插件
回到主界面,点击 Manage Jenkins >> Global Tool Configuration,找到CMake部分,填入CMake的安装路径。配置CMake
基本的Jenkins服务就搭建好了!
2.本地编写Cmake工程
- 如果本地系统是windows系统,希望使用VSCode进行开发,可以参考搭建开发环境-Win10+VSCode+Cmake+MinGW。
- 编写Helloworld程序:首先新建如下几个文件夹,
googletest
存放gtest的源码文件,为了使用其单元测试功能,其源码将参与整个工程的构建。src
存放一些自己编写的功能代码,test
下存放测试代码。工程目录 - 新建
function.cpp
文件,编写一个功能函数示例:
#include "function.h"
int Square(int a){
return a * a;
}
并在当前文件夹下的CMakeLists.txt
文件写入如下代码,目的是构建一个函数库:
cmake_minimum_required(VERSION 3.8)
set(This FunctionLib)
project(${This})
set(Sources
function.cpp
)
add_library(${This} STATIC ${Sources})
- 编写测试文件
Test.cpp
,其中引用了上述函数库中的Square
功能:
#include <gtest/gtest.h>
#include "function.h"
namespace{
TEST(ExampleTest, HelloWorld)
{
EXPECT_TRUE(true);
EXPECT_EQ(1, 1);
}
TEST(ExampleTest, Square)
{
EXPECT_EQ(1, Square(1));
EXPECT_EQ(4, Square(2));
EXPECT_EQ(9, Square(3));
EXPECT_EQ(16, Square(4));
EXPECT_EQ(25, Square(5));
}
} // namespace
同时编写同文件夹下的CMakeLists.txt
文件,这里不用额外编写test的main文件,因为库gtest_main
已经为我们提供:
cmake_minimum_required(VERSION 3.8)
set(This ExampleTest)
project(${This} CXX)
include_directories("../src")
set(Sources
Test.cpp
)
add_executable(${This} ${Sources})
target_link_libraries(${This} PUBLIC
gtest_main
FunctionLib
)
add_test(
NAME ${This}
COMMAND ${This}
)
- 最后在根目录下的
CMakeLists.txt
文件中写入如下代码,enable_testing()
的目的是为了启用CTest:
cmake_minimum_required(VERSION 3.8)
set(This Example)
project(${This} CXX)
set(CMAKE_CXX_STANDARD 11)
enable_testing()
add_subdirectory(googletest)
add_subdirectory(test)
add_subdirectory(src)
3.Jenkins服务端的工程构建
-
首先登录到Jenkins的主界面,点击New Item >> Freestyle project,这里的项目类型常用Freestyle project和Pipeline两种,Pipeline更加专业灵活,会在后续进行深入探索,这里暂时使用Freestyle project。项目类型
- 然后配置工程的相关属性,首先在Source Code Management处设置代码源,选择Git可以直接从GitLab或者Github上拉取项目进行构建,需要注意内网Jenkins服务器是无法链接外网Github的,因此这里暂时选择None,并直接将源代码复制到
workspace
下。10.PNG
复制完成后可以在网页上看到源码目录:14.PNG
然后设置Build,需要设置CMake的名称默认InSearchPath
,构建文件存放的目录设置为build
,Script Generator是生成器类型,由于使用了MinGW编译器因此选择MinGW Makefiles
,构建类型选择Release
。11.PNG
然后设置make之后的一些操作,这里选择Execute Windows batch command
,首先执行build
完成源码编译,然后调用测试程序ExampleTest
生成测试结果,保存在xml文件中。12.PNG
最后对测试结果进行一些展示配置,需要指定生成的xml文件。
13.PNG - 接着回到Project的页面下,点击
Build Now
,完成编译构建与测试。这里仍然暂时手动build,因为没有使用Git无法触发自动build。15.PNG
可以直接查看相应的构建历史,编译测试成功后的Log如下:
C:\ProgramData\Jenkins\.jenkins\workspace\Project1\build>cmake --build .
[ 8%] Building CXX object googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.obj
[ 16%] Linking CXX static library ..\..\lib\libgtest.a
[ 16%] Built target gtest
[ 25%] Building CXX object googletest/googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.obj
[ 33%] Linking CXX static library ..\..\lib\libgmock.a
[ 33%] Built target gmock
[ 41%] Building CXX object googletest/googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.obj
[ 50%] Linking CXX static library ..\..\lib\libgmock_main.a
[ 50%] Built target gmock_main
[ 58%] Building CXX object googletest/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.obj
[ 66%] Linking CXX static library ..\..\lib\libgtest_main.a
[ 66%] Built target gtest_main
[ 75%] Building CXX object src/CMakeFiles/FunctionLib.dir/function.cpp.obj
[ 83%] Linking CXX static library libFunctionLib.a
[ 83%] Built target FunctionLib
[ 91%] Building CXX object test/CMakeFiles/ExampleTest.dir/Test.cpp.obj
[100%] Linking CXX executable ExampleTest.exe
[100%] Built target ExampleTest
C:\ProgramData\Jenkins\.jenkins\workspace\Project1\build>call test\ExampleTest --gtest_output="xml:testresults.xml"
Running main() from C:\ProgramData\Jenkins\.jenkins\workspace\Project1\googletest\googletest\src\gtest_main.cc
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from ExampleTest
[ RUN ] ExampleTest.HelloWorld
[ OK ] ExampleTest.HelloWorld (0 ms)
[ RUN ] ExampleTest.Square
[ OK ] ExampleTest.Square (0 ms)
[----------] 2 tests from ExampleTest (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 2 tests.
C:\ProgramData\Jenkins\.jenkins\workspace\Project1\build>exit 0
Recording test results
[Checks API] No suitable checks publisher found.
Finished: SUCCESS
点击Test Result
可以直观的查看测试结果:
16.PNG
4.总结
本文算是完成了最基本的基于Jenkins的C++项目自动化构建与测试,但还有很多有用的功能尚未涉及,例如Pipeline的使用,以及更加自动化的测试过程...本文的测试方法似乎不那么智能!这些将会在后续进一步研究。
参考文献
[1].