在构建自动化过程中,您做了哪些酷炫有趣的事情?

时间:2009-05-29 12:04:34

标签: tfs msbuild build-automation team-build

我很想知道其他人在构建自动化过程中做了什么,而不是通常的编译,构建,运行测试等任务,这些任务可能对其他人有所帮助和启发,以便其他人考虑和研究如下:

  • 生成代码文档
  • 如果违反了已建立的指标,则使用代码指标衡量构建质量并使构建失败。

31 个答案:

答案 0 :(得分:43)

将可执行文件解雇到http://virustotal.com,以便对所有主要的反病毒引擎进行病毒扫描。

并非我们认为我们的exes包含病毒,但有时您会得到误报,并且您不希望它成为找到它的客户。 8 - )

答案 1 :(得分:21)

我们有一个Twitter帐户,因此我们可以随时随地查看其状态

答案 2 :(得分:20)

我们有一个Staples easy按钮,我们已经连接起来按下按下时的构建。

答案 3 :(得分:16)

为可能分散在代码中的任何TODO / FIXME等创建报告。

答案 4 :(得分:15)

以下是我已经做过,做过或打算做的一些事情:

  • 更新红绿灯(使用X10小工具)以指示构建状态(绿色=正常,黄色=建筑物,红色=哎呀!)。
  • 生成代码文档,然后使用文档更新项目Wiki。
  • 其他项目维基更新,例如发布当前版本号,提供下载链接等。
  • 部署到(并在必要时回滚)测试服务器,在那里进行手动测试。我通常使用VMWare完成此操作,因此“部署”实际上是创建新的VM实例。
  • 自动将“待定构建”的故障单移至QA进行测试。
  • 为失败的测试,失败的构建和编译器警告创建缺陷报告。
  • 在版本控制中标记构建(也应用版本信息)。
  • 在Y天内构建X次或更多次失败后安排审核。 (例如,如果在一周内发生三次失败,我们需要见面以弄清楚发生了什么)
  • 安排“披萨和啤酒”派对,无错误的几周。
  • 大声播放“ca-ching!”只要我们知道的功能将导致新的销售完成,就会在PA系统上发出声音。在我的旧公司,我们的销售团队喜欢这个无用的功能:)。

答案 5 :(得分:12)

从failblog.com中提取随机图片以附加到“构建失败”电子邮件。

答案 6 :(得分:7)

自动推进您的问题工作流程。

我们为Bamboo CI服务器编写了一个自定义插件,它收集了与构建相关的所有JIRA问题(根据svn提交注释确定)并检查它们在JIRA中的状态。

一旦构建成功(并将应用程序部署到正在运行的服务器),“等待构建”工作流阶段中的任何问题都会自动进入“构建和可用”测试“阶段,触发电子邮件发送给分配给该问题的测试人员。

这意味着我们的测试人员不会在开发人员检查代码时收到问题通知电子邮件,但是当修补程序在服务器上运行时,测试人员可以实际执行某些操作。

答案 7 :(得分:6)

直接部署网站以测试部署服务器。

答案 8 :(得分:4)

我们将数字签名应用于我们生成的所有二进制文件。构建脚本会自动执行此操作。

答案 9 :(得分:4)

一些事情。

  1. 将pdb上传到Symbol / Source Server< - 用于调试winqual崩溃转储的价值
  2. 通过CC.NET
  3. 对部署到VM的安装程序运行测试
  4. 创建基本VM以通过CC.NET进行测试并将其部署到所有QA
  5. 获取该VM映像的副本并使用EggPlant执行自动UI测试

答案 10 :(得分:3)

在SVG初始屏幕中替换版本号,然后替换renders it in Inkscape

答案 11 :(得分:2)

对于Java开发,我们使用:

  • JUnit由Cobertura补充(Cobertura识别代码的哪些部分缺乏测试覆盖率)
  • 查找错误 - 搜索代码以查找错误和漏洞的工具
  • Hudson工具(请参阅hudson.dev.java.net [我无法发布超链接!]),它管理软件的构建和测试。它具有像AoP(上图)交通信号灯这样的功能 - 蓝色成功的构建和所有单元测试通过,黄色成功构建和一些单元测试失败,Red-build失败。

哈德森也

  • 通过SVN,Continuus等插件管理软件构建
  • 维护所有构建的历史记录 - 允许我们的Junit测试和Find Bugs结果显示在趋势图中
  • 每当构建导致更改状态(例如,从蓝色变为黄色,从红色变为蓝色)时,向所有相关方发送电子邮件
  • 所有信息均在简单的内部网页中显示

答案 12 :(得分:2)

我们对我们最新的公开发布进行二进制兼容性分析(使用反射),以确保我们不会意外地引入二进制分解更改。每当我们被迫进行重大更改时,我们会将特定的api添加到“已接受的重大更改”列表中,以便下一个构建可以跳过测试。在发布时,我们会在新版本中提供完整的API列表。

答案 13 :(得分:2)

我们构建BizTalk 2006项目:)

答案 14 :(得分:2)

托管代码:

  1. 使用一致版本
  2. 更新所有AssemblyInfo文件
  3. 运行StyleCop和FxCop,检查代码是否漂亮且表现良好!
  4. 原生代码:

    1. 在二进制文件中运行depends.exe,并检查调试运行时没有依赖关系 - 经常发生
    2. 使用manifest.exe转储清单文件并检查调试依赖项 - 这些东西到处都是!
    3. 使用SWIG为C ++代码生成python绑定

答案 15 :(得分:2)

我们有一个网络应用程序并进行了性能测试,并将HTML / CSS验证放入测试脚本中。

答案 16 :(得分:2)

我参与过的各种项目都有大量的公开展示,其中包括最后一次登记的人以及谁破坏了构建。我们使用Build-o-matic执行了此操作,并编写了Team Piazza来显示Team City版本的相同信息。

答案 17 :(得分:1)

我们做了很多:使用MSBUILD

  • 获取来源
  • 使用时间戳和文件信息和版本信息中的最后一个更改集更新程序集信息
  • 编译:)
  • 使用Galio运行测试
  • 使用当前时间戳创建测试报告并将其发布到IIS
  • 创建所有必要二进制文件的Zip包
  • 在SVN上发布Zip包
  • 从TFS取消绑定SLN文件
  • 删除所有bin / obj文件
  • 在SVN上发布源代码
  • 在构建成功或失败后发送电子邮件
  • 使用NANT脚本部署应用程序

答案 18 :(得分:1)

我在这里没有阅读超过一半的答案,但我希望其中一些是“新的”:

  • 安装和升级旧版本以检查新安装的文件差异(测试我们的部署升级配置)
  • 将我们的核心应用程序和外部系统适配器部署到自定义Jboss(包含在项目/发行版中),启动它并运行SoapUI测试套件以验证端到端功能(也是我们部署自动化的额外测试)< / LI>
  • 将delta脚本应用于以前的数据库版本,然后对新安装进行结构比较,以便在升级期间创建新表,列等
  • 在Confluence中发布我们的发布文档(我们基本上每晚运行完整的发布脚本),作为trunk的下一个版本的预览

答案 19 :(得分:1)

除了已经多次提到的版本控制,签名和测试等,我们还要:

  • 为sharepoint-dll
  • 运行 spdisposeCheck
  • 运行 sigcheck (来自sysinternals)以创建版本和应用证书的精彩概述

答案 20 :(得分:1)

我真的很惊讶没人提到更新配置文件!我们根据使用构建脚本构建的环境更新配置文件b。它可以节省至少20分钟来替换所有的connectionStrings和appSettings。我们做的其他事情是:

更新版本号
转到测试服务器
运行代码分析
电子邮件构建状态
运行一些数据库脚本

答案 21 :(得分:1)

我们有Nabaztag/tag显示构建服务器上是否发生任何错误。

答案 22 :(得分:1)

我们使用'checkstyle'(http://checkstyle.sourceforge.net/anttask.html)生成一个报告,该报告可以在开发人员构建之前重新签入并且不会(正式)审核。 另外,我编写了一些执行以下操作的自定义任务:

  1. 检查数据库连接属性并尝试与DB(简单JDBC代码)建立实际连接,并报告是否存在任何用户凭据问题等。
  2. 将最后一次构建的用户名和时间戳添加到代码
  3. 向我们的企业IM客户端(自定义列表)发送包含构建状态
  4. 的通知

    还有几个任务,但它们特定于内部环境  相关设置。

答案 23 :(得分:1)

以下是Continuous Integration中我常常遇到的一些事情:

  • 计算代码指标和性能统计(由我们的框架捕获,同时执行测试;
  • 运行代码质量测试,强制执行某些开发指南(即:类命名,不变性,允许引用);
  • 更新从代码生成的在线文档;
  • 将安装包(WiX和ClickOnce)放入部署服务器并更新自动更新所需的清单;
  • 更新开源项目的“下载”页面;
  • 通知所有参与方有关构建和结果。

答案 24 :(得分:1)

我们做过的一些事情:

  1. 对所有前任进行数字签名
  2. 存档pdbs
  3. 使用WIX创建安装程序
  4. 为CD或DVD上分发的软件生成完整的.iso文件

答案 25 :(得分:1)

如何在每个构建的映像中嵌入构建时间戳?

<ItemGroup>
  <StampFile   Include="BuildTimestamp.cs"/>
</ItemGroup>

<Target Name="BuildTimestamp" 
        Outputs="@(StampFile)">
  <Message Text="Building Timestamp..." />
  <Touch
     AlwaysCreate = "true"
        Files="@(StampFile)" />

    <WriteLinesToFile
        File="@(StampFile)"
        Lines='public static class Build { public static string Timestamp = "%(StampFile.CreatedTime)" %3B }'
        Overwrite="true"/>
</Target>

您可以将其扩展为包括机器名称,月亮阶段等。

答案 26 :(得分:1)

运行单元测试和代码分析工具,如NDepend,Gandarme。 结果由CC.Net

发布

答案 27 :(得分:1)

在Post build步骤中重置测试数据库:

  • 准备一组文件(使用 TemplateFile 任务)

使用这些文件

  • 删除测试数据库
  • 备份中央数据库
  • 将其还原到新的测试数据库实例
  • 在测试数据库中运行初始化sql脚本(使用 Sql.Execute 任务)
  • 将(使用 Xml.XslTransform 任务)xml数据文件转换为sql文件(插入)
  • 在测试数据库
  • 上运行它们

在此之后,我们有一个干净的测试数据库,具有正确的模式,来自中央数据库的所有固定数据,然后是一些额外的测试数据。

如果架构和固定数据也可以在可比数据和sql文件中,那就更好了,但那是WIP。中央数据库还没有,但应该在源代码控制中。

答案 28 :(得分:1)

对于Java,您还可以使用Ivy自动获取任何缺少的库。例如,如果您使用Hibernate,您可能希望也可能不希望在您的版本中包含这些库。

答案 29 :(得分:1)

我们有一个构建脚本,可以自动标记构建和SVN,并将应用程序部署到WebSphere应用程序服务器。

答案 30 :(得分:-3)

处理其他一个紧迫的截止日期或赶上电子邮件(等待那不酷或有趣......)好吧,这就是我真正做的事情:http://samurai-ryan.mybrute.com/