目錄html
Jenkins持續集成學習-Windows環境進行.Net開發1
Jenkins持續集成學習-Windows環境進行.Net開發2
Jenkins持續集成學習-Windows環境進行.Net開發3
Jenkins持續集成學習-Windows環境進行.Net開發4
Jenkins持續集成學習-搭建jenkins問題彙總
Jenkins持續部署-Windows環境持續部署探究1shell
在以前的文章中,對Windows環境下的持續集成方案進行探究,接下來對Windows環境下持續部署的方案進行學習與研究。windows
當jenkins集成編譯成功後,將文件上傳到指定的服務器FTP目錄。本文將介紹關於持續部署須要的一些技術方案的實現,在後續文章中繼續對持續集成具體的邏輯進行細化梳理。安全
當jenkins編譯完成以後,咱們須要處理如下事項完成持續部署。服務器
這裏暫時不探討服務可用性的具體細節,也不討論服務升級失敗的回退工做等具體細節。網絡
能夠分析出上述流程中涉及到的技術要點。ide
Windows PowerShell 是專門爲系統管理員設計的 Windows 命令行 Shell。 Windows PowerShell 包括能夠單獨或組合使用的交互提示和腳本編寫環境。這裏不探討PowerShell的使用細節,由於這不是本篇文章的關注重點,具體的關於PowerShell的介紹能夠看微軟的官方文檔Windows PowerShell 入門
學習
jenkins上有支持的FTP插件,好比Publish Over FTP Plugin,下載以後安裝重啓jenkins。測試
在系統管理-系統設置下找到Publish over FTP
項的設置,添加FTP服務的地址,端口,用戶名和密碼等相關配置,而後點擊TestConfiguration
按鈕,若顯示Success表示配置成功。能夠手工添加多個FTP配置。
點擊Advanced
按鈕修改端口或超時時間等配置
配置完成後到Job中添加FTP上傳功能,在Build
中點擊Add Build step
選擇Send file over FTP
在Name
經過下拉選擇前面配置的FTP站點,在Transfers
配置須要上傳的文件和上傳到遠程的目錄。
Source files
:支持通配符,如上傳全部文件*.*
,或bin/Release/
下的全部文件
Remove prefix
:表示上傳文件去除前綴,FTP默認會將文件的相對路徑一塊兒上傳,若不須要bin/Release
則能夠配置去除該相對路徑,如bin/Release/Test.exe
上傳到FTP上若沒有指定FTP遠程相對路徑,則爲FTP根目錄下的Test.exe
文件。
Remote directory
:表示上傳到FTP目錄下的哪一個相對目錄中,通常來講咱們能夠按Job名稱分文件夾,能夠通配置Jenkins內置的環境變量,如$JOB_NAME
/ui
上傳FTP前須要保證FTP上目錄結構存在,不然會上傳失敗。所以上傳FTP前須要經過腳本到服務器的FTP目錄上創對應的文件夾路徑。
通常來講咱們編譯完成後須要將程序按版本號分目錄存在,好比1.0.X的存放到1.0的目錄中。2.0.X的存放到2.0的目錄中。所以咱們能夠在Remote directory
填寫${JOB_NAME}/$PROCESS_VERSION
,以下圖所示
而$PROCESS_VERSION
變量的值咱們須要在前面的腳本中獲取,因爲在jenkinsBuild
步驟中建立的每一個powershell腳本塊,jenkins都會將其保存到臨時的XXXX.ps1
腳本文件中,所以不一樣的步驟產生的變量是在不一樣的腳本文件中,也就是在不一樣的做用域中。所以在前面建立的腳本獲取到的版本號,沒法直接在下一個腳本中獲取。
關於powershell的變量做用域能夠查看Powershell變量的做用域。
以下圖所示,第一個腳本中賦值的$PROCESS_VERSION
在後面的腳本以及FTP目錄中都是獲取不到該變量的。
所以咱們能夠經過將變量保存到文件,而後從新載入到Jenkins的環境變量中,Jenkins的環境變量在Jenkins當前Job中均可以獲取到。
使用Jenkins的環境變量插件EnvInject Plugin實現上述功能。安裝完插件以後重啓Jenkins。
若是咱們多個Job須要用到一樣的參數常量,那咱們能夠將參數直接在Jenkins配置中注入到環境變量中,而後能夠經過環境變量$Env:XXXX
獲取到咱們配置的變量值。
在系統管理-系統設置下找到Global properties
項,勾選環境變量,後便可設置全局的環境變量。這樣當這些變量修改後,只須要在設置中修改一次,而無需修改每一個Job中的腳本變量值。
咱們如今能夠直接在Job中使用配置好的全局環境變量。在構建以後,能夠在當前構建項的Environment Variables
查看到已加載的環境變量
、
如今咱們就能夠將將版本號信息存入到文件中,而後從新加載到全局環境變量中了。
首先在經過腳本獲取到程序的版本號,將它保存到文件中,保存格式爲變量名=變量值
,如將PROCESS_VERSION="1.0.0.0"
保存到Version.txt
文件中。
而後經過環境變量注入插件從文本中讀取環境變量,在Build
中添加Inject environment variables
步驟,在Properties File Path
中填寫Version.txt
,則會從文本中讀取環境變量,多個環境變量經過換行分割。
默認PowerShell保存的格式是含有BOM的Unicode編碼,而Jenkins讀取ASCII編碼格式。所以須要指定文本輸出編碼爲ASCII
經過Powershell腳本也能夠調用.Net庫將文件壓縮或上傳,這裏暫時不討論腳本編寫細節問題。後續文章將給出完整的解決方案。
在Linux環境下能夠經過SSH進行遠程調用,而在Windows環境下則可使用Windows 遠程管理 (Windows Remote Management,簡稱WinRM)。
WinRM是微軟實現的WS-Management協議的, 這是一種基於標準的簡單對象訪問協議(SOAP), 因爲它是基於防火牆友好的協議, 所以容許來自不一樣供應商的硬件和操做系統交互。關於WinRM具體的介紹能夠查看Windows Remote Management
咱們能夠理解爲WinRM提供了一個服務端,同時向外暴露了相關的API,而同時Powershell能夠與WinRM進行交互,即Powershell自己就是一個遠程調用的客戶端,經過Powershell執行相關的命令與WinRM交互,從而實現遠程調用,執行自定義腳本,甚至是執行服務器上的指定路徑下的腳本。
所以咱們若須要進行遠程調用,首先在對應的服務器上須要開啓WinRM的相關功能。
快速配置
微軟爲了簡化WinRM的配置,提供了一個快捷命令進行默認的快速配置。經過調用winrm quickconfig
進行快速配置。
也能夠跳過該步驟,直接運行第二步驟開啓WinRM服務。
以下返回則爲正常配置成功
PS C:\Users\Administrator> winrm quickconfig 在此計算機上,WinRM 已設置爲接收請求。 WinRM 沒有設置成爲了管理此計算機而容許對其進行遠程訪問。 必須進行如下更改: 在 HTTP://* 上建立 WinRM 偵聽程序接受 WS-Man 對此機器上任意 IP 的請求 啓用 WinRM 防火牆異常。 配置 LocalAccountTokenFilterPolicy 以遠程向本地用戶授予管理權限。 進行這些更改嗎[y/n]? y WinRM 已經進行了更新,以用於遠程管理。 在 HTTP://* 上建立 WinRM 偵聽程序接受 WS-Man 對此機器上任意 IP 的請求 WinRM 防火牆異常已啓用。 已配置 LocalAccountTokenFilterPolicy 以遠程向本地用戶授予管理權限。
須要注意的是,在我本地win10環境,沒法執行快速配置,提示說網絡鏈接類型是公用。
PS C:\Users\Dm_ca> winrm quickconfig 已在此計算機上運行 WinRM 服務。 WSManFault Message ProviderFault WSManFault Message = 因爲此計算機上的網絡鏈接類型之一設置爲公用,所以 WinRM 防火牆例外將不運行。 將網絡鏈接類型更改成域或專用,而後再次嘗試。 錯誤編號: -2144108183 0x80338169 因爲此計算機上的網絡鏈接類型之一設置爲公用,所以 WinRM 防火牆例外將不運行。 將網絡鏈接類型更改成域或專用,而後再次嘗試。
經過Get-NetConnectionProfile
命令能夠看到網絡類型(和網絡和Internet設置中看到的是同樣的)其中NetworkCategory : Public
即顯示該網絡的種類。
PS C:\WINDOWS\system32> Get-NetConnectionProfile Name : Seven InterfaceAlias : WLAN InterfaceIndex : 17 NetworkCategory : Private IPv4Connectivity : Internet IPv6Connectivity : NoTraffic Name : 未識別的網絡 InterfaceAlias : vEthernet (Default Switch) InterfaceIndex : 29 NetworkCategory : Public IPv4Connectivity : NoTraffic IPv6Connectivity : NoTraffic
經過管理員權限運行Set-NetConnectionProfile -NetworkCategory Private
將全部網絡設置爲專用網絡類型後
再次嘗試快速配置。
PS C:\WINDOWS\system32> Set-NetConnectionProfile -NetworkCategory Private PS C:\WINDOWS\system32> Get-NetConnectionProfile Name : Seven InterfaceAlias : WLAN InterfaceIndex : 17 NetworkCategory : Private IPv4Connectivity : Internet IPv6Connectivity : NoTraffic Name : 未識別的網絡 InterfaceAlias : vEthernet (Default Switch) InterfaceIndex : 29 NetworkCategory : Private IPv4Connectivity : NoTraffic IPv6Connectivity : NoTraffic
winrm qc是winrm quickconfig縮寫
啓用遠程服務
經過輸入Enable-PSRemoting –Force
啓用Powershell遠程調用功能。若沒有-Force
會有若干選項須要你進行確認。輸入了-Force
則自動會確認,建議帶上該參數。
PS C:\Users\Administrator> Enable-PSRemoting –Force 在此計算機上,WinRM 已設置爲接收請求。 WinRM 已經進行了設置,以用於在此計算機上進行遠程管理。
若第一步驟winrm qc
存在網絡類型爲公網沒法進行配置時,當前命令添加SkipNetworkProfileCheck
跳過網絡類型檢查,完整命令爲Enable-PSRemoting -SkipNetworkProfileCheck -Force
。
若輸入
Enable-PSRemoting
,則能夠再也不輸入winrm qc
進行配置。前者作的工做已經包含了後者所作的全部工做。
查看WinRM服務監聽
經過winrm enumerate winrm/config/listener
能夠查看WinRM服務的當前監聽信息
PS C:\Users\Administrator> winrm enumerate winrm/config/listener Listener Address = * Transport = HTTP Port = 5985 Hostname Enabled = true URLPrefix = wsman CertificateThumbprint ListeningOn = 10.60.45.239, 127.0.0.1, XXXXXXXXXXX
若上一步WINRM配置沒有成功,則會返回如下信息
PS C:\Users\Dm_ca> winrm enumerate winrm/config/listener WSManFault Message ProviderFault WSManFault Message = 拒絕訪問。
啓用Powershell本地腳本執行
若須要在服務上執行本地腳本,則須要啓用本地腳本執行權限。經過執行set-ExecutionPolicy RemoteSigned
容許本地腳本執行。
PS C:\Users\Administrator> set-ExecutionPolicy RemoteSigned 執行策略更改 執行策略能夠防止您執行不信任的腳本。更改執行策略可能會使您面臨 about_Execution_Policies 幫助主題中所述的安全風險。是否要更改執行策略? [Y] 是(Y) [N] 否(N) [S] 掛起(S) [?] 幫助 (默認值爲「Y」): y
獲取winrm客戶端配置信息
經過上述4個步驟,服務端的遠程調用已經開啓,因爲winrm自己有白名單安全策略,所以須要配置如下客戶端的配置,容許指定的ip執行遠程調用。經過輸入winrm get winrm/config/client
獲取客戶端配置。
PS C:\Users\Administrator> winrm get winrm/config/client Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts
Get-Item WSMan:\localhost\Client\TrustedHosts
效果也同樣。設置白名單地址
TrustedHosts
表示的是白名單地址。
經過Set-Item wsman:\localhost\client\trustedhosts *
設置容許全部IP調用。
經過Set-Item wsman:\localhost\client\trustedhosts "127.0.0.1,127.0.0.2"
設置容許指定IP調用
cmd
下能夠輸入winrm set winrm/config/client @{TrustedHosts="*"}
,測試了powershell下不支持該命令
Set-Item wsman:\localhost\client\trustedhosts "127.0.0.1,127.0.0.2" WinRM 安全配置。 此命令修改 WinRM 客戶端的 TrustedHosts 列表。TrustedHosts 列表中的計算機可能不會通過身份驗證。該客戶端可能會向這些計算機發送憑據信息。是否確實要修改此列表? [Y] 是(Y) [N] 否(N) [S] 暫停(S) [?] 幫助 (默認值爲「Y」): y PS C:\WINDOWS\system32> winrm get winrm/config/client Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts = 127.0.0.1,127.0.0.2
客戶端遠程調用
當設置好上述配置咱們就能夠測試如下遠程調用是否完成,經過在d盤放一個hellworld.ps1
腳本,填寫如下內容。
hello world!
而後就能夠在本地powershell中輸入如下指令測試遠程調用是否正常返回hello world!
$account = "administrator" $password = "test1" $address="127.0.0.1" $secpwd = convertto-securestring $password -asplaintext -force $cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd invoke-command -computername $address -Credential $cred -command {d:helloworld.ps1}
convertto-securestring
將明文密碼轉換爲安全字符串,這樣避免了明文密碼在網絡上傳輸泄露。invoke-command
將服務器地址傳入以及受權對象傳入便可執行遠程腳本調用。想更詳細的瞭解啓用遠程服務的細節能夠查看Enable Powershell Remoting
須要注意的是,若使用域帳戶用戶名進行遠程調用時,用戶名須要使用域名\用戶名
,而使用非域帳戶用戶名進行遠程調用時,用戶名須要使用\用戶名
。不然可能出現以下的錯誤信息
好比我要遠程登陸的用戶是非域用戶,用戶名爲administrator
,則使用\administrator
。
域帳號是把賬號存儲於域中的某一臺服務器,分享給同一個域中的全部計算機使用。
經過powershell與winrm實現遠程調用,服務升級就是將上傳到FTP的程序替換原有的程序便可。
這裏須要說明的一點是,控制檯程序和含有GUI界面的程序能夠經過調用命令殺掉進行實現關閉程序,可是要經過powershell啓用相關的控制他程序或含有用戶界面的程序,則很難作到。主要緣由是在windows環境下遠程命令執行和登陸windows用戶同樣,都是基於會話執行。在Windows安全模型設計上,是不支持啓動其餘會話的程序。相關問題能夠查看Use Powershell to start a GUI program on a remote machine。
換句話說,在會話鏈接釋放時,則會自動註銷會話相關的資源。所以當WinRM遠程調用結束後則會釋放臨時會話資源。
爲了實現啓用GUI程序,可使用PsExec。PsExec 是一款輕量級的遠程替換設備, 可以讓您在其餘系統上執行進程, 併爲控制檯應用程序提供完整的交互功能, 而無需手動安裝客戶端軟件。對於PsExec具體使用暫時沒有驗證過,有時間後面再作探討,這裏不進行深究。
另外一種方案是Powershell所能實現的是,基於Windows的定時任務,能夠設定在1分鐘後啓動GUI的exe文件。(Windows任務最小時間單位是1分鐘)實際上來講服務中斷1分鐘可不是好事,雖然能實現啓動服務,可是不建議使用,不作過多探討。
最好的方式是將服務器上的程序註冊爲Windows服務,那麼就很好的支持服務的關閉和啓動。
本文對Windows下的持續部署方案所設計到相關的技術進行了簡單介紹,後續的持續集成將徹底使用本篇文章設計到的Powershell腳本和遠程調用相關技術實現,後續持續集成惟一的要點就是持續集成邏輯的腳本編寫。在後續文章中,將會介紹powershell的壓縮解壓,ftp腳本上傳,以及經過腳本生成差量更新包等具體工做。
本文地址:http://www.javashuo.com/article/p-dtqyisab-kz.html 做者博客:傑哥很忙 歡迎轉載,請在明顯位置給出出處及連接