Jenkins持續部署-Windows環境持續部署探究1

Jenkins持續部署-Windows環境持續部署探究1


目錄

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編譯完成以後,咱們須要處理如下事項完成持續部署。服務器

20190525121346.png

  1. jenkins編譯成功,則將全部的exe和dll文件先壓縮打包,文件名能夠命名爲Job名稱或者版本號
  2. 壓縮完成後將壓縮文件上傳到指定的FTP
  3. 上傳完成後,則須要關閉服務器上的指定服務
  4. 關閉完成後替換原始的程序目錄下的文件
  5. 啓動服務

這裏暫時不探討服務可用性的具體細節,也不討論服務升級失敗的回退工做等具體細節。網絡

技術實現

能夠分析出上述流程中涉及到的技術要點。ide

  1. 調用腳本對指定的文件進行壓縮,在windows上使用PowerShell執行腳本再合適不過了。
  2. 經過FTP上傳到服務器,能夠經過jenkins的FTP插件或者經過PowerShell腳本將文件上傳到指定服務器上。
  3. 關閉服務器上的指定服務,這裏就須要支持遠程調用,在windows上能夠經過winrm執行遠程服務調用。

PowerShell

Windows PowerShell 是專門爲系統管理員設計的 Windows 命令行 Shell。 Windows PowerShell 包括能夠單獨或組合使用的交互提示和腳本編寫環境。這裏不探討PowerShell的使用細節,由於這不是本篇文章的關注重點,具體的關於PowerShell的介紹能夠看微軟的官方文檔Windows PowerShell 入門
學習

FTP上傳插件

jenkins上有支持的FTP插件,好比Publish Over FTP Plugin,下載以後安裝重啓jenkins。測試

插件配置

在系統管理-系統設置下找到Publish over FTP項的設置,添加FTP服務的地址,端口,用戶名和密碼等相關配置,而後點擊TestConfiguration按鈕,若顯示Success表示配置成功。能夠手工添加多個FTP配置。
20190523203211.png
點擊Advanced按鈕修改端口或超時時間等配置
20190523203430.png
配置完成後到Job中添加FTP上傳功能,在Build中點擊Add Build step選擇Send file over FTP
20190523203623.png
Name經過下拉選擇前面配置的FTP站點,在Transfers配置須要上傳的文件和上傳到遠程的目錄。
20190523203825.png
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,以下圖所示
20190524142924.png
$PROCESS_VERSION變量的值咱們須要在前面的腳本中獲取,因爲在jenkinsBuild步驟中建立的每一個powershell腳本塊,jenkins都會將其保存到臨時的XXXX.ps1腳本文件中,所以不一樣的步驟產生的變量是在不一樣的腳本文件中,也就是在不一樣的做用域中。所以在前面建立的腳本獲取到的版本號,沒法直接在下一個腳本中獲取。

關於powershell的變量做用域能夠查看Powershell變量的做用域

以下圖所示,第一個腳本中賦值的$PROCESS_VERSION在後面的腳本以及FTP目錄中都是獲取不到該變量的。
20190524143518.png
所以咱們能夠經過將變量保存到文件,而後從新載入到Jenkins的環境變量中,Jenkins的環境變量在Jenkins當前Job中均可以獲取到。

環境變量插件

使用Jenkins的環境變量插件EnvInject Plugin實現上述功能。安裝完插件以後重啓Jenkins。
若是咱們多個Job須要用到一樣的參數常量,那咱們能夠將參數直接在Jenkins配置中注入到環境變量中,而後能夠經過環境變量$Env:XXXX獲取到咱們配置的變量值。

配置全局環境變量

在系統管理-系統設置下找到Global properties項,勾選環境變量,後便可設置全局的環境變量。這樣當這些變量修改後,只須要在設置中修改一次,而無需修改每一個Job中的腳本變量值。
20190524144502.png

使用環境變量

咱們如今能夠直接在Job中使用配置好的全局環境變量。在構建以後,能夠在當前構建項的Environment Variables查看到已加載的環境變量
20190524144818.png

從文件注入環境變量

如今咱們就能夠將將版本號信息存入到文件中,而後從新加載到全局環境變量中了。
首先在經過腳本獲取到程序的版本號,將它保存到文件中,保存格式爲變量名=變量值,如將PROCESS_VERSION="1.0.0.0"保存到Version.txt文件中。
而後經過環境變量注入插件從文本中讀取環境變量,在Build中添加Inject environment variables步驟,在Properties File Path中填寫Version.txt,則會從文本中讀取環境變量,多個環境變量經過換行分割。
20190524150233.png

默認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服務

  1. 快速配置

    微軟爲了簡化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縮寫

  2. 啓用遠程服務

    經過輸入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進行配置。前者作的工做已經包含了後者所作的全部工做。

  3. 查看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 = 拒絕訪問。
  4. 啓用Powershell本地腳本執行

    若須要在服務上執行本地腳本,則須要啓用本地腳本執行權限。經過執行set-ExecutionPolicy RemoteSigned容許本地腳本執行。

    PS C:\Users\Administrator> set-ExecutionPolicy RemoteSigned
    
    執行策略更改
    執行策略能夠防止您執行不信任的腳本。更改執行策略可能會使您面臨 about_Execution_Policies
    幫助主題中所述的安全風險。是否要更改執行策略?
    [Y] 是(Y)  [N] 否(N)  [S] 掛起(S)  [?] 幫助 (默認值爲「Y」): y
  5. 獲取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效果也同樣。
  6. 設置白名單地址

    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
  7. 客戶端遠程調用

    當設置好上述配置咱們就能夠測試如下遠程調用是否完成,經過在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腳本上傳,以及經過腳本生成差量更新包等具體工做。

  1. Windows PowerShell 入門
  2. Powershell變量的做用域
  3. Windows Remote Management
  4. windows服務器遠程執行命令(PowerShell+WinRM)
  5. winServer-經常使用winrm命令
  6. Use Powershell to start a GUI program on a remote machine
  7. Enable Powershell Remoting
  8. Enabling PowerShell remoting fails due to Public network connection type
  9. Automating with Jenkins and PowerShell on Windows - Part 2

本文地址:http://www.javashuo.com/article/p-dtqyisab-kz.html 做者博客:傑哥很忙 歡迎轉載,請在明顯位置給出出處及連接

相關文章
相關標籤/搜索