背景

  最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD

  本篇的重点主要分享这次在Windows平台使用Jenkins做.Net Framework的自动化,真是所谓一波N折。

  有关注过我的博客的朋友们,应该知道我之前都是在Linux上实施.Net Core,好不容易把Linux技能点起来,现在玩回Windows+.Net Framework感觉有一种回到钻木取火的年代。

  在实施过程中让我感悟最多的是,dotnet core命令的便捷性,Linux运维的便捷性,下文我有很多构建脚本都是shell脚本来的,当时想着学习一次就不需要学习bat脚本了,最终还是躲不过。

  在远程传送并远程执行命令我折腾得最久,开始想着用FTP与Telnet,谁知道Telnet命令没有附带账号密码参数,脚本不好写,后改成PsExec.exe,使用过程中很多奇怪的问题,后来不得不去折腾OpenSSH,说实话还是SSH好用,直接代替了FTP与PsExec。中间还遇到Jenkins使用本机账号执行的权限问题。所有“坑”的我在下面步骤尽可能给大家规避了。

引用整理

  项目(包含所以依赖的项目)依赖引用丢失,主要体现以下几点:

  1. 官方依赖包没有使用NuGet
  2. 内部项目引用通过本地引用,项目没有拉取则编译失败
  3. NuGet包多个版本的引用
  4. 同属一个解决方案,但是项目分散到各个仓库

  依赖没有规范化对软件工程主要带来以下几点影响:

  1. 缺少代码或者代码路径不一致则无法正常编译通过
  2. 对于新人同事不友好
  3. 实现CI/CD会有很大的阻力

  解决方案与顺序:

  1. 整理组件库到统一解决方案,日后有需要拆分再按需拆分,优先保证需要依赖的在一个方案。
  2. 实现组件库的自动发布到私有Nuget
  3. 整理API项目的依赖,抛弃以前本地依赖的方式,统一使用Nuget
  4. 实现API项目的自动发布到IIS

工具准备

工具名称 下载地址 描述
jdk-8u261-windows-i586.exe https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html Jenkins依赖
nuget.exe CLI  https://dist.nuget.org/win-x86-commandline/latest/nuget.exe 发布、还原.Net依赖包
MsBuild https://visualstudio.microsoft.com/zh-hans/vs/community/ msbuild在vs安装程序里
Jenkins https://www.jenkins.io/zh/download/  
git https://git-scm.com/download/win  
 OpenSSH服务端 https://github.com/PowerShell/Win32-OpenSSH/releases  远程传输与远程执行命令

物理部署图

  文章会分享跨网络环境的场景,我们使用了Gitee的企业仓储,Jenkins与Nuget.Server会放在阿里云服务器,机房会开放一台服务器与阿里云服务器进行SSH的通信。

  以上是基本的信息概要,下面会进入具体的实施步骤。

NuGet.Server的部署

  新建一个ASP.Net Web应用程序(.NetFramework),并选择空模板,搜索NuGet.Server选择3.4.1版本安装后,打开Web.config文件设置apiKey,然后就可以部署到47.115.111.58的IIS了。

  官方部署文档可以查看 https://docs.microsoft.com/zh-cn/nuget/hosting-packages/nuget-server

安装MsBuild

  在服务器47.115.111.58打开通过上面表格的链接下载VS的安装包,点开单个组件选项卡,勾选Msbuild,等待一会即可完成。

配置nuget.exe CLI

  在服务器47.115.111.58根据上面表格nuget.exe CLI,下载后放到一个合适的文件目录,并在【环境变量配置】配置好路径,打开cmd并输入指令nuget help出现以下画面证明成功。

添加NuGet还原源配置项

  在部署Jenkins服务器47.115.111.58,打开C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config,没有的化可以自己建一个,输入以下脚本。

  如果没有配置好,接下来的应用项目可能会编译时还原包失败导致无法编译通过。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="" />
<add key="私有NuGet服务" value="http://47.115.11.58:8008/nuget" />
<add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />
</packageSources>
</configuration>

安装OpenSSH服务端

  根据上面表格的地址下载解压后,在服务器47.115.151.108以管理员启动CMD
 
cd C:\tools\OpenSSH-Win64

#安装服务端
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 #启动服务
net start ssh-agent
sc config ssh-agent start= auto
net start sshd
sc config sshd start= auto #防火墙打开22端口
#大于等于 Windows Server
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort #小于 Windows Server
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=

  这样就可以通过administrator账号或者管理员账号在客户端用ssh登录了。  

  以上是各个服务器基本依赖安装。

安装Jenkins

  在服务器47.115.111.58,先把jdk与git安装好后,点开Jenkins安装,选择默认路径下一步,遇到设置服务登录账户的时候,必须选择以administrator安装,不然后续会有很多执行的权限问题。

如果点击Test Credentials无法通过,可以在运行输入mmc打开策略编辑器,并在计算机配置-[windows设置]-[安全设置]-[本地策略]-[用户权限分配]-[作为服务登录],填写administrator或者您的管理员账号。

  接着点击下一步等待完成后,会弹出一个localhost:8080的页面,根据他的指示初始化界面就可以了。输入完管理员账号后这个时候可以去修改workspace的地址,当时我没有修改地址的时候,因为路径有特殊字符导致无论如何都无法用msbuild编译通过。

  打开C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins.jenkins\config.xml,修改workspaceDir属性的值为C:/jenkins_workspace/${ITEM_FULL_NAME},尽可能给一个简单纯英文的路径。

配置Jenkins

  在主界面点击【Manage Jenkins】-【Configure System】界面,定位到Shell,输入您刚安装的git路径的sh.exe,C:\Program Files\Git\bin\sh.exe

  同样界面定位到SSH Servers点击Add Server把刚刚安装OpenSSL的服务器47.115.151.108填写进去,账号密码是47.115.151.108服务器管理员的账号密码。

  在主界面点击【Manage Jenkins】-【Global Tool Configuration】界面,定位到Git,输入您刚安装的git路径的git.exe,C:\Program Files\Git\bin\git.exe

  到这里Jenkins的配置基本上完成了。

自动发布组件包到NuGet

  新建Freestyle project,并在【源码管理】、【构建】填入您的构建信息,构建脚本我是保存在服务器上,因为保存在服务器上更加可靠

 

构建脚本shell示例

#!/bin/bash
#脚本开始执行
echo '脚本开始执行' base_path=C:/jenkins_workspace/Librariy
nuget_url=http://47.115.111.58:8008/nuget
nuget_api_key=B82D6DDB-C6F958E8C945 nuget restore $base_path for project_name in $base_path/*
do project_path=$project_name
package_path=$project_path/packages rm -rf $package_path nuget pack $project_path -Build -IncludeReferencedProjects -Properties Configuration=Release -OutputDirectory $package_path &&
nuget push -ApiKey $nuget_api_key -Source $nuget_url $package_path/*.nupkg if [ $? -eq 0 ]; then
echo '发布成功:'$project_name''
else
echo '发布失败:'$project_name''
fi done echo '脚本执行结束'

  以上发布组件包到私有NuGet的步骤就实施完毕了。

自动发布Web应用到IIS

新建Freestyle project,并在【源码管理】、【构建】填入您的构建信息。[Publish Over SSH]插件跟OpenSSL能把编译好的文件发送到相应的服务器,并执行对应的集群分发脚本。

示例构建shell脚本

#!/bin/bash
echo '脚本开始执行' base_path=C:/jenkins_workspace/API project_path=$base_path/API.csproj
publish_path=$base_path/publish rm -rf $publish_path nuget restore $base_path &&
MSBuild.exe $project_path -t:"rebuild;publish;ResolveReferences;_CopyWebApplication" -p:"Configuration=Release;OutputPath=$publish_path" if [ $? -eq ]; then
echo '发布成功:'$project_name''
else
echo '发布失败:'$project_name''
fi echo '脚本执行结束'

示例分发bat脚本

记得在局域网把相应服务器的共享文件夹启动

net use \\192.168.1.2\app "password" /user:"administrator"

xcopy/a/s/h/y  C:\app\ftp\SFNovelAPI \\192.168.1.2\app\API
net use \\192.168.1.3\app "password" /user:"administrator"
xcopy/a/s/h/y  C:\app\ftp\SFNovelAPI \\192.168.1.3\app\API
xcopy/a/s/h/y C:\app\ftp\SFNovelAPI C:\app\SFNovelAPI

结束

  以上记录并分享了我在Windows实施自动化的过程与步骤,如果大家有更好的建议与提议,可以在下方评论反馈给我。

.Net在Windows上使用Jenkins做CI/CD的那些事的更多相关文章

  1. Spark 灰度发布在十万级节点上的成功实践 CI CD

    原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/spark/ci_cd/ 本文所述内容基于某顶级互联网公司数万节点下 Sp ...

  2. Jenkins 配置CI/CD任务

    本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上. 如果是初始尝试实践,可能需要参考 快速搭建云原生架构的实践环境 和 Jhipster技 ...

  3. 使用 Jenkins 搭建 CI/CD All In One

    使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...

  4. 【Jenkins持续集成(二)】Windows上安装Jenkins教程

    一.前言 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Docker 或者通过一个独立的 Java ...

  5. Jenkins自动化CI CD流水线之1--介绍与安装

    第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...

  6. 前端静态站点在阿里云自建 K8S DevOps 集群上优雅的进行 CI/CD

    目录 网站 域名 K8S DevOps 集群 私有 Gitlab 使用 Docker 编译站点 * Dockerfile * 构建编译 Image * 测试编译 Image * 推送镜像到 Aliyu ...

  7. Jenkins自动化CI&CD流水线

    1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...

  8. windows上使用Jenkins&Github实现CICD

    一.摘要 本篇文章笔者将详细介绍Jenkins和Github如何实现CICD的,文章将以Jenkins的使用为主线,伴随着介绍Git的使用,加上一些python代码的执行,最终生成测试报告 二.Jen ...

  9. Jenkins自动化CI CD流水线之4--Master-Slave架构

    一.介绍 jenkins的Master-slave分布式架构主要是为了解决jenkins单点构建任务多.负载较高.性能不足的场景. Master/Slave相当于Server和agent的概念.Mas ...

随机推荐

  1. 030_go语言中的通道关闭

    代码演示 package main import "fmt" func main() { jobs := make(chan int, 5) done := make(chan b ...

  2. Java实现邮箱验证码

    前言 相比于java实现短信验证码,邮箱验证码就简单了许多,目前只是简单的利用java发送自定义内容至指定邮箱,等过几天再弄短信和邮箱验证码Web版本的.查询网上资料,得知相比于网易邮箱,QQ邮箱是最 ...

  3. CSS网页排版

    自印刷出版物诞生以来,排版就一直是平面设计的基础. 同样,排版在网页设计中也扮演着重要角色. 1.CSS的基本排版技术 1.1 文本颜色 对应网页而言,文本颜色也许是最基本的样式之一. 默认情况下,浏 ...

  4. 百度小程序中swan.setPageInfo的用法

    现在百度智能小程序是百度最新的流量入口,现在很多做SEO优化.小程序开发的企业为了获取更多的流量不得不开发了,很多的技术人员不了解百度小程序的标题和关键词.描述等信息不知道在哪里设置. 以下是小编给你 ...

  5. Java—增强for循环与for循环的区别/泛型通配符/LinkedList集合

    增强for循环 增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的. 它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作. ...

  6. js利用canvas绘制爱心

    js代码如下: var cav = document.getElementById("a").getContext("2d"); function draw(x ...

  7. 初识ABP vNext(3):vue对接ABP基本思路

    目录 前言 开始 登录 权限 本地化 创建项目 ABP vue-element-admin 最后 前言 上一篇介绍了ABP的启动模板以及AbpHelper工具的基本使用,这一篇将进入项目实战部分.因为 ...

  8. 【java】java获取JVM启动参数 System.getProperty

    java获取JVM启动参数 System.getProperty取 -D后的key即可 public class Test { public static void main(String[] arg ...

  9. 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...

  10. NameNode和SecondaryNameNode(面试开发重点)

    NameNode和SecondaryNameNode(面试开发重点) 1 NN和2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁 ...