警惕成人網(wǎng)站免費(fèi)看手機(jī)引流推廣接單
目錄
- 11、自由風(fēng)格的CI操作(最終)
- Jenkins容器化實(shí)現(xiàn)方案
- 修改 docker.sock 權(quán)限
- 修改 Jenkins 啟動(dòng)命令后重啟
- Jenkins構(gòu)建鏡像推送到Harbor
- 修改 daemon.json 文件
- Jenkins 刪除構(gòu)建后操作
- Jenkins 添加 shell 命令
- 重新構(gòu)建
- Jenkins通知目標(biāo)服務(wù)器拉取鏡像
- 目標(biāo)服務(wù)器修改 daemon.json 文件
- 定義腳本文件
- Jenkins 添加端口號(hào)參數(shù)
- Jenkins 添加構(gòu)建后操作
- 重新構(gòu)建工程
11、自由風(fēng)格的CI操作(最終)
????????前面的架構(gòu)存在的問(wèn)題是,若有多個(gè)目標(biāo)服務(wù)器都需要使用該鏡像,那么每個(gè)目標(biāo)服務(wù) 器都需要在本地構(gòu)建鏡像,形成系統(tǒng)資源浪費(fèi)。若能夠在 Jenkins 中將鏡像構(gòu)建好并推送到 Harbor 鏡像中心
,那么無(wú)論有多少目標(biāo)服務(wù)器需要該鏡像,都只需要從 Harbor 拉取即可
。
Jenkins容器化實(shí)現(xiàn)方案
????????如果想在Jenkins中構(gòu)建鏡像,則需要Jenkins中有Docker引擎
,指的是Jenkins容器內(nèi)有Docker,因?yàn)槲覀兊腏enkins是用docker起的,可以在Jennkins內(nèi)再安裝docker,但這種方式不太方便,不好維護(hù),可以使用與宿主機(jī)共享Docker引擎。
修改 docker.sock 權(quán)限
????????/var/run/docker.sock
文件是 docker client
和 docker daemon
在本地進(jìn)行通信的 socket
文件。默認(rèn)的組為 docker
,且 other 用戶(hù)
不具有讀寫(xiě)權(quán)限
,這樣 Jenkins 是無(wú)法來(lái)操作該文 件的。
將其組調(diào)整為 root,且為其分配讀寫(xiě)權(quán)限
修改 Jenkins 啟動(dòng)命令后重啟
首先強(qiáng)制刪除正在運(yùn)行的 Jenkins 容器。
[root@jenkins run]# docker rm -f jenkins
jenkins
????????然后在 Jenkins 啟動(dòng)命令中新增/var/run/docker.sock
,docker 命令文件/usr/bin/docker
, 及/etc/docker/daemon.json
文件為數(shù)據(jù)卷。
重啟 Jenkins 容器。
[root@jenkins run]# docker run --name jenkins \
> --restart always \
> -p 8080:8080 \
> -p 50000:50000 \
> -v /var/jenkins_home:/var/jenkins_home \
> -v /var/run/docker.sock:/var/run/docker.sock \
> -v /usr/bin/docker:/usr/bin/docker \
> -v /etc/docker/daemon.json:/etc/docker/daemon.json \ # 實(shí)現(xiàn)推送harbor時(shí)使用的http信任,而不是https
> -d jenkins/jenkins:lts
進(jìn)入Jenkins容器查看是否可以使用docker了。
Jenkins構(gòu)建鏡像推送到Harbor
????????先把idea的compose.yml文件刪除
,push到gitlab,因?yàn)槲覀兪褂胘enkins幫忙構(gòu)建鏡像然后推送到Harbor,不需要到目標(biāo)服務(wù)器進(jìn)行本地制作鏡像并啟動(dòng)容器。(操作沒(méi)截圖,自己記得刪除)
修改 daemon.json 文件
????????Jenkins 是 Harbor 的客戶(hù)端,需要修改/etc/docker/daemon.json
文件。修改后重啟 Docker
。
[root@jenkins ~]# vim /etc/docker/daemon.json
[root@jenkins ~]# cat /etc/docker/daemon.json
{"insecure-registries": ["192.168.40.138:8888" # harbor服務(wù)器所在的IP和端口]
}
重啟
[root@jenkins my_hellojenkins]# service docker restart
Jenkins 刪除構(gòu)建后操作
????????原來(lái)的 Jenkins 中配置的“構(gòu)建后操作”完成的是將代碼推送到目標(biāo)服務(wù)器后,讓目標(biāo)服務(wù)器通過(guò) docker compose 完成鏡像的構(gòu)建與啟動(dòng)
。但現(xiàn)在不需要了,因?yàn)殓R像構(gòu)建任務(wù)要由 Jenkins 自己完成了。在 Jenkins 當(dāng)前任務(wù)下的“配置”中刪除
。
Jenkins 添加 shell 命令
????????在 sonarqube 對(duì)代碼質(zhì)量檢測(cè)完畢后,再添加一個(gè)“構(gòu)建步驟”
。這個(gè)構(gòu)建步驟通過(guò) shell 命令方式
完成。
mv target/*.jar docker/
cd docker
docker build -t hellojenkins .
docker login -u admin -p Harbor12345 192.168.40.138:8888
docker tag hellojenkins 192.168.40.138:8888/jks/hellojenkins
docker image prune -f
docker push 192.168.40.138:8888/jks/hellojenkins
重新構(gòu)建
????????Jenkins 中在返回的任務(wù)首頁(yè)中,再次執(zhí)行立即構(gòu)建
。構(gòu)建成功后,在 Jenkins 主機(jī)
中可以查看到構(gòu)建好的鏡像與重新tag 過(guò)的鏡像。
在 harbor 的倉(cāng)庫(kù)中也可以看到推送來(lái)的鏡像。
Jenkins通知目標(biāo)服務(wù)器拉取鏡像
目標(biāo)服務(wù)器修改 daemon.json 文件
????????目標(biāo)服務(wù)器是 Harbor 的客戶(hù)端,需要修改/etc/docker/daemon.json
文件。修改后重啟 Docker
。
定義腳本文件
????????在目標(biāo)服務(wù)器 PATH 路徑下的任意目錄中定義一個(gè)腳本文件 deploy.sh。例如,定義在/usr/local/bin
目錄下。然后再為其賦予可執(zhí)行權(quán)限。這樣該 deploy.sh
命令就可以在任意目錄下運(yùn)行了。
文件內(nèi)容如下
#!/bin/bash
#harbor的IP地址和端口
harbor_addr_port=$1
#harbor的項(xiàng)目名
harbor_proj=$2
#harbor里的鏡像名
image_repo=$3
#標(biāo)簽
image_tag=$4
#容器內(nèi)部端口
app_port=$5
#宿主機(jī)端口
export_port=$6
#鏡像名
image=$harbor_addr_port/$harbor_proj/$image_repo:$image_tag
#如果容器已經(jīng)存在,就刪除容器
exist_container_id=`docker ps -a | grep $image_repo | awk '{print $1}'`
if [ -n "$exist_container_id" ];thendocker stop "$exist_container_id"docker rm "$exist_container_id"
fi
#判斷tag是否存在,如果存在就刪除,然后拉取最新鏡像
exist_image_tag=`docker images | grep $harbor_addr_port/$harbor_proj/$image_repo | awk '{print $2}'`
if [[ "$exist_image_tag" =~ "$image_tag" ]]; thendocker rmi -f $image
fi
docker login -u admin -p Harbor12345 $harbor_addr_port
docker pull $image
docker run --name $image_repo -d -p $export_port:$app_port $image
echo "SUCCESS"
授予可執(zhí)行權(quán)限
[root@target bin]# chmod +x deploy.sh
執(zhí)行腳本后可以看到
修改idea代碼
再次構(gòu)建,構(gòu)建完成之后執(zhí)行腳本
瀏覽器查看
Jenkins 添加端口號(hào)參數(shù)
Jenkins 添加構(gòu)建后操作
還是在 Jenkins 當(dāng)前任務(wù)下的“配置”中,為任務(wù)添加構(gòu)建后操作
重新構(gòu)建工程
????????這次重新構(gòu)建,可以看到出現(xiàn)了 export_port
的文本框。在這里可以修改容器對(duì)外暴露的端口號(hào)
。
????????構(gòu)建成功后可以看到,目標(biāo)服務(wù)器中增加了新的鏡像,該鏡像是從 harbor 拉取的,還可以看到,該鏡像的容器也已經(jīng)啟動(dòng)。
瀏覽器訪(fǎng)問(wèn)沒(méi)有問(wèn)題