1. 程式人生 > >Linux文件整理之【Jenkins+Docker自動化部署.Net Core】

Linux文件整理之【Jenkins+Docker自動化部署.Net Core】

這次整理的文件是Jenkins+Docker實現自動化部署,很早之前就寫的,今天有時間就搬到部落格園做個記錄。

Jenkins是基於Java開發的一種持續整合工具,主要用於持續、自動的構建/測試軟體等相關專案。在Java開發中我們經常能看到使用jenkins來部署,.Net core目前還是比較少見的,但是好的東西我們就應該要拿來使用、借鑑。

1. 安裝JenKins

這裡使用Docker來安裝JenKins,當然也可以直接安裝到Linux中。

建立jenkins工作目錄

mkdir /usr/local/jenkins

拉取jenkins映象

docker pull jenkins

這裡有個小插曲,我用的是jenkins映象,預設也是latest一般意味著最後最新版本。很多官方最新映象也都是如此命名;直到後來安裝配置完成後,登入進去提示我不是最新版本,讓我更新,並且很多外掛已經不支援此版本了。發現當前版本和最新版本還相差好幾個。心想這不是官方映象嗎 怎麼還是這麼舊的版本,最後通過搜尋發現,Jenkins官方最新映象現在已改為jenkins/jenkins的了。

所以最新版是:jenkins/jenkins

 

我們拉取最新lts版本。

docker pull jenkins/jenkins:lts

看如下圖jenkins和jenkins/jenkins兩個映象的差別,發現常規下的latest版本並不最新的了,它們的建立時間已經是1年以前了。而jenkins/jenkins 則建立時間在2天不到。

所以常規的latest並不意味著最新版本。

修改jenkins目錄和docker目錄許可權,這裡1000是容器中Jenkins 的使用者 uid

chown -R 1000:1000 /usr/local/Jenkins

sudo chown -R 1000:1000 /var/run/docker.sock

尤其docker.sock 這個許可權很重要,到時候容器裡的Jenkins需要執行docker命令需要的

執行Jenkins 注意後面的映象名稱和版本lts

docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true  -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker  -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts 

引數解釋:

-p 8080:8080 -p 50000:50000 --對映jenkins埠

--name jenkins --容器名稱自己命名

privileged=true --授予容器管理員許可權

-v /usr/local/jenkins:/var/jenkins_home --對映jenkins目錄

-v /usr/bin/docker:/bin/docker --對映docke目錄 到時候需要在容器裡執行docker命令

-v /var/run/docker.sock:/var/run/docker.sock --對映docker執行命令 到時候需要容器裡執行docker命令。

 

容器是否啟動成功最好還是通過docker ps 或者netstat –ntlp |grep 8080 (檢視我們容器對映的埠是否監聽成功) 檢視當前容器是否執行成功。

某些情況下,如許可權沒有配對,啟動會不成功的。

檢視正在執行的容器。

docker ps

 

2. 配置JenKins

檢視容器啟動成功後,我們可以通過地址+埠訪問剛剛執行的Jenkins

例如http://192.168.1.101:8080   

安裝成功訪問後會如下圖所示。

提示首次訪問需要密碼,我們通過剛剛對映的Jenkins目錄裡檢視這個預設密碼。

預設密碼路徑:/usr/local/jenkins/secrets/  (注意前面usr/local/jenkins路徑就是剛剛自己對映的目錄)

檢視密碼檔案

cat initialAdminPassword

輸入密碼然後繼續下一步。

下一步如果有出現404的,如下圖

網上搜索瞭解聽說是Jenkins的一個bug;部分版本存在。

 

 

 

解決辦法(以下步驟是解決登入404的;如果沒有404則可以跳過)

首先回到Jenkins主目錄找到config.xml檔案並開啟。

將<useSecurity> 修改為false

 

停止並重新執行jenkins

重啟後一定要重新檢視預設密碼,否則舊密碼是登入不成功的。

登入進去以後這裡預設選擇推薦的外掛。

接下來就是等待安裝,這裡需要注意,如果jenkins版本比較老,則可能很多外掛安裝失敗,直接紅色的。此時可以跳過該介面進入首頁。會有提示讓你升級最新Jenkins版本。

安裝完成後建立一個使用者名稱和密碼,即可完成安裝進入首頁。

 

3. 建立專案

1、原始碼編譯釋出工程

原始碼釋出工程即將原始碼提交到git伺服器,jenkins通過git拉取最新的原始碼,並通過Dockerfile裡的配置進行編譯釋出過程。然後通過Docker構建此映象並執行到容器。

建立一個.Net Core Web專案。

建立專案的時候可以選擇啟用Docker支援。

對於之前的專案可以右鍵新增Docker支援。

專案目錄

預設的Dockerfile是有幫我們進行程式碼編譯併發布動作的。所以預設的Dockerfile檔案是適合和程式碼一起提交到伺服器然後使用Docker進行構建映象。

 

專案建立完成後隨程式碼一起提交到git伺服器。(svn等也都可以)

git專案目錄,注意將Dockerfile複製到根目錄。由於到時候構建映象的時候就是從根目錄執行的。git目錄如下所示。

 

2、已編譯的Release工程

已編譯的Release工程,此種方式適合git或svn在區域網的;又不希望原始碼不暴露到外網的需要。此種方式是將專案工程進行進行釋出打包操作。例如java常見的打包成一個war包檔案。.Net 就是生成對應的DLL 檔案。

專案在釋出之前我們對專案的Dockerfile檔案屬性做個更改,以便在釋出時將此檔案複製到釋出時的目錄。

選擇上面建立的WebTest專案右鍵釋出,選擇釋出到指定資料夾。

將釋出檔案釋出到自己的git(或svn)目錄,如下圖所示的,一定要包含Dockerfile檔案。釋出後的檔案,可以根據自己需要將沒有更新DLL或者appsetting.json等檔案剔除掉。只保留本次要更新的檔案即可。

修改Dockerfile檔案,因為預設的Dockerfile檔案是包含編譯釋出的命令,所以這裡要將這些相關命令操作刪除掉;保留如下命令配置即可。

儲存然後提交到所有檔案到git伺服器。

提交後的git目錄。

建議:無論是程式碼編譯釋出工程還是已編譯的Release工程,第一次使用Docker部署時最好先自己手動將這些檔案拷貝到伺服器,並手動構建物件並執行容器看是否成功;能否訪問網站。也就是先不用Jenkins將這些流程自己手動走一遍,確保一些目錄包括Dockerfile等都是配置正確的。

4.  建立JenKins任務

專案工程建立完成並提交到git伺服器後,開始在Jenkins裡面建立任務。

輸入專案描述,原始碼管理選擇自己對應的即可。

 

我這裡選擇的git。第一次新增專案時需要新增一種授權方式點選右邊新增按鈕即可。

選擇新增授權方式 常用的就是使用者名稱加密碼或者SSH方式。

 

下一步設定構建環境

設定觸發器,這裡主要是設定自動觸發條件,有定時構建、遠端觸發構建、輪詢SCM。

這裡只設置輪詢SCM形式的,很簡單的方式。意思是在指定間隔時間內會去輪詢git或svn中版本是否有變化。如果有就立即構建該專案。其實就是做到只要程式碼提交了 則立刻就能自動構建專案進行釋出;不在需要其他任何操作了。

選擇構建—>執行shell;當然我們這裡是linux伺服器所有多數選擇執行shell。

新增shell 命令。

 

注意下面的webtest 改為自己的容器名稱和對應映象名稱即可。

#!/bin/bash
# 獲取短版本號
GITHASH=`git rev-parse --short HEAD`
docker stop webtest
docker rm webtest
echo ---------------Building Docker Image...------------------
docker build -t webtest:$GITHASH .
docker tag webtest:$GITHASH webtest:latest
echo ---------------Launching Container...------------------
docker run --name webtest -d -p 8005:80 webtest:latest 

使用git提交程式碼進行測試。

自動開始構建了 注意jenkins這裡時間是預設是utc時間。utc時間轉換我們北京時間是要+8小時的。

 

藍色圖示代表構建成功,如果失敗會是紅色

 

檢視控制檯輸出資訊,尤其構建失敗時能夠從裡面獲取到失敗原因等。

控制輸出如下圖所示

構建成功後我們到伺服器檢查下是否有剛剛構建的映象和執行的容器。(當然一般情況下只要構建成功這兩步可以不用檢查)

檢視映象

檢視執行的容器

訪問站點看能否訪問成功。

&n