前言
在項目中使用這一套自動集成的體系之后,一直想找個時間總結出來,用於自己記錄也打算將自己的所得分享給園友們,不經常寫文章,可能會有錯誤的地方,希望各位不吝指正,我會及時的改正並表示感謝,希望大家能夠一起進步。
前期准備
centos7.5系統環境,關閉防火牆
jenkins in docker 安裝
yum install docker
docker service start docker pull jenkins docker run -d -p 8080:8080 -p 50000:50000 \ -v jenkins:/var/jenkins_home \ -v /etc/localtime:/etc/localtime \ --name jenkins \ docker.io/jenkins/jenkins
-d 后台運行鏡像
-p 80:8080 將鏡像的8080端口映射到服務器的80端口
-p 50000:50000 將鏡像的50000端口映射到服務器的50000端口
-v jenkins:/var/jenkins_home 掛載卷
/var/jenkins_home目錄為jenkins工作目錄,我們將硬盤上的一個目錄掛載到這個位置,方便后續更新鏡像后繼續使用原來的工作目錄。該命令會將/var/lib/docker/volumes/jenkins映射到相應路徑,默認的掛載卷都在docker目錄下的volumes文件夾內,可以自己指定主機內的其他路徑
-v /etc/localtime:/etc/localtime 讓容器使用和服務器同樣的時間設置。
--name jenkins 給容器起一個別名
我在創建好之后遇到了訪問jenkins界面白屏的問題,重啟容器問題解決,重啟大法好。
重啟命令docker service restart
配置jenkins
Publish over SSH插件配置
系統管理->系統設置
Passphrase
:用戶密碼
Git憑證添加
進入憑據->系統->全局憑據->添加
添加成功后,點擊Test Configuration 測試是否能夠連通
新建構建任務
源碼管理
配置如下,憑證選擇我們上面配置的git憑證,分支調到需要發布的分支上
構建觸發器
選擇輪詢SCM設置為H/2 * * * *
,即每兩分鍾檢查一次是否有新的提交
構建后操作
選擇Send files or execute commands over SSH
,這里我們不用這個插件進行文件傳輸,而是用它來執行主機中的shell腳本,配置如下
腳本內容如下:
#!/bin/bash
echo '開始執行部署'
進入jenkins的工作區
cd /var/lib/docker/volumes/jenkins/_data/workspace/test
echo '更新鏡像'
echo '---------------重新構建鏡像----------------------'
cp testCore/Dockerfile Dockerfile執行net core 程序的dockerfile,生成程序鏡像
docker build --no-cache -t testCore:master .
echo '---------------鏡像構建成功----------------------'容器創建
docker run -d -it
-v /home/configs/testCore/appsettings.json:/app/appsettings.json
-v /etc/localtime:/etc/localtime:ro
-p 6000:80
--restart=always
--name test testCore:master
echo '部署結束'
至此,整個構建過程就結束了,但是你在如此構建幾次之后就會發現一個問題
查詢了一下,導致該問題的原因是
重新構建鏡像的時候,該鏡像正在被某容器使用中,那么在重新構建同名同版本鏡像后,docker保留原來的鏡像,即容器還是用原來的, 那么原來的鏡像名稱變成none,tag也成了none
解決的辦法是 在shell腳本之后添加一行刪除tag為none的鏡像的腳本,如下
docker images|grep none|awk '{print $3}'|xargs docker rmi
總結
實驗的進程總不會像表面那樣一番風順,期間也會遇到各種各樣的問題,我很享受那種闖過一關又一關看到成果的過程,后續更新我會將我在部署時遇到的一些小問題整理出來,作為記錄學習,感謝閱讀。