1. 程式人生 > >.netcore mvc docker環境jenkins一鍵部署(DevOps)

.netcore mvc docker環境jenkins一鍵部署(DevOps)

poi src .sh 推薦 systemctl 新建 AC -c packages

【前言】

  DevOps方面的文章很早之前就想分享了,擠出一點時間把前段時間搭建的一些提高開發效率的東西給大家分享一下吧。

  本文介紹了一個.netcore mvc web項目,從項目push到github開始

  1. 自動從github上拉取代碼
  2. 編譯,生成,發布
  3. 停止docker容器,刪除docker鏡像
  4. 通過項目的dockerfile新建docker鏡像
  5. Run容器,自動綁定ip,站點啟動

  整個過程只需要在jenkins這個自動化工具上點一個按鈕。下面我們按順序來簡單介紹一下。

  使用的內容都很基礎,重要的是一切自動化的思維,我們要提高我們的開發效率,減少在開發階段上浪費的不必要的時間。

一、jenkins的安裝/部署

  這個放在單獨章節講解,這裏先占個地方,以後放個鏈接(*^_^*),大家可以先參考我之前參考的一篇博文 https://segmentfault.com/a/1190000007086764

  其實jenkins配置時候的坑比較多,簡單介紹幾個,或許大家碰上了,可以直接問我。

  1. 構造的時候提示沒權限,permission問題

二、從Github上拉取代碼執行命令的配置

1、github插件的安裝以及github的配置

  git的插件其實在jenkins安裝過程中的推薦插件提示中有,如果直接安裝了推薦的插件,那麽無需再去安裝。

  如果沒有安裝推薦插件,那麽可以進入jenkins的系統管理

    技術分享圖片

  管理插件

  技術分享圖片

  安裝git相關的插件

  技術分享圖片

  這個應該很簡單,不再贅述。

  我們打開一個項目(沒有請新建),然後進入項目配置:

  技術分享圖片

  輸入項目的git地址,我這裏寫的是github的一個項目地址,地址可以直接打開github復制:

  該項填寫的是項目的瀏覽地址,直接從瀏覽器地址欄復制

  技術分享圖片

  然後寫在這個位置

  技術分享圖片

  還支持選擇分支進行構建

  技術分享圖片

  這個功能默認是沒有的,需要安裝一個插件,名稱叫 Git Parameter 插件安裝的方法之前已經介紹過了,一致的。安裝好這個插件以後,就可以自由地配置參數化構建過程。

  源碼管理繼續填寫git地址,直接從github復制項目地址

  技術分享圖片

  然後填寫在對應位置

  技術分享圖片

  核心內容當然是構建時執行的命令了,我們下一節進行構建命令的詳細剖析

  技術分享圖片

2、創建一段jenkins構建命令(從shell腳本說起)

  我們繼續講解我們的構建命令環節,jenkins的工作流程都是從一行行的命令來實現的,因此,我們給jenkins發出一系列的命令,jenkins會在後臺默默按順序一一執行,因此,jenkins的功能強大與否,決定權在於我們的腳本命令是否全面和強大。

  我們從新建一個shell腳本開始說起。

  jenkins是可以直接執行shell命令的,我們可以在構建的命令文本區域填寫對應的腳本命令,如下圖所示:

  技術分享圖片

  為什麽我們要調用shell腳本執行,而不直接將所有命令寫在這裏?

  答案一定是:為了重用,便於修改維護!試想,如果我們的十個構建項目都使用了同樣的構建編譯發布nuget到nuget服務器的命令,我們要分別在十個構建項目中分別寫一堆的命令嗎,有一天我們需要修改一下nuget服務器的推送密鑰,我們需要分別打開不同的構建項目去修改命令參數。在項目很多的情況下會相當復雜。

  作為對比,我們在新增加構建項目的時候,只需要從歷史項目復制,然後修改一下解決方案的名稱即可。

  我們把命令添加行號進行逐一講解

  技術分享圖片

  命令第1/2/3/4/5行都是生命一個變量,後面跟的是變量的值。${變量名} 的寫法是取變量的值

  變量的作用都有註釋說明,其中2是docker的容器名稱

  命令第6行的作用是執行這個相對目錄下的一個 DotNetCoreWebPublishToDockerCommon.sh 的shell腳本,並將後面一一獲取到的變量作為參數傳遞到shell腳本裏面。

三、編譯發布的命令講解

  我們上一節講解了調用了一個目錄下的shell腳本,那麽我們這節就開始剖析這主要的腳本內容(構建過程分解),文章最後我們會將腳本全部放出來。

1、shell腳本的變量讀取

  技術分享圖片

  首先我們腳本的開頭便讀取了上文傳遞進來的參數,然後定義了新的變量存他們的值。

  讀取參數使用 $變量順序號 的方式進行讀取,這裏一定要註意順序的正確性。

2、定義好存放發布好的項目代碼的目錄和備份發布內容的目錄

  技術分享圖片

  定義好目錄,我們使用 echo 命令輸出構建開始的提示信息。

  技術分享圖片

  每次使用的都是同一個目錄,構建之前先使用 rm -rf 命令清空發布目錄(刪除所有文件)

3、publish發布項目到準備好的目錄

技術分享圖片

  該條命令的作用是,使用.netcore自帶的 publish 命令,發布 ${JENKINS_HOME}/workspace/${JOB_NAME}/${csprojDir} 目錄(拼接的.csproj項目路徑)下的項目代碼到 -o 的這個目錄,當然這個目錄是我們上面準備好存儲的目錄,按照項目名稱放在對應的文件夾下。

  /p:Version=1.0.${BUILD_NUMBER} 的命令作用是構建出來的版本號,按照jenkins的任務序列號(BUILD_NUMBER)走。不然得每次修改項目的信息,很麻煩。

  這個序列號就是構建時候自動生成的序列號

  技術分享圖片

  4、復制需要的配置到發布目錄

  技術分享圖片

  為什麽要有這個操作呢?

  為了項目的一些配置安全,比如連接字符串地址,服務器地址等敏感信息,如果都放在了github上,豈不是要被有心之人瞎搞。

  因此,我們自己將敏感信息配置文件放在一個特定的目錄,構建的時候自動復制替換項目裏面的配置文件。

  一切為了服務器的安全!

四、Docker容器命令詳解

1、將舊容器停止,並刪除舊鏡像

  技術分享圖片

  docker命令我就不說了吧,有註釋。

2、通過Dockerfile創建鏡像,並映射端口Run容器

  技術分享圖片

  通過 ${containerName} ${webDir}/${JOB_NAME}/. 目錄(這個目錄是git拉取下來的項目目錄,稍後我們講解dockerfile)下的dockerfile 文件構建容器。

  構建好的容器按照我們的參數進行命名。

  使用 docker run 命令運行容器,並映射容器的80端口到我們參數指定的linux服務器端口。

  打印發布成功的消息。

3、dockerfile的說明

  上一點我們使用dockerfile構建了新的鏡像,我們的dockerfile其實是隨著解決方案一起存放著的。

  技術分享圖片

  Dockerfile 其實很簡單,在VS2017新建.netcore項目的時候,可以直接附帶著自動建出來,如果沒有,我們可以手動去創建。

  技術分享圖片

  裏面其實很簡單,僅僅幾行代碼。

  1.描述了從微軟的最新版的官方docker鏡像作為基礎創建新鏡像(不清楚的了解一下docker的鏡像機制)

  2.沒啥好說的

  3.指定了工作目錄,我們構建完畢後,會自動生成/publish文件夾

  4.對外暴露80端口

  5.復制文件到鏡像內(必須的配置),會從/pulish目錄復制項目代碼到鏡像中

  6.相關項目的入口點程序集

五、生成前的準備工作

  怎麽,這就要急著去點那個小按鈕了嗎?

  技術分享圖片

  如果你還很冷靜的話,應該還明白很多坑還沒填呢。 

  1、docker環境的準備

  docker的安裝是極其簡單的,只需要簡單的幾行命令即可配置完成,這也是很多人喜愛docker的原因,無需復雜的各種軟件運行環境的安裝,即可簡單搭建好一個程序應有的運行環境(前人都做好,而且不會出現看著別人的教程都會出各種問題的問題)。

$ #安裝Docker
$ yum install docker
$ #啟動docker服務
$ systemctl  start docker.service
$ #配置開機啟動
$ systemctl  enable docker.service

  centos7安裝docker的命令,非本文重點,如遇到問題,可以自行查找資料解決。

  2、微軟官方鏡像 docker.io/microsoft/aspnetcore:latest 的準備

  docker pull microsoft/aspnetcore 命令,會自動拉取最新的.netcore鏡像,也就是本文使用的鏡像。太慢可以自行查找配置加速器的方法。我沒有配,沒覺得有多慢。

  成功後,使用docker images命令查看拉取的鏡像。大概300多MB大小。

  技術分享圖片

  3、.net core環境的準備

  如果沒有.netcore環境(可能涉及環境變量的配置),那麽shell腳本中的dotnet命令將無從談起。

  直接進微軟官方的說明文檔,很明確地講解了.netcore環境的安裝,當然墻外訪問比較慢,如果不能流暢打開,那麽只能聽在下一面之詞了。?

  官方鏈接在此:https://www.microsoft.com/net/learn/get-started/windows

  左側選擇Linux

  技術分享圖片

  選擇環境為Centos

  技術分享圖片

  安裝命令:

  Install the .NET SDK

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum update
sudo yum install dotnet-sdk-2.0

  如果安裝並配置成功,直接輸入dotnet可以出現提示信息

  技術分享圖片

六、盡情構建吧

  1、一鍵發布

  技術分享圖片

  點擊構建,選擇分支(如果沒有配置分支管理工具,跳過),開始構建

   1、查看構建詳情

  我們可以在控制臺輸出查看我們的構建過程

  技術分享圖片

  技術分享圖片

  拉取代碼並Restore依賴包

  技術分享圖片

  刪除鏡像,重新構建鏡像

  技術分享圖片

  從微軟官方鏡像,復制項目文件創建新鏡像

  運行容器

  成功!

七、可能遇到的問題

  1、我暫時想到的坑都在第五點了,如果大家有遇到的問題提出來,我會補充在此。

八、鳴謝

  很感謝一群渴望知識的人一直讓我有動力去完成一篇篇對大家有所幫助的稱之為有用的博文。

  感謝自己能一路在推動自動化工具的道路上前行

  很感謝自己又節約了一大筆時間(多活了幾年)

九、附件

  1.Dockerfile文件

FROM docker.io/microsoft/aspnetcore:latest
ARG source
WORKDIR /publish
EXPOSE 80
COPY /. /publish
ENTRYPOINT ["dotnet", "SevenTiny.Cloud.MultiTenantPlatform.Web.dll"]

  2.DotNetCoreWebPublishToDockerCommon.sh Shell腳本

#要構建的解決方案名稱
solutionName=$1
#.sln文件全路徑
solutionDir=$2
#.csproj文件全路徑
csprojDir=$3
#docker run的容器名稱
containerName=$4
#制定run的端口
port=$5

#項目發布的目錄
webDir=/vdb1/jenkins/publish/webapp

#歸檔目錄
archivesDir=/vdb1/jenkins/publish/archives

echo "7tiny:dotnet publish"

#清空文件夾
rm -rf ${webDir}/${JOB_NAME}/*

#發布網站到webDir dotnet publish ${JENKINS_HOME}/workspace/${JOB_NAME}/${csprojDir} -c Release -o ${webDir}/${JOB_NAME} /p:Version=1.0.${BUILD_NUMBER} #復制配置文件 cp -rf /vdb1/jenkins/DotNetCoreWebPublishToDockerCommonConfigs/* ${webDir}/${JOB_NAME}/ #停止docker容器 docker stop ${containerName} #刪除當前容器 docker rm ${containerName} #刪除鏡像 docker rmi ${containerName} #通過Dockerfile重新構建鏡像 docker build -t ${containerName} ${webDir}/${JOB_NAME}/. #docker run容器並綁定到端口 docker run -d -p ${port}:80 --name ${containerName} ${containerName} echo "7tiny:success!"

.netcore mvc docker環境jenkins一鍵部署(DevOps)