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

此次整理的文檔是Jenkins+Docker實現自動化部署,很早以前就寫的,今天有時間就搬到博客園作個記錄。java

Jenkins是基於Java開發的一種持續集成工具,主要用於持續、自動的構建/測試軟件等相關項目。在Java開發中咱們常常能看到使用jenkins來部署,.Net core目前仍是比較少見的,可是好的東西咱們就應該要拿來使用、借鑑。linux

1. 安裝JenKins

這裏使用Docker來安裝JenKins,固然也能夠直接安裝到Linux中。git

建立jenkins工做目錄web

mkdir /usr/local/jenkinsdocker

拉取jenkins鏡像shell

docker pull jenkinsjson

這裏有個小插曲,我用的是jenkins鏡像,默認也是latest通常意味着最後最新版本。不少官方最新鏡像也都是如此命名;直到後來安裝配置完成後,登陸進去提示我不是最新版本,讓我更新,而且不少插件已經不支持此版本了。發現當前版本和最新版本還相差好幾個。心想這不是官方鏡像嗎 怎麼仍是這麼舊的版本,最後經過搜索發現,Jenkins官方最新鏡像如今已改成jenkins/jenkins的了。bash

因此最新版是:jenkins/jenkins服務器

 

咱們拉取最新lts版本。併發

docker pull jenkins/jenkins:lts

看以下圖jenkinsjenkins/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. 建立項目

一、源代碼編譯發佈工程

源代碼發佈工程即將源代碼提交到git服務器,jenkins經過git拉取最新的源代碼,並經過Dockerfile裏的配置進行編譯發佈過程。而後經過Docker構建此鏡像並運行到容器。

建立一個.Net Core Web項目。

建立項目的時候能夠選擇啓用Docker支持。

對於以前的項目能夠右鍵添加Docker支持。

項目目錄

默認的Dockerfile是有幫咱們進行代碼編譯併發布動做的。因此默認的Dockerfile文件是適合和代碼一塊兒提交到服務器而後使用Docker進行構建鏡像。

 

項目建立完成後隨代碼一塊兒提交到git服務器。(svn等也均可以)

git項目目錄,注意將Dockerfile複製到根目錄。因爲到時候構建鏡像的時候就是從根目錄執行的。git目錄以下所示。

 

二、已編譯的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小時的。

 

藍色圖標表明構建成功,若是失敗會是紅色

 

查看控制檯輸出信息,尤爲構建失敗時可以從裏面獲取到失敗緣由等。

控制輸出以下圖所示

構建成功後咱們到服務器檢查下是否有剛剛構建的鏡像和運行的容器。(固然通常狀況下只要構建成功這兩步能夠不用檢查)

查看鏡像

查看運行的容器

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

相關文章
相關標籤/搜索