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