使用Jenkins與Docker持續整合與釋出NetCore專案(實操篇)
阿新 • • 發佈:2020-03-30
# 使用Jenkins與Docker持續整合與釋出NetCore專案(教程一)
原文地址:[https://www.cnblogs.com/Jackyye/p/12588182.html](https://www.cnblogs.com/Jackyye/p/12588182.html)
## 基本環境
該教程的環境基於
伺服器系統:CentOs
軟體需部署:Docker,Docker Registry(Docker私有庫),JDK,Jenkins(非docker安裝),Gogs(Git私有庫)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200328164307907-656294409.png)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200328164403139-1745606365.png)
Jenkins所需外掛:
>Gogs plugin
>SSH plugin
## 確定思路
首先我們要明確實現持續整合/持續釋出的具體思路。
* 在git倉庫收到推送的時候,觸發webhook,webhook將請求傳送到jenkins伺服器。
* 觸發jenkins流水線/計劃。在jenkins計劃中,git pull 最新的程式碼到特定專案資料夾,用docker build 編譯後,上傳到docker registry。
* 然後使用ssh命令遠端主機,使用docker拉取專案,移除之前的專案,部署最新的專案
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330082816618-1327254141.png)
## 具體實現
### 一、生成Dockerfile檔案
這個思路是通過docker實現的,所以連結整個流程的關鍵是Dockerfile檔案,在使用visual studio新建專案時,勾選為專案配置docker,即可自動生成Dockerfile。具體dockerfile檔案的編寫可以參考[docker官網](https://docs.docker.com/get-started/part2/):https://docs.docker.com/get-started/part2/
*PS:這裡需要注意一下,自動生成的dockerfile檔案的預設路徑可能會有偏差(這裡需要保證JenkinsTest.csproj 與 它的WORKDIR 能對應上)*
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330083703945-456604589.png)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330084322352-329327386.png)
### 二、jenkins新增一個測試計劃
在jenkins中點選新建任務,給專案命名,這裡命名test,後儲存即可,先不用進行其他配置操作。(確認已經安裝Gogs-Webhook Plugin)
新建完後退出總介面,可以看到我們已經有一個任務計劃了。
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330090351336-23742486.png)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330090618151-1949397438.png)
### 三、把帶有Dockerfile的專案上傳到Gogs伺服器上
這個git的操作就不展開描述了,相信大家都懂,不懂的可以學習[廖雪峰老師的git教程](https://www.liaoxuefeng.com/wiki/896043488029600)
```
cd projectdir
git commit -am XXX
git push
```
上傳完後進入Gogs的倉庫設定,選擇管理web鉤子,新增web鉤子,選擇gogs-webhook
**gogs-webhook設定的注意事項:**(圖三)
1. 根據[Gogs-Webhook Plugin官網](https://plugins.jenkins.io/gogs-webhook/)裡描述,預設的Gogs推送地址形式如下,伺服器地址+埠號+/gogs-webhook/?job=+任務名(這裡是test)
```
http(s)://<< jenkins-server >>/gogs-webhook/?job=<< jobname >>
```
2. 設定自己的金鑰文字,也就是這個推送的密碼,如:123456什麼的,這個稍後在jenkins要用到
完成以上步奏後,就可以實現任務推送後觸發jenkins任務了,接下來就開始配置jenkins
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330085739307-1799206354.png)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330085642241-633051491.png)
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330090949153-1809510595.png)
### 四、配置jenkins
### 配置SSH遠端憑證
因為我們的思路里有要遠端其他伺服器的步奏,所以我們先要給jenkins新增一個連結憑證
1. 進入jenkins首頁,點選憑據,展開後點擊系統,在全域性憑據右側有個小倒三角,點選新增憑據,如下圖
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330100206839-932512944.png)
2. 我們遠端登入只需要使用者名稱和密碼就行,所以型別選擇username with password,在使用者名稱和密碼裡輸入你要登入的伺服器名和密碼,id不用填,描述可以描述你的伺服器名
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330100646664-2067543802.png)
3. 進入到jenkins設定裡的系統設定,找到SSH remote hosts選項,點選新增,依次輸入你的伺服器名,埠號22,選擇剛剛新增的憑證
**點選test connect 如出現success 就連線成功,這個很重要!!!**
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330102633807-873401791.png)
### jenkins任務配置
1.進入專案,點選配置
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330100921314-2103445108.png)
2.在我們第三步設定的gogs密碼,現在該用上了,在gogs webhook的設定中,把Use Gogs secret勾上,然後把密碼輸進去,為了防止惡意觸發專案構建
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330102123682-1037988748.png)
3.在構建觸發器中選擇,when a change is pushed to gogs
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330102306173-1337526552.png)
4.新增一個本地構建命令,實現的流程是:git pull(git拉取) -> docker build(docker根據dockerfile構建) -> docker tag(修改為指定的docker私有庫) -> docker push(上傳到私有庫)
```
//由於我的私有庫不是https的,所以在執行docker命令前先信任私有庫
vi /etc/docker/daemon.json
{
"insecure-registries":["[Registry IP]:5000"]
}
```
```
//進入專案目錄
cd ./jenkins
//拉取專案
git pull
//用dockerfile構建專案
docker build --tag jenkinstest:${BUILD_NUMBER} . --network=host //這裡是利用了jenkins引數${BUILD_NUMBER}來標識版本,也可以用BUILD_ID
//指定image上傳伺服器
docker tag jenkinstest:${BUILD_NUMBER} localhost:5000/jenkinstest:${BUILD_NUMBER} //localhost:5000,我把docker registry部署在同一個伺服器所以這裡是localhost
//推送image到registry
docker push localhost:5000/jenkinstest:${BUILD_NUMBER}
```
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330110757762-1516750756.png)
5.新增一個遠端命令,選擇你剛剛新增的ssh連結,實現的流程是:docker pull -> docker rm -> doceker run,請確保你遠端的伺服器信任了私有庫"insecure-registries":["[Registry IP]:5000"] (參考上個步奏)
```
//更新image
docker pull [Registry IP]:5000/jenkinstest:${BUILD_NUMBER}
//通過名字移除容器
docker container rm jk --force
//-p --name 以特定名後臺執行容器
docker run --publish 8000:80 --detach --name jk [Registry IP]:5000/jenkinstest:${BUILD_NUMBER}
```
![](https://img2020.cnblogs.com/blog/795169/202003/795169-20200330111729799-829820067.png)
## 至此,只要把你的程式碼推送到git上,就能自動構建和部署你的項