采用CMake+GTest+Jenkins集成开发

目录

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].

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容