使用Jenkins與Docker持續集成與發布NetCore項目(教程一)
原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html
基本環境
該教程的環境基於
服務器系統:CentOs
軟件需部署:Docker,Docker Registry(Docker私有庫),JDK,Jenkins(非docker安裝),Gogs(Git私有庫)
Jenkins所需插件:
Gogs plugin
SSH plugin
確定思路
首先我們要明確實現持續集成/持續發布的具體思路。
-
在git倉庫收到推送的時候,觸發webhook,webhook將請求發送到jenkins服務器。
-
觸發jenkins流水線/計划。在jenkins計划中,git pull 最新的代碼到特定項目文件夾,用docker build 編譯后,上傳到docker registry。
-
然后使用ssh命令遠程主機,使用docker拉取項目,移除之前的項目,部署最新的項目
具體實現
一、生成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任務配置
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}