使用Jenkins與Docker持續內建與釋出NetCore項目(教程一)
原文位址:https://www.cnblogs.com/Jackyye/p/12588182.html
基本環境
該教程的環境基于
伺服器系統:CentOs
軟體需部署:Docker,Docker Registry(Docker私有庫),JDK,Jenkins(非docker安裝),Gogs(Git私有庫)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5ADN0kjM2UjNtcDM5cDMzQjNxgjMzADMyAjMtkjNxUTO38CXzADMyAjMvwVO2ETN5czLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
Jenkins所需插件:
Gogs plugin
SSH plugin
确定思路
首先我們要明确實作持續內建/持續釋出的具體思路。
- 在git倉庫收到推送的時候,觸發webhook,webhook将請求發送到jenkins伺服器。
- 觸發jenkins流水線/計劃。在jenkins計劃中,git pull 最新的代碼到特定項目檔案夾,用docker build 編譯後,上傳到docker registry。
- 然後使用ssh指令遠端主機,使用docker拉取項目,移除之前的項目,部署最新的項目
使用Jenkins與Docker持續內建與釋出NetCore項目(實操篇)
具體實作
一、生成Dockerfile檔案
這個思路是通過docker實作的,是以連結整個流程的關鍵是Dockerfile檔案,在使用visual studio建立項目時,勾選為項目配置docker,即可自動生成Dockerfile。具體dockerfile檔案的編寫可以參考docker官網:https://docs.docker.com/get-started/part2/
PS:這裡需要注意一下,自動生成的dockerfile檔案的預設路徑可能會有偏差(這裡需要保證JenkinsTest.csproj 與 它的WORKDIR 能對應上)
二、jenkins添加一個測試計劃
在jenkins中點選建立任務,給項目命名,這裡命名test,後儲存即可,先不用進行其他配置操作。(确認已經安裝Gogs-Webhook Plugin)
建立完後退出總界面,可以看到我們已經有一個任務計劃了。
三、把帶有Dockerfile的項目上傳到Gogs伺服器上
這個git的操作就不展開描述了,相信大家都懂,不懂的可以學習廖雪峰老師的git教程
cd projectdir
git commit -am XXX
git push
上傳完後進入Gogs的倉庫設定,選擇管理web鈎子,添加web鈎子,選擇gogs-webhook
gogs-webhook設定的注意事項:(圖三)
- 根據Gogs-Webhook Plugin官網裡描述,預設的Gogs推送位址形式如下,伺服器位址+端口号+/gogs-webhook/?job=+任務名(這裡是test)
http(s)://<< jenkins-server >>/gogs-webhook/?job=<< jobname >>
- 設定自己的密鑰文本,也就是這個推送的密碼,如:123456什麼的,這個稍後在jenkins要用到
完成以上步奏後,就可以實作任務推送後觸發jenkins任務了,接下來就開始配置jenkins
四、配置jenkins
配置SSH遠端憑證
因為我們的思路裡有要遠端其他伺服器的步奏,是以我們先要給jenkins添加一個連結憑證
- 進入jenkins首頁,點選憑據,展開後點選系統,在全局憑據右側有個小倒三角,點選添加憑據,如下圖
2. 我們遠端登入隻需要使用者名和密碼就行,是以類型選擇username with password,在使用者名和密碼裡輸入你要登入的伺服器名和密碼,id不用填,描述可以描述你的伺服器名
-
進入到jenkins設定裡的系統設定,找到SSH remote hosts選項,點選新增,依次輸入你的伺服器名,端口号22,選擇剛剛新增的憑證
點選test connect 如出現success 就連接配接成功,這個很重要!!!
使用Jenkins與Docker持續內建與釋出NetCore項目(實操篇)
jenkins任務配置
1.進入項目,點選配置
2.在我們第三步設定的gogs密碼,現在該用上了,在gogs webhook的設定中,把Use Gogs secret勾上,然後把密碼輸進去,為了防止惡意觸發項目建構
3.在建構觸發器中選擇,when a change is pushed to gogs
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}
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}