TFS Build做Web应用持续集成发布的一个技巧
由于面向接口编程的关系,许多实现往往是动态注入运行,在一个项目中直接引用实现dll编译是不合理的。通常我们会在Post Build Event中添加一些xcopy命令将运行时才需要的dll复制到输出目录。在发布时会带来一些问题,比如:使用Visual Studio自带的Publish功能发布一个Web应用时就不会运行Post Build Event。同样的在基于TFS Build时也存在类似问题。
TFS Build时会根据对应Definition的名称创建两个子目录:Source、Binaries,Binaries下针对Web应用会创建发布目录"_PublishedWebsites",如果想要Post Build Event时将dll复制到对应目录下,最简单的方式就是再添加xcopy命令(这样的命令可能有多条),例如:
xcopy /y /i "$(SolutionDir)BuildEvents\Post-build" "$(TargetDir)_PublishedWebsites\$(TargetName)\bin\"
但是会给开发人员带来歧义、工作量并污染Post Build Event。其实我们想做的就是当MSBuild时的某一个参数值符合要求则执行发布用的命令(这个命令和Post Build Event执行的内容一样,就是$(TargetDir)不同),这时就需要修改项目文件来添加一些自定义的脚本实现该功能。首先在Build Definition的高级选项里添加MSBuild Arguments,例如:
/p:RMS=
由于我的目标是和Release Management Service整合,故使用了该缩写。下面打开项目文件(csproj),开启AfterBuild,并添加一个Exec Task
<Target Name="AfterBuild">
<Exec Command="$(PostBuildEvent)" Condition=" '$(RMS)' == '1' " />
</Target>
上面的命令实际无法达到最终效果,这里自己绕了一个弯路。主要问题在于对PostBuildEvent的理解,其实它也是一个字符串变量,在执行时它内部使用的$(TargetDir)早已被替换,无法再重新计算结果。例如:
<Target Name="AfterBuild" Condition=" '$(RMS)' == '1' ">
<PropertyGroup>
<TargetDir>$(TargetDir)_PublishedWebsites\$(TargetName)\bin\</TargetDir>
</PropertyGroup>
<Message Text="$(TargetDir)" />
<Exec Command="$(PostBuildEvent)" />
</Target>
TargetDir的值确实产生变化,但PostBuildEvent的值也已经被提前计算,我们无法再让它被动态计算一次。幸好MSBuild 4.0以上版本允许我们使用一部分.NET代码来修改这些变量,我们只需调用System.String的Replace方法即可,参考如下:
<Target Name="AfterBuild">
<Exec Command="$(PostBuildEvent.Replace("$(TargetDir)", "$(TargetDir)_PublishedWebsites\$(TargetName)\bin\"))" Condition=" '$(RMS)' == '1' " />
</Target>
通过上面的方法就可以将Web应用完整发布,并结合Release Management Service实现持续集成。
TFS Build做Web应用持续集成发布的一个技巧的更多相关文章
- docker+headless+robotframework+jenkins实现web自动化持续集成
在Docker环境使headless实现web自动化持续集成 一.制作镜像 原则:自动化测试基于基础制作镜像 命令:docker run --privileged --name=$1 --net=ho ...
- Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上篇文章我们已经完成了API测试工具选型,接下来是一系列周期性的开发 ...
- postman+jenkins+newman做接口测试的持续集成
为何要做接口自动化测试的持续集成? 1. 接口相对稳定,改动少,比起GUI自动化测试来说性价比更加高些,不容易出现GUI自动化那种掉到维护脚本的坑里. 2. 接口测试比较简单,一个规范的接口,测试只需 ...
- (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程 - git -资料 - 不错的文档
1.Jenkins 2.0 的精髓是 Pipeline as Code Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色 ...
- Jenkins+SVN+tomcat持续集成发布
有代码更新后重新打包到tomcat再发布,是不是很烦? 看了下面的东西你就不会烦了. SVN或者git等代码版本控制工具不说了,如果是本地开发,也可以安装一个svn server端 jenkins下载 ...
- jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)
一. jenkins 的配置 1.前提条件安装了GitLab Plugin (源码管理使用),GitLab Hook(gitlab webhook需要) Manage Jenkins--->Ma ...
- Docker学习笔记五:Docker生成jenkins容器,支持Java Web项目持续集成、持续部署
一.创建jenkins容器: 1.拉取jeknin镜像 sudo docker pull jenkins 2.创建一个jenkins目录 sudo mkdir /jenkins 3.在jenkins目 ...
- 在TFS持续集成(持续发布)中执行Telnet任务
Telnet是一种在因特网或局域网上使用虚拟终端连接,提供双向交互式文本通信设备的协议. 它是最早的互联网通讯协议之一.自1969年启用以来,已经经过了将近50年时间,在开放式的操作系统中拥有广泛的用 ...
- (转载)持续集成(第二版)[来自:Martin Fowler]
转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...
随机推荐
- 阴影锥(shadow volume)原理与展望
转记:找了不少关于shadow volume原理的资料,还是这个帖子讲解的一目了然,转帖在这里,方便查阅.引用链接:http://blog.donews.com/yyh/archive/2005/05 ...
- CSS z-index优先级
可以设置div层与层之间的优先级,上下层覆盖优先情况. 当你定义的CSS中有position属性值为absolute.relative或fixed, 用z-index取值方可生效. 如果想要一个小的d ...
- HTML5 FileReader
利用HTML5中的FileReader类,动态切换af中Panel的背景,动态设置img元素的图片 1 if(FileReader){ 2 $('.panel').on("tap" ...
- [转]oracle awr报告生成和分析
转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数 ...
- 运行jsp常犯的错误
error 未启动tomcat服务 tomcat端口是否已改动 404: 未部署web应用 运行时URL输入错误 检查文件的存放位置(存放文件的目录无法对外引用,如WEB-INF , META-INF ...
- mysql中如何查看某个日期所在的周一是几号?某个日期所在的一周开始时间是几号?
需求描述: 在编写SQL的时候,有这么个需求,就是要查出来某个日期所在的周一是几号,进行了测试,在此进行记录下. 测试过程: 议题:查看某个日期所在的周一是几号 分析:如果某个日期是周一,那么加上整数 ...
- nuget类库xml说明以及类库说明文件添加到包中
1.nuget包制作添加xml操作:项目右键属性,生成配置输出xml文档文件,debug,release都配置一下,项目右键 yesway.redis.csproj 文件增加: 添加类库说明文件con ...
- JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用
Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...
- error:undefined reference to 'net_message_processor::net_message_processor()'
net_message_processor是我自己定义的一个类,文件名称分别是net_message_processor.h & net_message_processor.cpp 和CCD ...
- 【代码审计】LaySNS_v2.2.0 System.php页面存在代码执行漏洞分析.
0x00 环境准备 LaySNS官网:http://www.laysns.com/ 网站源码版本:LaySNS_v2.2.0 程序源码下载:https://pan.lanzou.com/i0l38 ...