<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .Net在Windows上使用Jenkins做CI/CD的那些事

          共 5269字,需瀏覽 11分鐘

           ·

          2020-09-09 23:51

          作者:陳珙

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

          背景

            最近入職了一家新公司,公司各個方面都讓我非常的滿意,我也懷著緊張與興奮的心情入職后,在第一天接到了領(lǐng)導給我的第一個任務(wù)——把整個項目的依賴引用重新整理并實施項目的CI/CD。

            本篇的重點主要分享這次在Windows平臺使用Jenkins做.Net Framework的自動化,真是所謂一波N折。

            有關(guān)注過我的博客的朋友們,應(yīng)該知道我之前都是在Linux上實施.Net Core,好不容易把Linux技能點起來,現(xiàn)在玩回Windows+.Net Framework感覺有一種回到鉆木取火的年代。

            在實施過程中讓我感悟最多的是,dotnet core命令的便捷性,Linux運維的便捷性,下文我有很多構(gòu)建腳本都是shell腳本來的,當時想著學習一次就不需要學習bat腳本了,最終還是躲不過。

            在遠程傳送并遠程執(zhí)行命令我折騰得最久,開始想著用FTP與Telnet,誰知道Telnet命令沒有附帶賬號密碼參數(shù),腳本不好寫,后改成PsExec.exe,使用過程中很多奇怪的問題,后來不得不去折騰OpenSSH,說實話還是SSH好用,直接代替了FTP與PsExec。中間還遇到Jenkins使用本機賬號執(zhí)行的權(quán)限問題。所有“坑”的我在下面步驟盡可能給大家規(guī)避了。

          引用整理

            項目(包含所以依賴的項目)依賴引用丟失,主要體現(xiàn)以下幾點:

          1. 官方依賴包沒有使用NuGet

          2. 內(nèi)部項目引用通過本地引用,項目沒有拉取則編譯失敗

          3. NuGet包多個版本的引用

          4. 同屬一個解決方案,但是項目分散到各個倉庫

            依賴沒有規(guī)范化對軟件工程主要帶來以下幾點影響:

          1. 缺少代碼或者代碼路徑不一致則無法正常編譯通過

          2. 對于新人同事不友好

          3. 實現(xiàn)CI/CD會有很大的阻力

            解決方案與順序:

          1. 整理組件庫到統(tǒng)一解決方案,日后有需要拆分再按需拆分,優(yōu)先保證需要依賴的在一個方案。

          2. 實現(xiàn)組件庫的自動發(fā)布到私有Nuget

          3. 整理API項目的依賴,拋棄以前本地依賴的方式,統(tǒng)一使用Nuget

          4. 實現(xiàn)API項目的自動發(fā)布到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發(fā)布、還原.Net依賴包
          MsBuildhttps://visualstudio.microsoft.com/zh-hans/vs/community/msbuild在vs安裝程序里
          Jenkinshttps://www.jenkins.io/zh/download/
          githttps://git-scm.com/download/win
          ?OpenSSH服務(wù)端https://github.com/PowerShell/Win32-OpenSSH/releases?遠程傳輸與遠程執(zhí)行命令

          物理部署圖

            文章會分享跨網(wǎng)絡(luò)環(huán)境的場景,我們使用了Gitee的企業(yè)倉儲,Jenkins與Nuget.Server會放在阿里云服務(wù)器,機房會開放一臺服務(wù)器與阿里云服務(wù)器進行SSH的通信。

            以上是基本的信息概要,下面會進入具體的實施步驟。

          NuGet.Server的部署

            新建一個ASP.Net Web應(yīng)用程序(.NetFramework),并選擇空模板,搜索NuGet.Server選擇3.4.1版本安裝后,打開Web.config文件設(shè)置apiKey,然后就可以部署到47.115.111.58的IIS了。

            官方部署文檔可以查看?https://docs.microsoft.com/zh-cn/nuget/hosting-packages/nuget-server

          ?

          安裝MsBuild

            在服務(wù)器47.115.111.58打開通過上面表格的鏈接下載VS的安裝包,點開單個組件選項卡,勾選Msbuild,等待一會即可完成。

          配置nuget.exe CLI

            在服務(wù)器47.115.111.58根據(jù)上面表格nuget.exe CLI,下載后放到一個合適的文件目錄,并在【環(huán)境變量配置】配置好路徑,打開cmd并輸入指令nuget help出現(xiàn)以下畫面證明成功。

          添加NuGet還原源配置項

            在部署Jenkins服務(wù)器47.115.111.58,打開C:\Windows\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config,沒有的化可以自己建一個,輸入以下腳本。

            如果沒有配置好,接下來的應(yīng)用項目可能會編譯時還原包失敗導致無法編譯通過。

          "1.0" encoding="utf-8"?>


          "nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
          "私有NuGet服務(wù)" value="http://47.115.11.58:8008/nuget" />
          "Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />

          安裝OpenSSH服務(wù)端

            根據(jù)上面表格的地址下載解壓后,在服務(wù)器47.115.151.108以管理員啟動CMD

          ?

          cd C:\tools\OpenSSH-Win64

          #安裝服務(wù)端
          powershell.exe
          -ExecutionPolicy Bypass -File install-sshd.ps1

          #啟動服務(wù)
          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登錄了。  

            以上是各個服務(wù)器基本依賴安裝。

          安裝Jenkins

            在服務(wù)器47.115.111.58,先把jdk與git安裝好后,點開Jenkins安裝,選擇默認路徑下一步,遇到設(shè)置服務(wù)登錄賬戶的時候,必須選擇以administrator安裝,不然后續(xù)會有很多執(zhí)行的權(quán)限問題。

          如果點擊Test Credentials無法通過,可以在運行輸入mmc打開策略編輯器,并在計算機配置-[windows設(shè)置]-[安全設(shè)置]-[本地策略]-[用戶權(quán)限分配]-[作為服務(wù)登錄],填寫administrator或者您的管理員賬號。

            接著點擊下一步等待完成后,會彈出一個localhost:8080的頁面,根據(jù)他的指示初始化界面就可以了。輸入完管理員賬號后這個時候可以去修改workspace的地址,當時我沒有修改地址的時候,因為路徑有特殊字符導致無論如何都無法用msbuild編譯通過。

            打開C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins.jenkins\config.xml,修改workspaceDir屬性的值為C:/jenkins_workspace/${ITEM_FULL_NAME},盡可能給一個簡單純英文的路徑。

          配置Jenkins

            在主界面點擊【Manage Jenkins】-【Configure System】界面,定位到Shell,輸入您剛安裝的git路徑的sh.exe,C:\Program Files\Git\bin\sh.exe

            同樣界面定位到SSH Servers點擊Add Server把剛剛安裝OpenSSL的服務(wù)器47.115.151.108填寫進去,賬號密碼是47.115.151.108服務(wù)器管理員的賬號密碼。

            在主界面點擊【Manage Jenkins】-【Global Tool Configuration】界面,定位到Git,輸入您剛安裝的git路徑的git.exe,C:\Program Files\Git\bin\git.exe

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

          自動發(fā)布組件包到NuGet

            新建Freestyle project,并在【源碼管理】、【構(gòu)建】填入您的構(gòu)建信息,構(gòu)建腳本我是保存在服務(wù)器上,因為保存在服務(wù)器上更加可靠

           

          ?

          ?

          構(gòu)建腳本shell示例

          #!/bin/bash
          #腳本開始執(zhí)行
          echo '腳本開始執(zhí)行'

          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 '發(fā)布成功:'$project_name''
          else
          echo '發(fā)布失敗:'$project_name''
          fi

          done

          echo '腳本執(zhí)行結(jié)束'

            以上發(fā)布組件包到私有NuGet的步驟就實施完畢了。

          自動發(fā)布Web應(yīng)用到IIS

          新建Freestyle project,并在【源碼管理】、【構(gòu)建】填入您的構(gòu)建信息。[Publish Over SSH]插件跟OpenSSL能把編譯好的文件發(fā)送到相應(yīng)的服務(wù)器,并執(zhí)行對應(yīng)的集群分發(fā)腳本。

          ?

          示例構(gòu)建shell腳本

          #!/bin/bash
          echo '腳本開始執(zhí)行'

          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 '發(fā)布成功:'$project_name''
          else
          echo '發(fā)布失敗:'$project_name''
          fi

          echo '腳本執(zhí)行結(jié)束'

          示例分發(fā)bat腳本

          記得在局域網(wǎng)把相應(yīng)服務(wù)器的共享文件夾啟動

          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

          結(jié)束

            以上記錄并分享了我在Windows實施自動化的過程與步驟,如果大家有更好的建議與提議,可以在下方評論反饋給我。

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91三级片在线观看 | 亚洲中文字幕性爱 | 青青草手机免费视频 | 成人精品视频网 | 亚洲网站在线看 |