半天搭建你的Jenkins持续集成与自动化部署系统

前言

    相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛。由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由于当时对系统划分的不合理等等原因导致每次发版都会设计到多个系统的发布,小的版本三五个,大的版本十几个甚至几十个系统的同时发布!而我们也没有相应的基础设施的支撑,发版方式更是最传统的,开发人员将发布包发给运维人员,由其讲各个发布包一个一个覆盖到生产环境。因此每次上线仅仅发版就需要2-3个小时。这种方式不仅仅耗时、耗力,更是由于人工操作经常导致一些丢、落的现象。而我们当时的测试也是采用纯手工的测试,发版完毕后一轮回归测试就需要3-4个小时(当时主要是手工测试)。之前也一直提倡持续集成、自动化的测试和运维,但迟迟没有推进落地。终于在一个加班到凌晨四点的夜晚后,我再也受不了。回家后躺在床上迟迟睡不着,心想这个自动化的发布能有多难,他们搞不了,老子自己搞,于是6点爬起来来到公司,正式开始了我的持续集成、自动化部署的研究与推进之路。

一、初识Jenkins

    由于之前亦没有相关知识的积累,因此也是对如何实现也是一头雾水。于是只能找度娘,关键字"自动化发布"。搜索到很多工具和方法,但都是以Java平台居多,.net平台相关资料不多。其中以Jenkins介绍较多,微软也提供一套自动化部署的方式,也有一些其他持续集成工具可以实现自动化的发布,但最终还是选择了Jenkins。主要有以下几个原因:

  • 代码开源、插件丰富完善、系统稳定

  • 社区活跃,成功实践和网上资源较为丰富

  • 安装配置简单

  • web形式的可视化的管理页面

1. Jenkins是什么

     Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

持续集成:

    持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

2.Jenkins能干什么

    众所周知,工业革命解放了人类的双手,使得人们避免了很多重复性的工作,而Jenkins能帮助开发测试运维人员解决很多重复性工作,我们可以将一些重复性的工作,写成脚本,如:代码提交,执行单元测试,程序的编译、构建、发布等封装成脚本,由Jenkins替我们定时或按需执行。事实上Jenkins的众多插件就是如此,究其根本就是执行一个或多个windows或linux命令来完成我们的需求。

3.Jenkins的一个工作流程

    通过对Jenkins的简单了解后,对完成自动化发布有了大致思路,如下图为Jenkins的一个工作流程

640?wx_fmt=png

思路已经有了,接下来就是针对此流程,一步一步简单实现.NET Web应用程序基于Jenkins的自动化部署。

二、Jenkins 安装

    Jenkins有windows版本也有linux版本,由于我们项目都是基于.net freamwork进行开发,而jenkins构建需要编译.net程序,为了更方便的编译,因此选择安装windows版本。

1.下载

    可从Jenkins官网https://jenkins.io/download/下载windows安装包。

2.安装

    下载完成后,可按照提示进行安装即可。(windows下傻瓜式安装,注意Jenkins是java开发,因此需先安装对应jdk版本)

3.配置

    安装完成后会自动安装并启动一个windows服务,名为Jenkins,打开浏览器localhost:8080(Jenkins默认端口号为8080,如需修改可打开Jenkins安装目录找到Jenkins.xml修改其中端口,然后打开服务重启Jenkins服务即可)之后按照提示进行配置即可!配置完成后看到如下界面代表安装成功!

640?wx_fmt=png

    整个安装过程非常简单,基本上是傻瓜式按照提示操作即可,期间并未遇到问题,基本上10分钟左右就搞定了!接下来将介绍如何按照上述流程实现.NET下Jenkins的持续集成与自动化部署!

三、通过SVN获取源代码

1.安装插件

     根据我们的思路,首先要做的就是获取到我们的源代码。由于我们公司使用的源代码管理工具主要是SVN因此在这里主要介绍SVN的方式方法。根据度娘的指引,我们需要安装一个SVN的插件:Subversion Plug-in(如果:安装Jenkins时选择的安装推荐的插件,则Jenkins会直接给安装上这个插件,无需自己安装)。

2.项目配置

    安装插件后,选择新建一个自由风格的软件项目,起个名字,进入到项目配置后,找到源代码管理选项:

640?wx_fmt=png

主要有以下几个选项需要配置:

  • Repository URL:要获取的SVN的路径,如:https://127.0.0.1:9666/svn/HS.Mall/SoureCode/Trunk/Test

  • Credentials:配置SVN用户名和密码

  • Ignore externals:是否忽略SVN外部引用(这个很重要,稍后会用到,关于SVN外部引用,可自行百度)

  • Additional Credentials:当你的SVN版本库使用外部引用关联其它版本库是这个就很重要了

    Realm:填写SVN服务器的地址

     <https://127.0.0.1:9666> VisualSVN Server //(注意这个格式)

    Credentials:填写SVN用户名和密码信息

其它一些选项直接按照默认值就可以,关于每一项的详细介绍可以点击后面的小?号查看。

配置完成后点击保存后,构建该项目查看结果。若能够将源代码更新至Jenkins的工作空间内,则代表配置成功!

四、通过MSBuild编译应用程序

1.安装插件与环境

     编译.NET应用程序可通过微软提供的MSBuild工具,先安装插件:MSBuild。(注意:Jenkins服务器需安装MSBuild,建议在Jenkins上安装VS开发工具,可以在构建出问题的时候打开VS调试,省去很多不必要的麻烦)。

2.全局配置

    插件安装完毕后,进入系统管理->全局工具配置(ConfigureTools)找到MSBuild配置选项:

640?wx_fmt=png

  • Name:自己起个名字

  • Path to MSBuild:MSBuild.exe程序的物理路径

注意:此处MSBuild.exe必须与程序所使用freamwork版本相对应,此处我在这就遇到了一个大坑,一开始随便找个一个MSBuild工具,没想到根本编译不了C#6.0的语法。建议直接指向visual studio安装目录内的MSBuild.exe,可以避免很多问题。如VS2017在:Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin路径内。

3.项目配置

     打开我们之前创建的项目,找到构建选项->增加构建步骤->Build a Visual Studio project or solution using MSBuild

640?wx_fmt=png

  • Name:选择全局MSBuild配置的名称

  • MSBuild Build File:填写我们的要构建的项目.csproj文件,所相对工作的路径。如:/Test.csproj

  • Command Line Arguments:MSBuild的参数如:/t:Rebuild /P:Configuration=Release /p:VisualStudioVersion=14.0 /p:DeployOnBuild=True;PublishProfile=Test.pubxml

    配置完成后,点击构建,查看控制台信息,如能构建成功,则代表我们的配置无误!

    • /t:Rebuild 重新生成

    • /p:Configuration=Release Release 生成模式

    • /p:VisualStudioVersion=14.0 指定子工具集(VS2015为14.0,2017为15.0),不设置会报错

    • /p:DeployOnBuild=True;PublishProfile=Test.pubxml 使用 Test.pubxml 发布文件来发布项目 .pubxml文件可在VS发布时配置,位于Properties文件夹内。

4.遇到的问题

    原以为按照度娘的一系列解决方案能够很顺利的构建,可是在连续失败了几十次之后,才明白远远没有那么简单。期间主要遇到几个问题:

  • MSBuild版本不对导致构建不了C#6.0的语法

  • Jenkins 是讲版本库源代码更新到自己的工作空间内,再执行后续的构建工作。我们的程序很不规范,其中引用了许多不属于自己版本库的第三方依赖包,和一些自己开发的公共库,当时这些第三方包和公共库放在我们SVN的另一个版本库里进行管理,因此在构建的时候导致很多程序集找不到引用。

关于问题1:上面已经提过,只需要找到对应版本即可

而问题2:一开始找了很多资料也没有找到解决方案,后来还是从源代码管理上找到了方案。

方案1:

    借鉴Nuget的思想,使用Nuget服务器管理我们自己开发的一些公共依赖库。关于Nuget管理依赖的文章在另一篇博客里。

方案2:

    就是上面提到的SVN 外部引用,当时也是走投无路,于是疯狂翻译Jenkins的这些英文解释,在翻译到SVN插件的Ignore externals时,找到了这种方案,就是SVN可以设置外部引用,这样在更新版本库的时候就可以把依赖的版本库也更新下来,然后Jenkins SVN插件把这个Ignore externals选项去掉,然后在Additional Credentials选项里填上所依赖版本库的SVN配置,就能够把这些依赖也更新到SVN工作空间内。

    以上两个问题解决后,基本没有遇到太难的问题。由此可见我们的源代码管理的科学、规范是多么的重要。

几十次的构建失败,一堆乱七八糟的引用是多么痛的领悟!

五、通过Ftp发布至应用服务器

    构建成功后,Test.pubxml会指定发布的包的路径(最好是放到工作空间下),按照思路,接下来就是要想办法把发布包Copy到应用服务器的根目录下。由于我们的应用服务器都是windows系统,因此不能像linux系统一样通过ssh远程Copy过去,当时能想到的就是使用Ftp直接上传到应用服务器。

1.安装插件与环境

    Jenkins 安装插件Publish Over FTP,应用服务器上需开启Ftp。

 2.全局配置

    系统管理->系统配置下找到Publish over FTP配置项

640?wx_fmt=png

  • Name:起个名字,后面项目配置里会用的到

  • HostName:Ftp主机名(端口号默认21,在高级里面可以改)

  • Username:Ftp用户名

  • Password:Ftp密码

3.项目配置

    打开我们之前建的项目,找到构建后操作->增加构建后操作步骤->Send build artifacts over FTP

640?wx_fmt=png

  • Name:选择全局配置里的

  • Source files:选择你的发布包路径(这里是相对于工作空间的路径)

  • Remote directory:放到远程的哪个路径里(这里是相对于Ftp根目录的路径)

配置完成后,点击保存,构建即可!

六、结束语

    如上,就基本实现了我们的自动化发布的需求,这期间从早晨六点开始,差不多中午就完成了,当然也并不像上面介绍的那么简单,期间也遇到了许多问题,构建了大概一百多次,才最终成功了第一次。本文主要介绍实现自动化部署的一种基本的思路,当然还有很多方案可以实现我们的需求,甚至不仅仅局限于Jenkins。而这种方案其中也有许多细节的地方在文章中没有提到,如:如何实现自动化的Nunit单元测试,如何定时构建......,因为当时我在完成之后也给我的团队成员提供了一个非常详细的配置文档,并且培训了很多次,但事实证明,讲的越详细越会限制他们自己的主动思考与动手的能力。这也导致了后来我去做其他工作的时候,我们将近一年的时间还是停留在我这半天的研究结果的层面上,而生产环境更是迟迟没有使用。其实思路才是最重要的,有了思路我们就可以通过各种方式来解决我们的问题,还是建议大家注重解决问题的思路,多动手,自己实践,才能学得更透!关于.NET 平台下Jenkins实现持续集成与自动化部署的落地与实现的问题与讨论,可以在文章下留言。

相关文章:

  • VSTS + XX云服务器构建netcore+docker持续集成交付部署

  • .NET Core 从 Github到 Nuget 持续集成、部署

  • ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成

  • 一步步部署基于Windows系统的Jenkins持续集成环境

  • 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

  • 基于Jenkins快速搭建持续集成环境

  • .Net项目使用持续集成服务AppVeyor,Travis-CI实战

  • .NET Core微服务之基于Jenkins+Docker实现持续部署(Part 1)

  • .Net Core 自动化部署:使用jenkins部署应用

  • jenkins~集群分发功能的具体实现

原文地址:https://www.cnblogs.com/hunternet/p/9590287.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网 【每日一题】6月10日 失衡天平

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 终于Alice走出了大魔王的陷阱&#xff0c;可是现在傻傻…

P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/P3345 题目大意 nnn个点的一棵树&#xff0c;每次修改一个点的点权后询问一个xxx最小化∑y1ndis(x,y)∗dy\sum_{y1}^ndis(x,y)*d_yy1∑n​dis(x,y)∗dy​ 解题思路 先是构建一个点分树&#xff0c;然后考虑如何计算答案。 我…

[XSY]Illyasviel的图游戏(博弈论)

Illyasviel的图游戏 除了1号点和n号点每个点度数小于等于2&#xff0c;因此1 到 n 的所有简单路径互不相交。 在结束游戏前的最后一步一定是剩下一条 1 到 n 的路径&#xff0c;并且路径上的权值全都是1。 游戏总步数确定&#xff0c;如果剩下的最后一条路径确定了&#xff…

【dfs】数独游戏(ybtoj dfs-1-2)

数独游戏 ybtoj dfs-1-3 题目大意 给出一个未完成的数独&#xff0c;让你完成它 输入样例 4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4...... ......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3. end…

数学知识总结——矩阵

1 矩阵及其运算 由mnm\times nmn个数aija_{ij}aij​排成的mmm行nnn列的数表称为mmm行nnn列的矩阵&#xff0c;简称mnm\times nmn矩阵。记作&#xff1a; A[a11a12...a1na21a22...a2n............am1am2...amn]A\begin{bmatrix} a_{11} & a_{12} & ...&a_{1n}\\ a_…

.Net业务搭配实用技术栈

前言昨天有篇文章在讨论webform的设计思路&#xff0c;我已经四五年不用webform了&#xff0c;虽然它也提供了HttpModule和httphandle来处理请求&#xff0c;提供了一般处理程序ashx来简化处理流程&#xff0c;但依然会想起它的form runatserver&#xff0c;想起注册客户端脚本…

【dfs】虫食算(ybtoj dfs-1-3)

虫食算 ybtoj dfs-1-3 题目大意 给出一个如ABC的N进制的式子&#xff0c;现在知道某些位上的数字是相同的&#xff0c;让你求出这个式子 样例输入 5 ABCED BDACE EBBAA样例输出 1 0 3 4 2数据范围 1⩽N⩽261\leqslant N \leqslant 261⩽N⩽26 解题思路 从低位到高位枚举…

牛客网 【每日一题】6月11日题目精讲 背包

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码:题目描述 Applese有1个容量为v的背包&#xff0c;有n个物品&#xff0c;每一个物品有一个价值ai&#xff0c;以及一个大小bi 然后他对此提出了自己的疑问&#xff0c;如果我不要装的物品装的价值最大&#xff0c;只是一…

P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4899 题目大意 nnn个点的一张无向图&#xff0c;每次询问(s,t,l,r)(s,t,l,r)(s,t,l,r)表示询问能否找到一条s∼ts\sim ts∼t的路径使得该路径可以分割成点的序号在[l,n][l,n][l,n]和[1,r][1,r][1,r]的两段。 解题思路 首先对…

min_25筛

用途 设f(x)f(x)f(x)是一个积性函数&#xff0c;min_25筛可以在O(n34log⁡n)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43​​)内求f(x)f(x)f(x)的前缀和&#xff1a;∑i1Nf(i)\sum_{i1}^{N}f(i)∑i1N​f(i) 使用要求&#xff1a;f(p),f(pk)f(p),f(p^k)f(p),f(pk)的值可以快速…

Service Fabric 用 Powershell 部署应用到本地

前置说明安装 Service Fabric SDK&#xff0c;会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK 生成部署脚本&#xff0c;如下图&#xff1a;用VS创建一个 Service Fabric 应用后&#xff0c;有一个部署脚本&#xff0c;位置在 [应用…

【期望】路径长度(金牌导航 期望-1)

路径长度 金牌导航 期望-1 题目大意 给出一个图&#xff0c;问你从1走到n的期望路径长度 输入样例 4 4 1 2 1 1 3 2 2 3 3 3 4 4输出样例 7.00数据范围 1⩽n⩽1051\leqslant n \leqslant 10^51⩽n⩽105 1⩽m⩽2n1\leqslant m\leqslant 2\times n1⩽m⩽2n 1⩽u,v⩽n1\…

牛客网 【每日一题】6月8日 [SCOI2005]最大子矩阵

链接&#xff1a; 文章目录题目描述题目描述 这里有一个n*m的矩阵&#xff0c;请你选出其中k个子矩阵&#xff0c;使得这个k个子矩阵分值之和最大。 注意&#xff1a;选出的k个子矩阵 不能相互重叠。 输入描述: 第一行为n,m,k&#xff08;1 ≤ n ≤ 100,1 ≤ m ≤ 2,1 ≤ k ≤ …

CF1054D-Changing Array【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1054D 题目大意 一个长度为nnn的序列&#xff0c;每个数小于2k2^k2k&#xff0c;可以选择一些数xorxorxor上2k−12^k-12k−1。要求使得满足alxoral1xor...xorar0a_l\ xor\ a_{l1}\ xor...xor\ a_r0al​ xor al1​ xor...xo…

ElasticSearch入门 附.Net Core例子

1.什么是ElasticSearch?Elasticsearch是基于Lucene的搜索引擎。它提供了一个分布式&#xff0c;支持多租户的全文搜索引擎&#xff0c;它具有HTTP Web界面和无模式JSON文档。 Elasticsearch是用Java开发的&#xff0c;根据Apache许可条款作为开源发布。----来自维基百科的解释…

[XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

Tree Ext 这道题相当于把3道题合了起来。 要求修复的边中恰好有 k 条白边&#xff1a; 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) bzoj2654 tree(WQS二分 新科技get) 是最小生成树计数而非生成树计数&#xff1a; BZOJ1016」[JSOI2008] 最小生成树计数 具体可以看看…

【期望】乘坐电梯(金牌导航 期望-2)

乘坐电梯 金牌导航 期望-2 题目大意 有n个人&#xff0c;对于没一个单位时间有p的概率最前面的1个人进电梯&#xff0c;有&#xff08;1-p&#xff09;的概率不进&#xff0c;问你t个单位时间后&#xff0c;电梯中的期望人数 样例输入 1 1 0.50 1 样例输出 1 0.5 样例输入…

动态规划练习【一】 背包问题

详细讲解 背包问题大汇总 文章目录背包问题大汇总01背包问题&#xff1a;思路&#xff1a;空间优化复杂度代码总结&#xff1a;完全背包问题&#xff1a;思路&#xff1a;代码&#xff1a;优化多重背包问题&#xff1a;思路&#xff1a;代码&#xff1a;单调队列优化混合三种背…

P3329-[ZJOI2011]最小割【最小割树】

正题 题目链接:https://www.luogu.com.cn/problem/P3329 题目大意 nnn个点mmm条边的无向图&#xff0c;每次询问一个xxx表示最小割不超过xxx的点对数量。 解题思路 我们对于两个点sss到ttt完成网络流后的残量网络上&#xff0c;与sss联通的点属于点集SSS&#xff0c;与ttt联通…

《.NET 性能优化》送书活动结果公布

截止到9月7日18&#xff1a;00&#xff08;规则本是12&#xff1a;00&#xff0c;忙的忘记了这事&#xff0c;18点截的图&#xff09;&#xff0c;本次送书活动《.NET 性能优化》共收到100多位同学参与回复&#xff0c;本次很多同学在看到活动的书 &#xff0c;自行就到异步社区…