本文主要介绍如何通过 Jenkins 搭建 C++的持续集成环境。最后达到的效果是每天00:00 - 08:00
之间构建、测试和打包一次工程。
开发环境为 VS2015,测试工具为 CppUnit,打包工具为 Inno Setup。
本例的 Jenkins 版本为 Jenkins2.60.1
新建空白解决方案,命名为 Calculator。勾选 [新建 GIT 存储库]。
新建控制台项目,命名为 Calculator。新建Calculator.h,内容如下:
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator
{
public:
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
};
#endif
新建 main.cpp,内容如下:
#include "Calculator.h"
#include
int main()
{
Calculator calculator;
std::cout << "1 + 2 = " << calculator.add(1, 2) << std::endl;
std::cout << "2 - 1 = " << calculator.sub(2, 1) << std::endl;
return 0;
}
本例使用 CppUnit 作为测试工具,如果你还不了解它,请参见我的另一片博文:CppUnit 入门
新建控制台项目,命名为 CalculatorTest。
将 CppUnit 头文件和库文件所在目录加入到工程搜索目录中,并将 CppUnit 库文件加入到链接器的附加依赖项。
添加main.cpp,内容如下:
#include "../Calculator/Calculator.h"
#include "cppunit/TestFixture.h"
#include "cppunit/extensions/HelperMacros.h"
#include "cppunit/TestRunner.h"
#include "cppunit/TestResult.h"
#include "cppunit/TestResultCollector.h"
#include "cppunit/TextOutputter.h"
#include "cppunit/XmlOutputter.h"
#include "cppunit/BriefTestProgressListener.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "cppunit/TextTestRunner.h"
class CalculatorTestFixture : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(CalculatorTestFixture);
CPPUNIT_TEST(testAdd);
CPPUNIT_TEST(testSub);
CPPUNIT_TEST_SUITE_END();
public:
virtual void setUp() override
{
m_calculator = new Calculator();
}
virtual void tearDown() override
{
delete m_calculator; m_calculator = nullptr;
}
public:
void testAdd()
{
CPPUNIT_ASSERT(3 == m_calculator->add(1, 2));
}
void testSub()
{
CPPUNIT_ASSERT(1 == m_calculator->sub(2, 1));
}
private:
Calculator *m_calculator;
};
CPPUNIT_TEST_SUITE_REGISTRATION(CalculatorTestFixture);
int main()
{
CppUnit::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
CppUnit::TestResult result;
CppUnit::BriefTestProgressListener progressListener;
result.addListener(&progressListener);
CppUnit::TestResultCollector resultCollector;
result.addListener(&resultCollector);
runner.run(result);
// 打印到控制台
CppUnit::TextOutputter textOutputter(&resultCollector, std::cout);
textOutputter.write();
// 打印到 xml 文件,以便 xUnit 插件处理
std::ofstream fout("TEST-Calculator.xml");
if (fout)
{
CppUnit::XmlOutputter xmlOutputter(&resultCollector, fout);
xmlOutputter.write();
fout.close();
}
// 返回 0 表示成功
return resultCollector.wasSuccessful() ? 0 : 1;
}
本例用 Inno Setup 打包,在工程目录新建 Calculator.iss,内容如下:
[Setup]
AppName=Calculator
AppVersion=1.5
DefaultDirName={pf}\Calculator
DefaultGroupName=Calculator
UninstallDisplayIcon={app}\Calculator.exe
Compression=lzma2
SolidCompression=yes
OutputBaseFilename=CalculatorSetup
[Files]
Source: "Calculator.exe"; DestDir: "{app}"
[Icons]
Name: "{group}\Calculator"; Filename: "{app}\Calculator.exe"
切换到[团队资源管理器]页签,点击左上角,在弹出菜单中选择[更改],输入日志,点击[全部提交]按钮。
本例要用到 Git、MSBuild 和 xUnit 三个插件,第一步就是安装它们。
Git 插件一般在安装 Jenkins 的时候作为默认插件安装。如果已经安装,则跳过这一步。如果没有安装,则需要手动安装。
在 Jenkins 管理页面中,点击[插件管理]进入插件管理页面,切换到[可选插件]页签,在右上角搜索框中输入 Git plugin 找到 Git plugin,点击[直接安装]按钮开始安装。安装好之后,就会在[已安装]页签找到 Git plugin,如下图:
在 Jenkins 管理页面中,点击[插件管理]进入插件管理页面,切换到[可选插件]页签,在右上角搜索框中输入 MSBuild 找到 MSBuild Plugin,点击[直接安装]按钮开始安装。如下图:
回到 Jenkins 管理页面中,点击[Global Tool Configuration],进入全局工具设置页面。
找到[MSBuild]栏目,点击[新增MSBuild]按钮,[Name]随意填写,本例为MSBuild 14.0。[Path to MSBuild]填写MSBuild.exe所在的实际路径。如下图。点击[Save]按钮保存并退出。
在 Jenkins 管理页面中,点击[插件管理]进入插件管理页面,切换到[可选插件]页签,在右上角搜索框中输入 xUnit 找到 xUnit plugin,点击[直接安装]开始安装,如下图:
由于构建和测试结合得比较紧密,因此不把它们拆分为两个任务,而是合并成一个。
在 Jenkins 管理页面中,点击[新建]进入新建页面,[Enter an item name]填写 Calculator Build and Test,任务类型选择[构建一个自由风格的软件项目],如下图所示。点击[OK]按钮进入到设置页面。
/t:Rebuild /p:Configuration=Release;Platform=x86
(详细的参数信息可以在命令行中执行
MSBuild /?
查看)。如下图所示。点击[Apply]按钮使设置生效。
Release\CalculatorTest.exe
。如下图所示。点击[Apply]按钮使设置生效。
TEST*.xml
,如下图所示:
在 Jenkins 管理页面中,点击[新建]进入新建页面,[Enter an item name]填写 Calculator Deploy,任务类型选择[构建一个自由风格的软件项目],如下图所示。点击[OK]按钮进入到设置页面。
下面创建一个 Pipeline 项目将上面两个项目串联起来。
在 Jenkins 管理页面中,点击[新建]进入新建页面,[Enter an item name]填写 Calculator Pipeline,任务类型选择[Pipeline],如下图所示。点击[OK]按钮进入到设置页面。
找到[Build Triggers]栏目,选择[Build periodically],[日程表]填写 H H(0-7) * * *
(表示每天 00:00 - 08:00
进行一次构建,详细的日程表表示法可以点击右侧的 ?
来查看)。如下图所示。点击[Apply]按钮使设置生效。