前言
828 B2B 企業(yè)節(jié)特惠來襲,F(xiàn)lexus X 實(shí)例引領(lǐng)自動化部署新紀(jì)元!Docker 攜手 Jenkins 與 Gitee,共創(chuàng) CICD 無限可能!在快速迭代的數(shù)字時代,我們自豪地推出這一前沿解決方案,為您的 C# Web API 項(xiàng)目注入前所未有的敏捷動力。通過集成 Docker 容器化技術(shù)、Jenkins 持續(xù)集成/持續(xù)部署(CICD)平臺,以及 Gitee 高效版本控制系統(tǒng),我們旨在打造一個無縫銜接的開發(fā)到部署流水線,讓您的項(xiàng)目在數(shù)字化轉(zhuǎn)型的浪潮中乘風(fēng)破浪,遙遙領(lǐng)先!
一個高度自動化的環(huán)境,每一次代碼提交都能觸發(fā)自動化的構(gòu)建、測試與部署流程。在這個流程中,Docker 確保了應(yīng)用運(yùn)行環(huán)境的標(biāo)準(zhǔn)化與一致性,無論本地開發(fā)還是云端部署,都能享受到“所見即所得”的便捷;Jenkins 作為強(qiáng)大的 CICD 引擎,自動化地管理著整個流程,從代碼拉取、編譯構(gòu)建到部署發(fā)布,每一步都精準(zhǔn)無誤;而 Gitee,作為您的代碼倉庫,不僅提供了安全的版本控制服務(wù),還通過集成 Jenkins 觸發(fā)器,實(shí)現(xiàn)了代碼變更與部署流程的即時聯(lián)動。
本實(shí)踐指南將帶您深入探索 Docker+Jenkins+Gitee 的完美結(jié)合,一步步構(gòu)建起一套高效、可靠的 CICD 自動化部署體系。您將學(xué)會如何配置 Jenkins 以監(jiān)聽 Gitee 的 Webhooks,實(shí)現(xiàn)代碼提交的即時響應(yīng);如何利用 Docker 容器快速打包并運(yùn)行您的 C# Web API 應(yīng)用;以及如何通過 Jenkins 腳本化地管理整個部署流程,包括環(huán)境配置、依賴安裝、測試執(zhí)行與部署發(fā)布等關(guān)鍵環(huán)節(jié)。
實(shí)驗(yàn)步驟
環(huán)境準(zhǔn)備
本實(shí)驗(yàn)沿用了上一個實(shí)驗(yàn),環(huán)境是 Flexus X 實(shí)例自定義模式,使用了 4vCPUs | 12GiB,鏡像是最高版本的 ubuntu,在上一個實(shí)驗(yàn)中使用 xshell 連接了服務(wù)器,隨后在服務(wù)器中安裝了 git、dokcer。這里就不重復(fù)介紹了,可自行操作或參考上一個實(shí)驗(yàn)!
828華為云征文|Flexus X實(shí)例C#/.Net Core 結(jié)合(git代碼管理、docker自定義鏡像)快速發(fā)布部署-讓你的項(xiàng)目飛起來~-CSDN博客
安裝 Portainer
介紹:
Portainer 是一款開源的輕量級管理 UI,旨在簡化 Docker 和 Kubernetes 環(huán)境的管理。Portainer 提供了狀態(tài)顯示面板、應(yīng)用模板快速部署、容器鏡像網(wǎng)絡(luò)數(shù)據(jù)卷的基本操作(包括上傳下載鏡像,創(chuàng)建容器等操作)、事件日志顯示、容器控制臺操作、Swarm 集群和服務(wù)的集中管理和操作等功能。這些功能基本能滿足中小型單位對容器管理的全部需求。
拉取鏡像
使用 Docker 命令拉取 Portainer 的 Docker 鏡像:
docker pull portainer/portainer-ce
拉取鏡像報錯了!!!在嘗試從 Docker 鏡像倉庫(如 Docker Hub)獲取鏡像時遇到了問題。我們可能需要配置 Docker 以使用國內(nèi)的鏡像源,因?yàn)橹苯釉L問 Docker Hub 有時可能會很慢或不穩(wěn)定
更換鏡像源
在 Linux 系統(tǒng)中,Docker 的配置文件通常位于/etc/docker/daemon.json。如果該文件不存在,則需要手動創(chuàng)建。
從查詢結(jié)果來看,我目前并沒有這個文件,下面我自己創(chuàng)建一個!
// 創(chuàng)建文件 cd etc/dockertouch daemon.json //編輯文件 vim daemon.json// 在文件中輸入以下內(nèi)容 注意:剛打開文件要輸入 i 才可以進(jìn)入編輯模式{"registry-mirrors": ["https://gallery.ecr.aws/","https://gitverse.ru/docs/artifactory/gitverse-registry/","https://docker.lmirror.top","https://atomhub.openatom.cn/"]}// 退出編輯模式,從插入模式回到普通模式,只需要按下 Esc 鍵// 退出 Vim// 修改完成后我們需要完全退出 Vim 編輯器,可以使用以下命令::q //如果沒有做任何修改,則退出 Vim。:q! //強(qiáng)制退出 Vim,不保存任何修改。:wq 或 :x //保存修改并退出 Vim。:ZZ //和 :wq 一樣,保存修改并退出 Vim,但更簡短。
接下來我們重啟 docker 服務(wù)
[root@localhost]# systemctl daemon-reload[root@localhost]# systemctl restart docker
再次拉取 Portainer 的 Docker 鏡像,此時已經(jīng)可以正常拉取了!
啟動容器
執(zhí)行下面命令運(yùn)行 Portainer 容器
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/portainer-ce
運(yùn)行容器后,去華為服務(wù)器控制臺開放我們的 9000 端口
使用我們的服務(wù)器 IP 地址+端口號,訪問可視化界面,第一次訪問需要配置賬號密碼
點(diǎn)擊 LiveConnect 打開本地 docker,可以查看宿主機(jī)配置信息、查看容器、鏡像、網(wǎng)絡(luò)、卷等相關(guān)信息。
安裝 jenkins
介紹:
Jenkins 是一個開源的持續(xù)集成和持續(xù)部署(CI/CD)工具,它支持各種編程語言和平臺,廣泛應(yīng)用于軟件開發(fā)和交付過程中。Jenkins 可以監(jiān)視源代碼倉庫(如 Git、SVN 等)的變化,并在代碼提交后自動執(zhí)行構(gòu)建過程,包括編譯、測試和打包等步驟。
拉取鏡像
使用 docker pull jenkins/jenkins:lts 命令拉取 Jenkins 的長期支持(LTS)版本鏡像
運(yùn)行容器
# 在宿主機(jī)上創(chuàng)建一個目錄,用于存放 Jenkins 的數(shù)據(jù) mkdir -p /var/jenkins_home# 為了確保 Jenkins 容器能夠正常訪問該目錄,需要設(shè)置適當(dāng)?shù)臋?quán)限 chmod 777 /var/jenkins_home# 啟動容器 docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock --restart=always jenkins/jenkins:lts# 參數(shù)說明:-d:以后臺模式運(yùn)行容器。--name myjenkins:為容器指定一個名稱。-p 8080:8080:將容器的 8080 端口映射到宿主機(jī)的 8080 端口,用于訪問 Jenkins 的 Web 界面。-p 50000:50000:將容器的 50000 端口映射到宿主機(jī)的 50000 端口,用于 Jenkins 的節(jié)點(diǎn)和主控節(jié)點(diǎn)之間的通信。-v /var/jenkins_home:/var/jenkins_home:將宿主機(jī)的/var/jenkins_home 目錄掛載到容器的/var/jenkins_home 目錄,用于持久化 Jenkins 的數(shù)據(jù)。-v /etc/localtime:/etc/localtime:將宿主機(jī)的時區(qū)文件掛載到容器內(nèi),確保容器內(nèi)的時間與宿主機(jī)一致。-v /usr/bin/docker:/usr/bin/docker 和 -v /var/run/docker.sock:/var/run/docker.sock:允許容器內(nèi)的 Jenkins 使用宿主機(jī)的 Docker 命令和 Docker 引擎。--restart=always:設(shè)置容器在退出時總是自動重啟。
執(zhí)行完后使用 docker ps 命令查看正在運(yùn)行的容器列表,確認(rèn) Jenkins 容器已經(jīng)啟動。
老樣子,開放 8080 端口,ip+端口訪問頁面!
獲取管理員密碼
第一次訪問需要輸入管理員密碼,我們有兩種方法可以獲取到密碼!
1.查看日志:
使用 docker logs myjenkins 命令查看 Jenkins 容器的輸出日志,找到包含管理員密碼的行。
2.直接查看文件:
也可以在宿主機(jī)的/var/jenkins_home/secrets/initialAdminPassword 文件中找到管理員密碼。
這里我直接打開剛剛安裝的 portainer 界面,找到容器,點(diǎn)擊日志圖標(biāo)!
如下所示 Please use the following password to proceed to installation:的下面一行就是密碼!
選擇安裝建議安裝的插件!
安裝插件需要等待一會~~~
安裝完成后系統(tǒng)提示我們創(chuàng)建一個新用戶,這里我選擇使用 admin 用戶繼續(xù)!
在設(shè)置中安裝 Gitee 插件
點(diǎn)擊 New Item 創(chuàng)建一個新任務(wù)!
新建流水線項(xiàng)目
Portainer 配置
然后選擇第一種任務(wù)模式,自由風(fēng)格軟件項(xiàng)目
在源代碼管理 Source Code Management 中選擇 Git,打開 gitee 找到自己需要部署的倉庫,復(fù)制地址。
粘貼到 Repository URL 中,第一次創(chuàng)建 Credentials 是空的,我們點(diǎn)擊下面的 add 新建一個,
新建 Credentials 時我們只需要填寫 Username 和 Password,其他空著就好!
username 就是剛剛打開 gitee 項(xiàng)目時如下圖框框位置,然后 password 官方是建議使用私人令牌的,直接點(diǎn)擊藍(lán)色字體參考步驟生成私人令牌復(fù)制過來就好了!
Branches to build 選擇你當(dāng)前倉庫要構(gòu)建的分支,我這里默認(rèn)是 master 分支
在這里可以選擇遠(yuǎn)程觸發(fā)構(gòu)建,代碼變更構(gòu)建,定時構(gòu)建等等,我這里選擇的是 Build when a change is pushed to Gitee,當(dāng) gitee 上的代碼發(fā)送推送時觸發(fā)構(gòu)建!
勾選之后,滑到下面,點(diǎn)擊 Generate,會生成一條密碼。注意(這里的上圖的 Webhook 和下面生成的密碼都要記錄下來,稍后我們要配置到 gitee 上)
Build Environment 中我們勾選第一個,每次構(gòu)建前刪除之前的工作區(qū),以節(jié)省內(nèi)存。
在 Build Steps 中我們選擇新增一個 Execute shell,編寫命令來管理容器和鏡像。
輸入如下代碼!
下面是對代碼的解釋,可以根據(jù)自己的項(xiàng)目差異進(jìn)行調(diào)整!
# 將當(dāng)前工作目錄更改為 Jenkins 的一個特定工作空間 cd /var/lib/jenkins/workspace/auth_server# 強(qiáng)制刪除所有已停止的 Docker 容器 docker container prune -f# 列出所有 Docker 容器(包括未運(yùn)行的),然后通過管道 (|) 將輸出傳遞給 grep "auth"docker container ls -a | grep "auth" if [ $? -eq 0 ];then # 如果存在名為 auth 的容器,并且該容器正在運(yùn)行,這條命令將停止該容器。docker container stop auth # 這條命令刪除名為 auth 的容器docker container rm auth fi# 強(qiáng)制刪除所有未使用的 Docker 鏡像 docker image prune -f# 構(gòu)建一個新的 Docker 鏡像 docker build -t auth .# 啟動容器 docker run -d -p 5000:5000 --restart=always --name auth auth
gitee 配置 WebHooks
打開代碼倉庫,在管理中找到 WebHooks,點(diǎn)擊添加 WebHook
將上面 Jenkins 項(xiàng)目設(shè)置中的 Gitee webhook URL 和 Gitee Webhook 密碼復(fù)制下來,填進(jìn)去!
注意:因?yàn)?Gitee 中的 bug,就算配置成功了,測試 WebHook 也會出現(xiàn) 404 錯誤,不要著急,稍后我們?nèi)バ薷囊幌麓a提交一次!
構(gòu)建
修改完配置之后,我們先手動進(jìn)行構(gòu)建一次,測試一下,點(diǎn)擊項(xiàng)目中的 build Now。
在下面會出現(xiàn)每一次的構(gòu)建記錄,點(diǎn)擊最新的一次,再點(diǎn)擊 Console Output,可以查看我們的構(gòu)建日志。由下圖可見,我此次構(gòu)建失敗了!!!
從報錯信息看出,這個錯誤信息表示在執(zhí)行 Jenkins 構(gòu)建任務(wù)時,嘗試連接到 Docker 守護(hù)進(jìn)程的 Unix 套接字(/var/run/docker.sock)時遇到了權(quán)限問題。因此,構(gòu)建任務(wù)失敗。
要解決這個問題,需要確保 Jenkins 用戶具有訪問 Docker 守護(hù)進(jìn)程的權(quán)限。
打開終端并輸入以下命令以創(chuàng)建名為'jenkins' 的用戶
sudo adduser jenkins
將'jenkins' 用戶添加到 'docker' 組
sudo usermod -a -G docker jenkins
在編輯完成后,需要重新加載 systemd 配置以使更改生效。運(yùn)行以下命令:
sudo systemctl daemon-reload
重啟 Docker 服務(wù)以應(yīng)用新的配置:
sudo systemctl restart docker
如果上述方法不起作用,可以嘗試更改/var/run/docker.sock 的權(quán)限,使其對所有用戶可讀寫。執(zhí)行以下命令:
sudo chmod 666 /var/run/docker.sock
請注意,這種方法可能會帶來安全風(fēng)險,因?yàn)樗试S所有用戶訪問 Docker 守護(hù)進(jìn)程。在生產(chǎn)環(huán)境中,建議僅將特定用戶添加到 docker 用戶組。
構(gòu)建成功!
打開 Portainer 看一下,雖然容器與宿主機(jī)映射的是 5000 端口,但其實(shí)因?yàn)槲覀儧]有給.net 項(xiàng)目配置端口,實(shí)際上默認(rèn)還是 8080,這樣會與 jenkins 的默認(rèn)端口沖突,因此我們修改一下代碼!
修改代碼,自動部署
在 appsetting 中加入配置,提交代碼!
"Kestrel": {"EndPoints": {"Http": {"Url": "http://+:5000"}}}
因?yàn)槲覀冎耙呀?jīng)配置好了,在代碼提交之后,會自動發(fā)送一個請求到我們的 jenkins
然后 jenkins 就會自動開啟構(gòu)建任務(wù)了
老樣子,開放 5000 端口!
訪問一下我們的接口,成功!
審核編輯 黃宇
-
開源
+關(guān)注
關(guān)注
3文章
3362瀏覽量
42528 -
華為云
+關(guān)注
關(guān)注
3文章
2566瀏覽量
17453
發(fā)布評論請先 登錄
相關(guān)推薦
評論