本文主要介紹如何經過 Jenkins 搭建 C++的持續集成環境。最後達到的效果是天天00:00 - 08:00之間構建、測試和打包一次工程。ios
開發環境爲 VS2015,測試工具爲 CppUnit,打包工具爲 Inno Setup。app
本例的 Jenkins 版本爲 Jenkins2.60.1ide
創建工程
新建空白解決方案,命名爲 Calculator。勾選 [新建 GIT 存儲庫]。工具
創建開發項目
新建控制檯項目,命名爲 Calculator。新建Calculator.h,內容以下:測試
#ifndef CALCULATOR_H
#define CALCULATOR_Hui
class Calculator
{
public:
int add(int num1, int num2)
{
return num1 + num2;
}spa
int sub(int num1, int num2)
{
return num1 - num2;
}
};.net
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
新建 main.cpp,內容以下:插件
#include "Calculator.h"
#include <iostream>命令行
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;
}
1
2
3
4
5
6
7
8
9
10
11
創建測試項目
本例使用 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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
創建發佈腳本
本例用 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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
提交代碼
切換到[團隊資源管理器]頁籤,點擊左上角,在彈出菜單中選擇[更改],輸入日誌,點擊[所有提交]按鈕。
準備工做
本例要用到 Git、MSBuild 和 xUnit 三個插件,第一步就是安裝它們。
安裝 Git plugin
Git 插件通常在安裝 Jenkins 的時候做爲默認插件安裝。若是已經安裝,則跳過這一步。若是沒有安裝,則須要手動安裝。
在 Jenkins 管理頁面中,點擊[插件管理]進入插件管理頁面,切換到[可選插件]頁籤,在右上角搜索框中輸入 Git plugin 找到 Git plugin,點擊[直接安裝]按鈕開始安裝。安裝好以後,就會在[已安裝]頁籤找到 Git plugin,以下圖:
安裝 MSBuild plugin
在 Jenkins 管理頁面中,點擊[插件管理]進入插件管理頁面,切換到[可選插件]頁籤,在右上角搜索框中輸入 MSBuild 找到 MSBuild Plugin,點擊[直接安裝]按鈕開始安裝。以下圖:
安裝好以後,就會在[已安裝]頁籤找到 MSBuild Plugin。
回到 Jenkins 管理頁面中,點擊[Global Tool Configuration],進入全局工具設置頁面。
找到[MSBuild]欄目,點擊[新增MSBuild]按鈕,[Name]隨意填寫,本例爲MSBuild 14.0。[Path to MSBuild]填寫MSBuild.exe所在的實際路徑。以下圖。點擊[Save]按鈕保存並退出。
安裝 xUnit plugin
在 Jenkins 管理頁面中,點擊[插件管理]進入插件管理頁面,切換到[可選插件]頁籤,在右上角搜索框中輸入 xUnit 找到 xUnit plugin,點擊[直接安裝]開始安裝,以下圖:
安裝好以後,就會在[已安裝]頁籤找到 xUnit plugin。
建立構建和測試任務
因爲構建和測試結合得比較緊密,所以不把它們拆分爲兩個任務,而是合併成一個。
在 Jenkins 管理頁面中,點擊[新建]進入新建頁面,[Enter an item name]填寫 Calculator Build and Test,任務類型選擇[構建一個自由風格的軟件項目],以下圖所示。點擊[OK]按鈕進入到設置頁面。
找到[源碼管理]欄目,選擇[Git],[Repository URL]填寫工程所在目錄。以下圖所示。點擊[Apply]按鈕使設置生效。
找到[構建]欄目,點擊[增長構建步驟],選擇[Build a Visual Studio project or solution using MSBuild]。以下圖所示:
[MSBuild Version]選擇[MSBuild 14.0],[MSBuild Build File]填寫Calculator.sln,[Command Line Arguments]填寫/t:Rebuild /p:Configuration=Release;Platform=x86(詳細的參數信息能夠在命令行中執行MSBuild /?查看)。以下圖所示。點擊[Apply]按鈕使設置生效。
爲了運行測試用例,還須要增長一個構建步驟。再次點擊[增長構建步驟],選擇[Execute Windows batch command],以下圖所示:
在[命令]中填寫Release\CalculatorTest.exe。以下圖所示。點擊[Apply]按鈕使設置生效。
找到[構建後操做]欄目,點擊[增長構建後操做步驟],選擇[Publish xUnit test result report],以下圖所示:
點擊[Add]按鈕,選擇[CppUnit-1.12.1(default)],以下圖所示:
在[Pattern]中填寫TEST*.xml,以下圖所示:
最後,點擊[保存]按鈕保存設置並退出。
在任務控制面板頁面,點擊[當即構建]進行構建。以下圖所示:
構建完成以後,構建歷史會出如今[Build History]列表中。前面紅色的圓點表示構建失敗,藍色的圓點表示構建成功。
在構建歷史列表中點擊列表項能夠查看構建詳情。在構建詳情頁面,能夠點擊[Console Output]查看控制檯輸出。點擊[Test Result]能夠查看測試結果。
建立發佈任務
在 Jenkins 管理頁面中,點擊[新建]進入新建頁面,[Enter an item name]填寫 Calculator Deploy,任務類型選擇[構建一個自由風格的軟件項目],以下圖所示。點擊[OK]按鈕進入到設置頁面。
找到[構建]欄目,點擊[增長構建步驟],選擇[Execute Windows batch command],以下圖所示:
在[命令]裏輸入以下命令。注意直接將命令寫在這裏是很差的作法,最好是將命令寫在bat中,在這裏執行這個bat。這裏爲了演示而避繁就簡。(其中iscc是Inno Setup的腳本編譯器,關於它的使用可自行查閱Inno Setup的幫助文檔)
點擊[保存按鈕]保存設置並退出。
在任務控制面板頁面,點擊[當即構建]進行構建。構建成功以後會在 [Jenkins 的workspace 目錄]\Calculator Deploy\Output 下找到安裝文件。
建立 Pipeline
下面建立一個 Pipeline 項目將上面兩個項目串聯起來。
在 Jenkins 管理頁面中,點擊[新建]進入新建頁面,[Enter an item name]填寫 Calculator Pipeline,任務類型選擇[Pipeline],以下圖所示。點擊[OK]按鈕進入到設置頁面。
找到[Build Triggers]欄目,選擇[Build periodically],[日程表]填寫 H H(0-7) * * *(表示天天 00:00 - 08:00 進行一次構建,詳細的日程表表示法能夠點擊右側的 ? 來查看)。以下圖所示。點擊[Apply]按鈕使設置生效。
找到[Pipeline]欄目,[Definition]選擇[Pipeline script],在[Script]中編寫以下腳本(Pipeline語法能夠點擊[Pipeline Syntax]超連接查看):
點擊[保存]按鈕保存並退出。 在任務控制面板頁面,點擊[當即構建]進行構建。構建時能夠看到 Stage View會根據任務執行進度實時地變化。構建結束後會顯示完整的 Stage View,以下圖所示: