背景
最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的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使用本机账号执行的权限问题。所有“坑”的我在下面步骤尽可能给大家规避了。
引用整理
项目(包含所以依赖的项目)依赖引用丢失,主要体现以下几点:
- 官方依赖包没有使用NuGet
- 内部项目引用通过本地引用,项目没有拉取则编译失败
- NuGet包多个版本的引用
- 同属一个解决方案,但是项目分散到各个仓库
依赖没有规范化对软件工程主要带来以下几点影响:
- 缺少代码或者代码路径不一致则无法正常编译通过
- 对于新人同事不友好
- 实现CI/CD会有很大的阻力
解决方案与顺序:
- 整理组件库到统一解决方案,日后有需要拆分再按需拆分,优先保证需要依赖的在一个方案。
- 实现组件库的自动发布到私有Nuget
- 整理API项目的依赖,抛弃以前本地依赖的方式,统一使用Nuget
- 实现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/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16 | 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,等待一会即可完成。
MsBuild的命令参考:https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2019
配置nuget.exe CLI
在服务器47.115.111.58根据上面表格nuget.exe CLI,下载后放到一个合适的文件目录,并在【环境变量配置】配置好路径,打开cmd并输入指令nuget help出现以下画面证明成功。
相关指令参考:https://docs.microsoft.com/zh-cn/nuget/reference/nuget-exe-cli-reference