windows服务器使用 azure devops 批量自动发布网站到IIS
最近由于一个API项目,需要利用负载均衡来做支撑,因此需要将同一份代码分发到多个服务器,之前一直手工干这个活,感觉太累了,去开发交流群,还有搜索了一下资料,发现很多人推荐我用ftp、还有磁盘共享等这种偏门的方案,每个人都振振有词的说有多好多简单,其实仔细想想一堆的问题,比如说复制到一半断网怎么办?比如说版本回退怎么办?网站IIS是不是得一个个自己去新建站点进行配置了?所以我坚信专业的事要交给专业的工具去干。
所以一通搜索资料后,发现devops工具可以用,然后博问里面有人推荐我用azure devops。然后花了两三天时间去研究这个azure devops,终于跑通了所有流程,为了防止自己后面忘记如何配置,也方便大家参考,所以写了这篇博文来记录过程。
关于什么是devops,自行百度,我写这篇文章主要是记录一下我是如何利用这个微软的 azure devops 来帮我实现开头说的“将同一份代码,自动编译后自动部署到N台服务器上”
正常来说,我们写完了代码后,比如vs2019,写完了代码后,我们会点击发布按钮,然后输出到本地文件夹,压缩后,上传到服务器,对服务器IIS上的站点的路径进行暂停IIS站点后,覆盖,然后启动IIS站点。
但是,如果说,同一份代码要部署到N台服务器,我们就需要重复以上这个步骤N次,工作量大不说,出错的概率也大。
因此,我们需要一个工具,它能自动把我们编译后的代码,进行自动传输到N台服务器(下面我们称这些服务器为“目标服务器”),并且按我们的要求配置好IIS站点信息(比如端口号、域名等)
因此我们需要类似 devops 这种工具。
简单来说azure devops 帮我们做了如下工作:(理解了它帮我们做了哪些工作有助于我们使用这个工具)
1、将代码进行编译。(传统编译,我们是用IDE的编译,比如VS2019的发布功能,将编译后的文件发布到本地文件系统,再手动上传到目标服务器)
(写给小白:vs2019的发布,其实也就是几个命令,我们习惯了vs图形化操作后,不知道这个命令而已,其实就是类似 dotnet restore 、 dotnet build 、 dotnet publish 执行这种命令而已,也就是说,只要有一台服务器,它上面安装了相关的.net sdk,能执行这些命令,即使没有vs,它也是能进行编译和发布的 )
2、将编译后的代码,发布到目标服务器,并设置IIS web站点信息(也可能是其他系统,其他web服务器,比如linux的apache,因为我的负载后面的机器是windows的,所以用windows+IIS来写了这篇文章)。
对于第1步,azure devops会用他们编译服务器帮我们进行编译,也就是说,azure准备了一堆服务器,让我们用于编译工作,但是由于某些不法分子恶意利用,比如用微软的服务器进行挖矿,所以微软对于新账号,可能会限制你使用他们的服务器进行编译(下文有解决办法,我们可以自己搭建编译服务器),所以,你在执行编译的时候,可能会提示你不能进行并行任务。
理解了以上这个的内容后,接下来进入到 azure devops 的实际操作。
总结起来我们在azure devops 中要做的工作有:
1、配置一个Pipeline,让它能顺利对你存储在云端的代码(比如svn、github)上的代码进行拉取,编译。
2、配置一个Release,让你的Pipeline的代码编译成功后,能自动发布到目标服务器。
如果英语可以的小伙伴,可以自己上手去尝试添加,不用看下面的文章,如果你一通捣鼓下来失败了,再继续看我下面这个文章。
首先,进入到 azure ,注册账号,创建组织和项目,没什么好说的,跟着网页输入框去做就是了。地址如下:https://dev.azure.com/
以上是创建好组织和项目的截图。
点击项目后,进入项目后,有一个菜单,我们重点关注菜单:Pipelines ,点击它,如图:(你们没有创建pipeline之前是没有那个绿色✓ 的那一行的)
说真的,我也不知道该如何翻译这个“Pipelines” ,按道理可能应该叫做“管道”,我们只要能理解,所有编译工作,都是通过这个管道提交给编译服务器的就可以了,通过配置它,可以定义你的代码位置(比如代码放在github、svn等),
然后,我们先创建一个pipeline ,点击界面右上角的那个“New pipeline” ,选择你代码所在位置(所以,这就要求你的代码不能单纯存放在你本地,应该要把代码上传到类似 github、svn这种云端),我的代码是放到svn服务器上的,因此我选了 Subversion ,然后添加svn链接以及账号信息即可,然后点击 “continue” ,然后根据你要编译的项目类型选一个,因为我的是 .net core 项目,我选择了 ASP.NET Core 这个(如果你的代码还没存储到云端,只是想创建项目测试,可以用微软的示例代码库的代码,它存在github上,你可以先转存到你的github账号,然后授权azure去读取你的github项目代码,就可以有一份代码用来测试了)。当我选择了 ASP.NET Core 后,配置界面是这样子的,
其中:
Pipeline 标签下,主要看那个 Agent Pool ,如果你选择微软的 Azure Pipeline 编译失败,提示你不可以运行并行任务的话,我们就需要搭建自己的编译代理服务器,关于如何搭建代理服务器,看这篇文章:微软azure devops 如何搭建代理池服务器 - LoveCoder - 博客园 (cnblogs.com)
可能是因为我按之前报错的提示,填写表单,申请了使用微软他们的服务器进行编译,申请完了以后可能过了2天不到吧,现在已经可以用他们服务器进行编译了,我配置好如下图:
我那个apigateway/taobaoapigateway/*.csproj ,代表的是我只想编译我拉取到的代码的根目录下的这个目录的项目(因为我这个svn是一整个解决方案,里面有N个项目,比如作业线程、类库文件,而我真正需要他编译并发布的,只有这个 taobaoapigateway 这个文件夹下的项目)
那个Get souces 是配置从哪里获取你的代码的,一开始我们创建这个pipeline的时候就指定了,现在也能修改。
下面那个 Agent job ,不需要配置什么,把必填的大概填写一下就好了
配置完了以后可以点击 Save & Queue ,它就会执行了。
如果成功执行,会如下图:
只要看到上面这个图,代表编译这块,已经是利用服务器来编译了,接下来就是部署了。下一篇写关于部署的。
利用微软azure devops自己的编译服务器,有一点好像不太好,每次编译都要去全量拉取代码(因为它每次都要删除我们的代码?还是每次分配到的机器都不一样?还是说能配置不要每次都全量拉?知道的大神说一下),我用我自己架设的编译代理服务器,因为代码一直在服务器上,每次都是增量拉取一下就编译,很快。