最近入職了一家新公司,公司各個方面都讓我很是的滿意,我也懷着緊張與興奮的心情入職後,在第一天接到了領導給個人第一個任務——把整個項目的依賴引用從新整理並實施項目的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實施自動化的過程與步驟,若是你們有更好的建議與提議,能夠在下方評論反饋給我。