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

【前言】

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

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

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

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

  使用的內容都很基礎,重要的是一切自動化的思惟,咱們要提升咱們的開發效率,減小在開發階段上浪費的沒必要要的時間。web

1、jenkins的安裝/部署

  這個放在單獨章節講解,這裏先佔個地方,之後放個連接(*^_^*),你們能夠先參考我以前參考的一篇博文 http://www.javashuo.com/article/p-ubbiidhx-ca.htmldocker

  其實jenkins配置時候的坑比較多,簡單介紹幾個,或許你們碰上了,能夠直接問我。shell

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

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

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

  git的插件其實在jenkins安裝過程當中的推薦插件提示中有,若是直接安裝了推薦的插件,那麼無需再去安裝。segmentfault

  若是沒有安裝推薦插件,那麼能夠進入jenkins的系統管理windows

    

  管理插件centos

  

  安裝git相關的插件瀏覽器

  

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

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

  

  輸入項目的git地址,我這裏寫的是github的一個項目地址,地址能夠直接打開github複製:

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

  

  而後寫在這個位置

  

   還支持選擇分支進行構建

  

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

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

  

  而後填寫在對應位置

  

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

  

二、建立一段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腳本里面。

3、編譯發佈的命令講解

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

一、shell腳本的變量讀取

  

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

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

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

  

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

  

  每次使用的都是同一個目錄,構建以前先使用 rm -rf 命令清空發佈目錄(刪除全部文件)

三、publish發佈項目到準備好的目錄

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

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

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

  

  四、複製須要的配置到發佈目錄

  

  爲何要有這個操做呢?

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

  所以,咱們本身將敏感信息配置文件放在一個特定的目錄,構建的時候自動複製替換項目裏面的配置文件。

  一切爲了服務器的安全!

4、Docker容器命令詳解

一、將舊容器中止,並刪除舊鏡像

  

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

二、經過Dockerfile建立鏡像,並映射端口Run容器

  

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

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

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

  打印發布成功的消息。

三、dockerfile的說明

  上一點咱們使用dockerfile構建了新的鏡像,咱們的dockerfile實際上是隨着解決方案一塊兒存放着的。

  

  Dockerfile 其實很簡單,在VS2017新建.netcore項目的時候,能夠直接附帶着自動建出來,若是沒有,咱們能夠手動去建立。

  

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

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

  2.沒啥好說的

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

  4.對外暴露80端口

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

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

5、生成前的準備工做

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

  

  若是你還很冷靜的話,應該還明白不少坑還沒填呢。 

  一、docker環境的準備

  docker的安裝是極其簡單的,只須要簡單的幾行命令便可配置完成,這也是不少人喜好docker的緣由,無需複雜的各類軟件運行環境的安裝,便可簡單搭建好一個程序應有的運行環境(前人都作好,並且不會出現看着別人的教程都會出各類問題的問題)。

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

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

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

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

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

  

  三、.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能夠出現提示信息

  

6、盡情構建吧

  一、一鍵發佈

  

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

   一、查看構建詳情

  咱們能夠在控制檯輸出查看咱們的構建過程

  

  

  拉取代碼並Restore依賴包

  

  刪除鏡像,從新構建鏡像

  

  從微軟官方鏡像,複製項目文件建立新鏡像

  運行容器

  成功!

7、可能遇到的問題

  一、我暫時想到的坑都在第五點了,若是你們有遇到的問題提出來,我會補充在此。

8、鳴謝

  很感謝一羣渴望知識的人一直讓我有動力去完成一篇篇對你們有所幫助的稱之爲有用的博文。

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

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

9、附件

  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!"
相關文章
相關標籤/搜索