又到一年国庆,终于有了难得的几天空闲,计划陪陪媳妇娃子,再把最近阅读的几本相关书总结梳理下。当然,计划总是美好的,于时接到了一个老朋友电话。大意是他搞了一个.net小网站,部署了4个节点,每次更新程序都是手动复制到4个机器,时不时忘记部署,忘记备份之类的问题,不胜其烦,希望我帮忙想个办法。回想2年前,在做无人货架项目时,也有部分是.net项目,当时自己也没能处理这个问题,当时用了webdeploy,效果并不理想,虽然后来几乎没碰过.net了,这个问题依然萦绕心头。既然有时间,有报酬,何不接此机会弥补两前年的遗憾呢,于时满口应承了下来。想想现在都在谈CI/CD, DevOps.. 过程应该会是相当愉悦的,又是小网站,要求也不是那么高。网站结构如下,非常简单。

01

还是jenkins

百度一番,一搜一大把,几乎都是利用jenkins,加上之前有过用jenkins做tomcat自动化部署的经验,心中一阵窃喜,过程真的如预期一般顺畅。于时动手,开始了我们愉悦之旅。jenkins是基于Java开发的一种持续集成工具,于时先安装java环境,配置环境变量(我是直接下载 window版本的 jdk 8)。接着下载window对应的jenkins版本,下载地址点这里,按提示操作,安装推荐插件(安装后也可以插件管理中自行安装),没有注意事项!一波流带走,就来到了欢迎界面。没有任何障碍,感觉半天就可以打卡收工。因为要编译.net程序,需要安装msbuild插件:以次  “Manage Jenkins” -> "Manage Plugins" -> "可选插件", 搜索 MsBuild,点击直接安装。操作如下图。

  接着  “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 MSBuild,因为MSBuild插件中自带的编译工具可能比较老,建议在本机安装 visual studio 相同版本,直接使用其自带的编译工具。配置如下

  接着,安装git服务,并在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置 git 相关参数,配置如下。

  再接着,安装插件 Publish Over SSH。然后在应用程序机器上安装FreeSSHD,用于文件上传和远程执行命名。FreeSSHD 配置过程如下:

   1,添加用户jenkins,

   2,配置telnet, ssh 端口为 23,28;

   3,配置 authentication 目录, 在jenkins服务器,生成ssh key,把公钥文件复制到这个目录,重命名为jenkins,与用户名相同。(使用命令 ssh-keygen -t rsa  生成公钥,私钥 )

   4,配置sftp 目录,为文件上传目录。

  5,以管理员身份运行 FreeSSHd。这个很重要,不然一直提示 auth fail.

   操作步骤如下图:

  接着,在 “Manage Jenkins” -> "System Configuration" -> "Global Tool Configuration" 中配置Publish Over SSH 相关参数,配置如下。

  在jenkins和应用服务上安装 7Z工具,用于压缩和解压。并在环境变量 path 中配置 7Z的安装目录(用于在任意目录执行命令)。到这里系统工具及配置就完成了,接下来开始任务配置。

02

愉悦的构建

环境搭建完成,就开始我们的表演吧。新建任务,名称你随意就好,选择“Freestyle project”类型,点击确定。进入任务配置界面。

  General 配置中,可以选中 Discard old builds 可以配置以天数和build记录数保留数据。

  源码管理中,添加好指定的git地址,及账号密码。以上流程没有任何障碍。

  构建中,添加步骤Execute Windows batch command,用户nuget restore。因为前面已经在jenkins机器上安装了visual stadio ,可以直接使用其自带的nuget 工具。 配置如下图,其中 nuget.bat的内容如下:

   NuGet.Build.Tasks.Console.exe restore VideosGYFileS.sln。其中 NuGet.Build.Tasks.Console.exe 为VS自带的,在path中配置了目录这里可以直接运行。(这个命令是在解决方案根目录执行的。),命令最后为exit 0 表示结束。

  

    接着添加步骤 Build a Visual Studio project or solution using MSBuild,选择第一步中添加的 MSBuild 配置,如下图,其中编译参数为:

  /t:Rebuild    /property:Configuration=Release;DeployOnBuild=true;TargetFrameworkVersion=v4.6。

  

  接着添加步骤Execute Windows batch command,用于打包编译后的文件,方便后面上传。压缩时需要排除一些配置文件,配置如下图,compress.bat文件内容如下:

    7z a  deploy.zip .\PrecompiledWeb\Web\* -xr!upload -xr!logs -x!web.config。 (.\  表示打包时去除前缀, -xr! 表示排除目录,-x! 表示排除文件)

  

  

  

  到这里,构建选项就已经配置完成了,开始构建,在解决方案目录生成了deploy.zip文件。那说明已经成功了70%了。

03

完美的构建后操作

构建完成,接下来就是把文件上传到目标服务器了。这就是要用到我们前面配置的  Publish Over SSH插件了。 添加构建后步骤,选择Send build artifacts over SSH。并添加第一步中创建的 应用服务器。多个服务器,可以添加多个server。要传输的文件为构建步骤中生成的文件 deploy.zip,上传后要执行的命令为:cmd.exe /c "d: && cd wwwroot && backup.bat"  中  backup.bat 完成文件备份以当前时间生成备份文件放到 backup文件夹中。文件内容如下;

  1. set vardate=%date:~0,4%%date:~5,2%%date:~8,2%
  2. set h=%time:~0,2%
    # 格式化小时,如果小时10,补0,不然会有空格

  3. set h=%h: =0%
  4. set otime=%h%%time:~3,2%%time:~6,2%
    # 备份文件格式 YYYYMMddHHmmss.zip

  5. set filename=%vardate%%otime%.zip
  6. # 备份原文件
  7. 7z a %filename% .\gyapp\* -x!deploy.zip -xr!upload -xr!logs
  8. # 移动文件到backup 文件夹
  9. move %filename% .\Backup
  10. # 解压文件
  11. 7z x deploy.zip -aoa -o"D:\wwwroot\gyapp"

 

  最后来一张构建成功的截图。

   到这里所有配置就完成了,如果顺利的话,自动化部署就完成了。鉴于本人能力问题,自到第79次构建,才真正愉快的左打收工了。没错,是79次!

  

04

结语

文章到这里,我只想说,这个过程真的不怎么愉悦。整个过程需要用到方方面面的知识,比如构建过程,环境变量配置,编写bat文件等 。也有很多异常问题,比如sshkey 版本问题,bat中时间格式问题等等。也要用到一些工具软件,比如7Z,FreeSSHD,jenkins。再者也有很多细节要考虑,比如备份文件,排除文件等。再有前面说的,百度一下,一搜打把的文章,大部分并无太多用处,很多都只是demo。比如,大部分都有说所到用ftp,但是无法支持子目录传输。以上种种问题,多次要奔溃放弃,怎奈受人之托,忠人之事,还好媳妇一直鼓励,并带着大宝小宝玩耍。最后断断续续用了几天时间,整体来说还是痛苦并快乐着。想着过程中那么问题,就想着整理成文,希望有需要的人看到本文,真的可以半天搞定。

I have a dream to be a good programmer。

.my_title { max-width: 100%; box-sizing: border-box; min-height: 1em; text-align: center; overflow-wrap: break-word !important; color: rgba(26, 173, 25, 1); font-size: 24px; word-wrap: break-word !important }

.net网站自动化部署-致两年前的遗留的问题的更多相关文章

  1. 使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署

    老早就想写这个话题了,今天正好有机会研究了一下 git 的自动化部署.最终做到的效果就是,每当有新的 commit push 到 master 分支的时候,就自动在测试/生产服务器上进行 git pu ...

  2. [转]基于AWS的自动化部署实践

    作者 徐桂林 发布于 2014年1月22日 -------------------------------------------------------------------- 1. 背景 在过去 ...

  3. 基于 Node.js 的服务器自动化部署搭建实录

    基于 Node.js 的服务器自动化部署搭建实录 在服务器上安装 Node.js 编写拉取仓库.重启服务器脚本 配置 Github 仓库的 Webhook 设置 配置 Node.js 脚本 其他问题 ...

  4. 利用Powershell在IIS上自动化部署网站

    本文主要讲如何通过Powershell在IIS上自动化部署ASP.NET网站,而不涉及Powershell的基本语法,如果没有Powershell基础的同学也可以把本文作为学习Powershell的基 ...

  5. fabric自动化部署django

    使用fabric部署django应用 使用fabric部署django应用 本文是我的网站易读中文网自动化部署的脚本实现,以下代码在ubuntu和debian中测试通过 由于网站使用的是python技 ...

  6. CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署

    CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客 ...

  7. Web应用程序与Web网站及部署在IIS中

    在Visual Studio可以创建 Web 应用程序项目或网站项目.通过选择 新建项目 或 打开项目 创建或打开一个 Web 应用程序项目在Visual Studio 文件 菜单. 通过选择 新建网 ...

  8. 自动化部署方案CICD

    自动化部署方案   由于来来也的时间不久,可能对现有的部署情况不是很了解,以下是个人对POC自动化部署的设计方案. 自动化部署优点 降低成本,提高生产力,高可用,更可靠,性能优化   与gitlab持 ...

  9. 使用 Fabric 自动化部署 Django 项目

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在上一篇教程中,我们通过手工方式将代码部署到了服务器.整个过程涉及到十几条命令,输了 ...

随机推荐

  1. boot磁盘空间大于80警报

    WARNING=80SPACE_USED=`df |grep '^/dev/sda' |tr -s ' ' %|cut -d% -f5|sort -n|tail -n1`[ "$SPACE_ ...

  2. rank,dense_rank和row_number函数区别

    我对技术一般抱有够用就好的态度,一般在网上或者书上找了贴合的解决方案,放到实际中发现好用就行了,不再深究,等出了问题再说. 因此,我对Oracle中中形成有效序列的方法集中在rownum,row_nu ...

  3. 字符串对象跟xml格式的转换

    package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...

  4. stackoverflow的ret2syscall利用

    ret2syscall 系统调用 ret2syscall,即控制程序执行系统调用,获取shell.Linux将内核功能接口制作为系统调用(system call),可在程序中直接调用.程序中存在int ...

  5. Ubuntu 18.04 LTS 配置静态IPv6地址

    学校的IPv4地址限制了校内IP访问,在家连校内机器只能先连接学校的VPN,十分不方便.好在学校没有对IPv6地址做限制,因此我们可以给自己的机器配置一个静态IPv6地址来绕过这个限制. 本机系统使用 ...

  6. python基础:内置函数zip,map,filter

    一.zip zip,就是把俩list,合并到一起,如果想同时循环2个list的时候,可以用zip,会帮你轮流循环两个list 比如: l1=[1,2,3,4,5] l2=['a','b','c','d ...

  7. Physics Experiment(POJ 3684)

    原题如下: Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3583   Accepte ...

  8. json模块:json.dumps()、json.loads()、json.dump()、json.load()

    json.dumps().json.loads().json.dump().json.load() 4个方法的总结和使用: 注意:存在文件里面的东西,读出来都是字符串 import json 1.js ...

  9. 绝了!一个妹子 rm -rf 把公司整个数据库删没了...

    经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据.对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错.也希望遇到问题的朋友能找到一丝灵感解决问题. 01 事故背景 安排一个妹子 ...

  10. 使用binlog2sql恢复数据

    binlog2sql 是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等.主要用途如 ...