使用jenkins一鍵部署.netcore mvc 之 docker環境
【前言】
DevOps方面的文章很早之前就想分享了,擠出一點時間把前段時間搭建的一些提高開發效率的東西給大家分享一下吧。
本文介紹了一個.netcore mvc web專案,從專案push到github開始
- 自動從github上拉取程式碼
- 編譯,生成,釋出
- 停止docker容器,刪除docker映象
- 通過專案的dockerfile新建docker映象
- Run容器,自動繫結ip,站點啟動
整個過程只需要在jenkins這個自動化工具上點一個按鈕。下面我們按順序來簡單介紹一下。
使用的內容都很基礎,重要的是一切自動化的思維,我們要提高我們的開發效率,減少在開發階段上浪費的不必要的時間。
一、jenkins的安裝/部署
這個放在單獨章節講解,這裡先佔個地方,以後放個連結(*^_^*),大家可以先參考我之前參考的一篇博文 https://segmentfault.com/a/1190000007086764
其實jenkins配置時候的坑比較多,簡單介紹幾個,或許大家碰上了,可以直接問我。
- 構造的時候提示沒許可權,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!"
【前言】
DevOps方面的文章很早之前就想分享了,擠出一點時間把前段時間搭建的一些提高開發效率的東西給大家分享一下吧。
本文介紹了一個.netcore mvc web專案,從專案push到github開始
- 自動從github上拉取程式碼
- 編譯,生成,釋出
- 停止docker容器,刪除docker映象
- 通過專案的dockerfile新建docker映象
- Run容器,自動繫結ip,站點啟動
整個過程只需要在jenkins這個自動化工具上點一個按鈕。下面我們按順序來簡單介紹一下。
使用的內容都很基礎,重要的是一切自動化的思維,我們要提高我們的開發效率,減少在開發階段上浪費的不必要的時間。
一、jenkins的安裝/部署
這個放在單獨章節講解,這裡先佔個地方,以後放個連結(*^_^*),大家可以先參考我之前參考的一篇博文 https://segmentfault.com/a/1190000007086764
其實jenkins配置時候的坑比較多,簡單介紹幾個,或許大家碰上了,可以直接問我。
- 構造的時候提示沒許可權,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!"
出處:https://www.cnblogs.com/7tiny/p/9119638.html