您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > .NET

.Net在Windows上使用Jenkins做CI/CD

时间:2020-09-10 10:06:14  来源:  作者:

背景

  最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的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使用本机账号执行的权限问题。所有“坑”的我在下面步骤尽可能给大家规避了。

引用整理

.Net在Windows上使用Jenkins做CI/CD

 

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

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

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

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

  解决方案与顺序:

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

工具准备

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

 物理部署图

.Net在Windows上使用Jenkins做CI/CD

 

  文章会分享跨网络环境的场景,我们使用了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

.Net在Windows上使用Jenkins做CI/CD

 


.Net在Windows上使用Jenkins做CI/CD

 

 

 安装MsBuild

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

.Net在Windows上使用Jenkins做CI/CD

 

配置nuget.exe CLI

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

.Net在Windows上使用Jenkins做CI/CD

 

添加NuGet还原源配置项

  在部署Jenkins服务器47.115.111.58,打开C:Windowssystem32configsystemprofileAppDataRoamingNuGetNuGet.Config,没有的化可以自己建一个,输入以下脚本。

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

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

安装OpenSSH服务端

  根据上面表格的地址下载解压后,在服务器47.115.151.108以管理员启动CMD

 

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

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

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

安装Jenkins

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

.Net在Windows上使用Jenkins做CI/CD

 

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

.Net在Windows上使用Jenkins做CI/CD

 

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

  打开C:WindowsSystem32configsystemprofileAppDataLocalJenkins.jenkinsconfig.xml,修改workspaceDir属性的值为C:/jenkins_workspace/${ITEM_FULL_NAME},尽可能给一个简单纯英文的路径。

配置Jenkins

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

.Net在Windows上使用Jenkins做CI/CD

 

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

.Net在Windows上使用Jenkins做CI/CD

 

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

.Net在Windows上使用Jenkins做CI/CD

 

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

自动发布组件包到NuGet

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

 

.Net在Windows上使用Jenkins做CI/CD

 


.Net在Windows上使用Jenkins做CI/CD

 

构建脚本shell示例

#!/bin/bash 
#脚本开始执行echo '脚本开始执行'
base_path=C:/jenkins_workspace/Librariynuget_url=http://47.115.111.58:8008/nuget
nuget_api_key=B82D6DDB-C6F958E8C945nuget restore $base_pathfor project_name in $base_path/*
doproject_path=$project_namepackage_path=$project_path/packagesrm -rf $package_pathnuget pack $project_path -Build -IncludeReferencedProjects -Properties Configuration=Release -OutputDirectory $package_path &&nuget push -ApiKey $nuget_api_key -Source $nuget_url $package_path/*.nupkgif [ $? -eq 0 ]; then
    echo '发布成功:'$project_name''
else
    echo '发布失败:'$project_name''
fidoneecho '脚本执行结束'

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

自动发布Web应用到IIS

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

 

.Net在Windows上使用Jenkins做CI/CD

 


.Net在Windows上使用Jenkins做CI/CD

 

示例构建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 0 ]; then
    echo '发布成功:'$project_name''
else
    echo '发布失败:'$project_name''
fi
echo '脚本执行结束'

示例分发bat脚本

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

net use \192.168.1.2app "password" /user:"administrator"
xcopy/a/s/h/y  C:appftpSFNovelAPI \192.168.1.2appAPI
net use \192.168.1.3app "password" /user:"administrator"
xcopy/a/s/h/y  C:appftpSFNovelAPI \192.168.1.3appAPI
xcopy/a/s/h/y C:appftpSFNovelAPI C:appSFNovelAPI

结束

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


转自 https://www.cnblogs.com/skychen1218/p/13633012.html



Tags:.Net   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
编译和反编译.NET 中的编译是把开发人员写的 C# 代码转化为计算机可理解的代码的过程,也就是中间语言代码(IL代码)。在这个过程中,C# 源代码被转换为可执行文件(exe或者dll 文件)...【详细内容】
2022-07-15  Tags: .Net  点击:(1)  评论:(0)  加入收藏
我们在开发 webapi 项目时如果遇到 api 接口需要同时支持多个版本的时候,比如接口修改了入参之后但是又希望支持老版本的前端(这里的前端可能是网页,可能是app,小程序 等等)进行...【详细内容】
2022-07-14  Tags: .Net  点击:(3)  评论:(0)  加入收藏
什么是.NET.NET 是由 Microsoft 创建的开源开发平台,用于生成多种不同类型的应用程序,主要支持C#、F#及VB。.NET程序运行原理.NET程序的运行是由其虚拟机CLR(公共语言运行时)把...【详细内容】
2022-06-21  Tags: .Net  点击:(26)  评论:(0)  加入收藏
项目介绍一套基于.NetCore+Vue2/Vue3+Element plus+uniapp,采用前后端分离方式,全自动生成PC与移动端代码的快速开发脚手架;支持移动端(uniapp)ios/android/h5/微信小程序。 Vu...【详细内容】
2022-06-13  Tags: .Net  点击:(56)  评论:(0)  加入收藏
多年前借鉴b/s优势实现基于.net的c/s框架 本框架未采用.NET固有的WCF通讯解决方案,而使用传统http数据加密方式.框架初始和传统客户端升级方式一样检查新版本,如有则下载升级...【详细内容】
2022-06-05  Tags: .Net  点击:(30)  评论:(0)  加入收藏
Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等等。使用Visual Studio...【详细内容】
2022-06-05  Tags: .Net  点击:(35)  评论:(0)  加入收藏
安装Hangfire新建ASP.NET Core空 项目,.Net Core版本3.1 往*.csproj添加包引用,添加新的PackageReference标记。如下所示。请注意,下面代码段中的版本可能已经过时,如有需要,请使...【详细内容】
2022-05-07  Tags: .Net  点击:(76)  评论:(0)  加入收藏
 B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm、WPF客户端程序依然具有很实用的价值,如设计类软件 AutoCAD与Autodesk Revit、WPS、IT类的集成开...【详细内容】
2022-04-27  Tags: .Net  点击:(153)  评论:(0)  加入收藏
前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈。这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档。...【详细内容】
2022-04-27  Tags: .Net  点击:(65)  评论:(0)  加入收藏
之前,我们已经了解了ASP.NET Core中的身份认证,现在,我们来聊一下授权。老规矩,示例程序源码XXTk.Auth.Samples已经提交了,需要的请自取。概述ASP.NET Core中的授权方式有很多,我...【详细内容】
2022-04-20  Tags: .Net  点击:(143)  评论:(0)  加入收藏
▌简易百科推荐
编译和反编译.NET 中的编译是把开发人员写的 C# 代码转化为计算机可理解的代码的过程,也就是中间语言代码(IL代码)。在这个过程中,C# 源代码被转换为可执行文件(exe或者dll 文件)...【详细内容】
2022-07-15  IT狂人日记    Tags:.NET   点击:(1)  评论:(0)  加入收藏
我们在开发 webapi 项目时如果遇到 api 接口需要同时支持多个版本的时候,比如接口修改了入参之后但是又希望支持老版本的前端(这里的前端可能是网页,可能是app,小程序 等等)进行...【详细内容】
2022-07-14  IT技术资源爱好者    Tags:.Net   点击:(3)  评论:(0)  加入收藏
什么是.NET.NET 是由 Microsoft 创建的开源开发平台,用于生成多种不同类型的应用程序,主要支持C#、F#及VB。.NET程序运行原理.NET程序的运行是由其虚拟机CLR(公共语言运行时)把...【详细内容】
2022-06-21  威步上海    Tags:.NET   点击:(26)  评论:(0)  加入收藏
Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等等。使用Visual Studio...【详细内容】
2022-06-05  海椰人  博客园  Tags:.Net   点击:(35)  评论:(0)  加入收藏
安装Hangfire新建ASP.NET Core空 项目,.Net Core版本3.1 往*.csproj添加包引用,添加新的PackageReference标记。如下所示。请注意,下面代码段中的版本可能已经过时,如有需要,请使...【详细内容】
2022-05-07  壮志林云    Tags:.NET   点击:(76)  评论:(0)  加入收藏
 B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm、WPF客户端程序依然具有很实用的价值,如设计类软件 AutoCAD与Autodesk Revit、WPS、IT类的集成开...【详细内容】
2022-04-27  IT技术资源爱好者  博客园  Tags:.NET   点击:(153)  评论:(0)  加入收藏
前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈。这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档。...【详细内容】
2022-04-27  海椰人  博客园  Tags:.Net   点击:(65)  评论:(0)  加入收藏
之前,我们已经了解了ASP.NET Core中的身份认证,现在,我们来聊一下授权。老规矩,示例程序源码XXTk.Auth.Samples已经提交了,需要的请自取。概述ASP.NET Core中的授权方式有很多,我...【详细内容】
2022-04-20  日行四善  博客园  Tags:授权   点击:(143)  评论:(0)  加入收藏
序言本文将分别介绍 Authentication(认证) 和 Authorization(授权)。并以简单的例子在 ASP.NET Core 6.0 的 WebAPI 中分别实现这两个功能。 相关名词Authentication 和 Author...【详细内容】
2022-04-18  芦荟柚子茶  博客园  Tags:ASP.NET   点击:(197)  评论:(0)  加入收藏
前言由于客户网络安全限制,连接到互联网的设备不能访问内网。需要先从客户端应用中导出数据到文件,再将文件复制到U盘,最后通过内网机器上传数据。如何保证,在复制、传输过程中,...【详细内容】
2022-03-22  My IO    Tags:.NET Core   点击:(125)  评论:(0)  加入收藏
站内最新
站内热门
站内头条