最近入职了一家新公司,公司各个方面都让我很是的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给个人第一个任务——把整个项目的依赖引用从新整理并实施项目的CI/CD。html
本篇的重点主要分享此次在Windows平台使用Jenkins作.Net Framework的自动化,真是所谓一波N折。java
有关注过个人博客的朋友们,应该知道我以前都是在Linux上实施.Net Core,好不容易把Linux技能点起来,如今玩回Windows+.Net Framework感受有一种回到钻木取火的年代。git
在实施过程当中让我感悟最多的是,dotnet core命令的便捷性,Linux运维的便捷性,下文我有不少构建脚本都是shell脚原本的,当时想着学习一次就不须要学习bat脚本了,最终仍是躲不过。github
在远程传送并远程执行命令我折腾得最久,开始想着用FTP与Telnet,谁知道Telnet命令没有附带帐号密码参数,脚本很差写,后改为PsExec.exe,使用过程当中不少奇怪的问题,后来不得不去折腾OpenSSH,说实话仍是SSH好用,直接代替了FTP与PsExec。中间还遇到Jenkins使用本机帐号执行的权限问题。全部“坑”的我在下面步骤尽量给你们规避了。shell
项目(包含因此依赖的项目)依赖引用丢失,主要体现如下几点:json
依赖没有规范化对软件工程主要带来如下几点影响:windows
解决方案与顺序:api
工具名称 | 下载地址 | 描述 |
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的通讯。安全
以上是基本的信息概要,下面会进入具体的实施步骤。bash
新建一个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
在服务器47.115.111.58打开经过上面表格的连接下载VS的安装包,点开单个组件选项卡,勾选Msbuild,等待一会便可完成。
在服务器47.115.111.58根据上面表格nuget.exe CLI,下载后放到一个合适的文件目录,并在【环境变量配置】配置好路径,打开cmd并输入指令nuget help出现如下画面证实成功。
在部署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="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 SDKs\NuGetPackages\" /> </packageSources> </configuration>
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 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登陆了。
以上是各个服务器基本依赖安装。
在服务器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},尽量给一个简单纯英文的路径。
在主界面点击【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的配置基本上完成了。
新建Freestyle project,并在【源码管理】、【构建】填入您的构建信息,构建脚本我是保存在服务器上,由于保存在服务器上更加可靠。
#!/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的步骤就实施完毕了。
新建Freestyle project,并在【源码管理】、【构建】填入您的构建信息。[Publish Over SSH]插件跟OpenSSL能把编译好的文件发送到相应的服务器,并执行对应的集群分发脚本。
#!/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 '脚本执行结束'
记得在局域网把相应服务器的共享文件夹启动
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实施自动化的过程与步骤,若是你们有更好的建议与提议,能够在下方评论反馈给我。