jenkins自动编译c语言工程,使用Jenkins自动编译C#项目

1. 安装插件`MSBuild Plugin`

安装后再构建步骤中会多一个【`Build a Visual Studio project or solution using MSBuild`】选项。

2. 配置`MSBuild`

在【系统管理】->【全局工具配置】->【MSBuild】中添加本地已安装的`MSBuild`。

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-msbuild-config-1.jpg)

3. 在Job的构建中添加MSBuild步骤

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-job-msbuild-setting.jpg)

## 配置时踩到的坑

1. error `CS1041` & error `CS1617`

> xxx.cs(13,7): error CS1041: 应输入标识符;“static”是关键字 [D:\jenkins\workspace\workspace\xxx\xxx\xxx.csproj]

> xxx.cs(13,14): error CS1518: 应输入 class、delegate、enum、interface 或 struct [D:\jenkins\workspace\workspace\xxx\xxx\xxx.csproj]

原因是有个`class`中使用了`C# 6.0`的语法`using static`来引入静态类。开发使用的VS2015中是可以正常编译。

手动将工程属性【`langversion`】改为`6`,或者使用【`/p:langversion=6`】参数构建时,又输出了如下错误:

> CSC : error CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default [D:\jenkins\workspace\workspace\xxx\xxx\xxx.csproj]

这说明本机安装的安装`MSBuild`版本不支持`C# 6.0`的语法。

确认了下本机安装的`MSBuild`确实是对应`.Net Framework 4.5`的。おかしい!

最后去[微软官网](https://www.visualstudio.com/zh-hans/downloads/)下载了最新版的[Visual Studio 2017 生成工具](https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15)(好在可以单独安装),再在【系统管理】->【全局工具配置】->【MSBuild】新增一个配置,在Job的构建中选择该MSBuild就行了。

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-msbuild-15-install-01.jpg)

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-msbuild-15-install-02.jpg)

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-msbuild-15-install-03.jpg)

![](/Uploads/userfiles/e671fced-86e2-4d56-a20a-d79aab766aa7/files/2018/03/28/jenkins-msbuild-config.jpg)

2. error `CS0246`

> error CS0246: 未能找到类型或命名空间名“Nest”(是否缺少 using 指令或程序集引用?)

项目遗留问题,工程文件中的引用设置的比较乱,有些虽然在VS中可以正常编译,通过`MSBuild`编译时就会出现该错误。

这个只需要把对应的引用删除,然后添加一个正确位置的引用就行了。

## 附

1. [MSBuild 命令行参考](https://msdn.microsoft.com/zh-cn/library/azure/ms164311(v=vs.120).aspx)