非真实项目,就是熟悉使用jenkins
入门教程,所以啰嗦点,基础点。
如上图:
有一台公网的linux服务器,一台家里的pc(develop1)和一台家里的笔记本电脑(develop2)。还有工程是存储在开源中国上。
要实现的功能就是:
这里使用docker来部署jenkins,docker最厉害的地方就是部署方便,当然jenkins在windows上的部署也很方便容易,主要就是为了学习docker。.Net程序的编译最好还是在开发机上,因为开发机上的编译环境最全,基本上装了vs就都有了。如果想单独弄一台服务器专门用于编译.Net项目,并且不想装vs,那可能要费点功夫在编译环境的搭建上了。使用jenkins有一个重要的思想就是jenkins扮演的是调度者的身份,把一些零碎的工作串联起来。 当初第一次把jenkins跑起来,我居然天真的以为可以用jenkins编译.Net项目,因为jenkins上会装一个MSBuild的插件。然而并不是这样滴,因为jenkins仅仅是一个调度者的身份,具体干事的还是这些从机,或者本机的一些编译命令。
在Ubuntu上安装Docker照着教程弄,还是很容易。
下载jenkins镜像,并且在Docker上运行起来,这里怎么下载怎么用都有详细说明,仔细看看
访问jenkins页面,设置一个账户,一些基本的插件安装,之后就能看到这个页面了
先配置开发机,也是编译用的机器develop1。
远程工作目录:就是从机的一个文件夹,这里要写绝对路径,我的就配置成:E:\jenkins_node
标签:相当于一个分组,多个从机可以分配到同一个标签下,我们这里用得少,就一个从机一个标签了,配置成node1
用法:因为只有这台机子可以编译.Net项目,所以配置成只允许运行绑定到这台机器的job
启动方法:这个后面有个帮助文档,点开可以看一下,选Launch agent via Java Web Start,这个的话就是要在从机上运行一个java的文件,这个东西就是一个代理,他会和jenkins服务器建立一条TCP通道,各种命令的传输,文件的拷贝就是通过这个代理和服务器建立的通道完成的。
Availability:选择keep this agent online as much as possible
然后保存,看到节点列表如下:
点击develop1,看到如下:
点击Launch这个按钮,会下载一个文件下来,slave-agent.jnlp,这个东西需要从机安装Java才能运行。安装好java之后,双击这个文件,就能运行起来,但是在网页节点列表上还是显示链接失败。这个时候看上图,还有一个方法Run from agent command line:,下面有个slave.jar包,下载下来,运行整个java命令,注意路径问题。之后就会显示连接上了。再用刚才我们的那个slave-agent.jnlp文件运行,发现也能链接上了。这个时候去看一下E:\jenkins_node,发现里面已经多了一些东西了。一个从机节点的配置就是如此,另外一台用于部署的机器也是如此,这里就略过了。
这里就是为了演示服务的部署,所以具体做什么不重要。但有个东西很好用,需要说一下,就是这个Topshelf。这个东西最厉害的地方就是能很容易地把一个控制台应用程序包装成服务运行起来,调试的时候使用控制台输出观察,具体要部署的时候,只需要在控制台应用程序.exe后加参数,就能运行为服务。可以看下教程,很简短,因为使用很简单。所以这里直接贴代码了。
DoServie.cs
1 2 3 4 5 6 7 8 9 10 11 12 |
public class DoService { public void Start() { } public void Stop() { } } |
Program.cs
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 |
class Program { static void Main(string[] args) { HostFactory.Run(config => { config.Service<DoService>((setting) => { setting.ConstructUsing(x => new DoService()); setting.WhenStarted(x => x.Start()); setting.WhenStopped(x => x.Stop()); }); config.StartAutomatically(); config.EnableServiceRecovery(recoveryConfig => { recoveryConfig.RestartService(0); }); config.SetDescription("test Jenkins"); config.SetDisplayName("testJenkins"); config.SetServiceName("testJenkins"); }); } } |
安装服务的脚本install.bat,先卸载以前的服务,再安装服务,再启动,这个%~dp0就是dos下的一些变量吧,意思是bat文件所在路径
1 2 3 4 5 |
%~dp0DoNothingService.exe uninstall %~dp0DoNothingService.exe install %~dp0DoNothingService.exe start |
卸载服务的脚本uninstall.bat
1 |
%~dp0DoNothingService.exe uninstall |
好,把这个东西上传到开源中国上。
回到主界面
菜单列表:新建,如下:
选择第一项,构建一个自由风格的软件项目,ok确定,进入到详细配置页面
这个页面先用到基本的3个模块==Genera,源码管理,构建==
General
基本信息里要注意红框中的部分,它的意思就是指定这个Job在哪个节点上运行,还记得我们上面创建的从机node1么,这里就是指定这个Job会交到node1上来执行。
源码管理
我这个项目是公开的,所以不需要身份验证信息,如果你的是私有项目,把账号密码填写一下就可以了。再有一个就是注意分支。源码管理就配置完了。
构建
再说构建之前,需要安装一个插件。先保存一下这个工程的配置。然后回到主菜单:系统管理->管理插件->可选插件,找到MSBuild Plugin,安装,稍等片刻,回到刚才工程的配置。
在构建下选择Build a Visual Studio project or solution using MSBuild,填写Command Line Arguments就行了,这里要注意一个路径问题,解决方案文件所在的路径,这里可以保存后,在项目页面点击立即构建,在里面看输出日志,哪里不对,慢慢调试。此时,node1下的路径为*E:\jenkins_node\workspace\NetServer*,这个节点代理从开源中国上把项目下载到了工作目录下,所以,编译参数的路径是以NetServer开始的。试几次之后,基本就能编译通过了。
注意: 从机需要安装git。
编译成功之后,我们得到了一堆.exe和dll,显然不利于传输,我们就用WinRar打个包,开发机要装winrar哦,并且添加到系统路径中。打包肯定是在编译成功之后执行的步骤,所以我们再增加一个构建步骤,并选择Execute Windows batch command,把我们的打包命令添加到当中
进入到输出文件目录,把Release文件夹打包为release.rar,注意-ibck参数是让winrar在后台运行。
至此我们在一台从机上编译了项目,并且把程序打了包。那么,我们如何从一台从机上把打包的东西运输到另一台从机上呢?
Copy Artifact Plugin,这是一个jenkins插件,安装它,就跟我们刚才安装MSBuild Plugin一样。
它的使用回到我们刚才NetServer这个项目里,在构建后操作中有个选项,Archive the artifacts,选择它。
存档的文件可以用通配符,注意路径问题。配置好这个之后,我们在立即构建一次。可以看到项目页面多了一行输出。
这样我们从机(node1)的工作就完成了。
这一步需要一个新的工程,基于NetServer的输出来完成。创建一个新的工程,还是选择自由风格。
还是注意红框处,现在是配置成了node2,意思就是这个任务会交到node2部署机上执行
下面就是很重要的一个配置了
就是这个项目怎么触发的,NetServer我们是手动触发,所以没有配置任何东西,NetServer_publish的话,需要NetServer构建成功后自动执行,所以需要如上配置触发器。继续下面的配置,构建步骤也很重要
Project name: 要从哪个项目Copy东西,依赖的上级项目
Artifacts to Copy: 这个要配置绝对路径,可以从前一个工程那里copy绝对路径过来
Target directory 和 Flatten directories: 这两个主要是用于自定路径的,不然会按照NetServer的目录结构完全一套搬过来,没必要,所以就这么设置,就只会在node2的工作目录下创建一个Build文件夹,里面就是release.rar文件。
立即构建一下试试,发现在部署机上是不是已经有了release.rar 包了。下面就是解压和运行了,我们不是可以执行dos命令么。继续添加构建,命令如下
立即构建一下,看输出日志调试,最终调通。
好,从头跑一遍,来到项目列表,立即构建项目NetServer,发现其执行完之后,立即开始了NetServer_Publish项目,观察部署机上的服务,卸载了又重新运行了。
这篇也就是学习路上的一个记录,主要自己想做的这个东西没有很全面的一个教程,都是每个插件怎么用,很零散,这次组合起来给后面来的同学一个小例子吧,也有很多不清楚的地方,错误的地方请各位大神指出。