Gogs+Jenkins+Docker 自動化部署.NetCore的方法步驟
環境說明
- 騰訊雲輕量服務器, 配置
1c 2g 6mb
,系統是ubuntu 20.14
,Docker 和 Jenkins 都在這臺服務器上面, - 群暉218+一臺,Gogs 在這臺服務器上。
Docker安裝
卸載舊的 Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
更新 apt 包索引並安裝包以允許 apt 通過 HTTPS 使用存儲庫
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release
添加 Docker 官方的 GPG 密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
安裝 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
通過運行 hello-world 驗證 Docker 是否已正確安裝。輸出 Hello from Docker! 表示安裝成功
sudo docker run hello-world
不同的系統安裝方式可以查閱 docker 官方安裝說明
Gogs安裝
Gogs 是一款用 Go 語言開發的輕量級極易搭建的自助 Git 服務。 選擇 Gogs 主要因為它相對於 Gitlab 動則幾個G的內用暫用率來說輕太多瞭。Gogs 會大大減低系統消耗,跑起來也就占用100mb內存。我的 Gogs 是跑在群暉上面的,效果都是一樣,都是在 Docker 中托管
拉取 Gogs 鏡像
sudo docker pull gogs/gogs
創建 Gogs 文件掛載路徑
mkdir -p /var/gogs
啟動容器 6022 是 https,6080 是 http,可以通過 docker ps
命令來查看是否啟動成功。
docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs
容器啟動後通過 http://xxxxxxxx:6080
進行 Gogs 的初始配置
數據庫類型建議選擇 linux 自帶的 SQLite3 ,支撐十幾個人左右的團隊使用足夠瞭。域名填寫 Gogs 所在服務器的域名或者 ip 地址。http 端口號和容器內部端口一致,應用 URL 填寫訪問 Gogs 的域名端口或 ip 端口,點擊安裝後註冊一個新用戶登陸即可
Gogs安裝完成後新建一個 Demo 倉庫稍後使用
Gogs 官方文檔
Docker中托管.NetCore服務
新建一個 WebApi 項目
項目中增加一個 DockerFile 文件並且簡單配置
# 指定依賴版本 FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim WORKDIR /app COPY . /publish WORKDIR /publish # 設置Docker容器對外暴露端口 EXPOSE 80 # 設置時區 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' >/etc/timezone # 程序入口 ENTRYPOINT ["dotnet", "DemoWebApi.dll"]
發佈Api服務,如果發佈文件中沒有 DockerFile 文件需要手動修改項目文件,發佈成功後將發佈文件 copy 到服務器指定的文件夾中
<ItemGroup> <None Update="Dockerfile"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup>
進入服務器剛 copy 的發佈文件根路徑下,執行 docker build -t {REPOSITORY}:{TAG} .
命令 通過 DockerFile 來生成 Docker 鏡像文件,REPOSITORY 是鏡像的名字,TAG 是標簽。譬如 docker build -t demo:v1 .
通過 docker images
命令來查看生成的所有鏡像
鏡像生成成功後就可以通過鏡像創建並運行容器瞭。執行 docker run --name demoapi -dp 5009:80/tcp demo:v1
命令創建並運行容器
-d:後臺運行容器,並返回容器ID;
-p:指定端口映射,格式為:主機(宿主)端口:容器端口,容器的端口就是你程序啟動的端口,建議直接在項目中寫死。
— name:容器名字
執行後可以通過 docker ps
查看所有運行起來的容器狀態,需要查看所有容器可以使用 docker ps -a
命令
用 postman 測試一下是否部署成功瞭
列舉一些docker常用命令
docker restart {容器id}
#重啟容器docker start {容器id}
#啟動容器docker attach {容器id}
# 這樣進入容器退出會導致容器也退出,attach 可以用戶看容器的標準輸出docker attach {容器id} --sig-proxy=false
# 加上參數不會導致同期退出docker exec -it {容器id} /bin/bash
# 進入容器需要在容器中執行命令需要使用 exec 命令docker logs {容器id} -f
# 跟蹤日志輸出 -f 跟蹤日志輸出docker rm -f {容器id}
# 刪除已經停止的容器docker rmi {REPOSITORY:TAG}
# 刪除指定鏡像docker image prune
# 刪除懸空鏡像,也就是沒有被容器引用的鏡像
到這裡服務已經在 Docker 完成瞭托管,但是每次發佈都需要 build 新的鏡像,然後停止老的容器,在創建一個新的容器,無形中增加瞭工作量。Jenkins 可以替我們完成這些工作
Jenkins安裝
Jenkins 是依賴 java 的,所以需要安裝 java 的 sdk,這裡選擇 java8
sudo apt-get install openjdk-8-jdk
安裝 LTS 版本的 Jenkins
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \ /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins
查看運行狀態 systemctl status jenkins
正常會輸出如下內容
Jenkins 默認端口是 8080,安裝成功後通過 http://xxxx:8080
即可訪問,第一步需要先解鎖,管理員密碼會在安裝成功後輸出,也可以通過命令 cat /var/lib/jenkins/secrets/initialAdminPassword
輸入密碼後進入初始化頁面,選擇安裝推薦插件
插件安裝進度,需要一些些時間
結束後創建管理賬號登錄即可,進入系統管理,選擇插件管理,搜索gogs
插件後安裝。
安裝後需要重啟一下 Jenkins,訪問鏈接 http://xxxx:8080/restart
後點擊重啟,或者通過執行 service jenkins restart
重啟
為瞭方便執行腳本,需要讓 Jenkins 以 root 用戶來運行,編輯文件 vim /etc/sysconfig/jenkins
或 vim /etc/default/jenkins
取消 JENKINS_USER
註釋,並把值設置成 JENKINS_USER="root"
後修改文件夾權限
chown -R root:root /var/lib/jenkins chown -R root:root /var/cache/jenkins chown -R root:root /var/log/jenkins
jenkins 常用操作
- 啟動
service jenkins start
- 重啟
service jenkins restart
或訪問http://xxxx:8080/restart
- 停止
service jenkins stop
或訪問http://xxxx:8080/exit
- 重新加載配置文件
http://xxxx:8080/reload
使用Jenkins自動化
因為需要在服務器上 build 項目,所以需要安裝 .NetCore 環境,可以查閱 微軟官方文檔 自行安裝
把新建的項目推送到 Gogs 倉庫中後點擊倉庫高級設置
選擇 Web 鉤子,添加新 Gogs 的 Web 鉤子
配置 Web 鉤子,推送地址前面是 Jenkins 的訪問鏈接,後面 job 名字可以自己定義,選擇隻有在 push 的時候觸發鉤子,也可以自己選定事件
添加後重新點擊管理 Web 鉤子,選擇剛才新建的鉤子,點擊測試推送來驗證是否正常,拋出的異常如果是 job 未定義說明鉤子是正常的,如果是其他的異常可以查看推送地址是否正確,以及 Jenkins 上的 Gogs 插件是否正確安裝
回到 Jenkins 頁面,新建一個任務,任務名就是之前 Gogs 裡面的 job 名字,選擇構建自由風格的軟件項目
添加倉庫配置,Repository URL 是你的倉庫地址,點擊添加你的倉庫憑據信息,最後指定操作的分支
構建選擇執行shell腳本,腳本也可以放在服務器上這裡調用就行,為瞭方便就直接寫在這裡
# 判斷是否存在demo鏡像是否存在 docker images | grep demo &> /dev/null if [ $? -ne 0 ] then # 不存在不做處理 echo "not existed demo" else # 如果鏡像存在默認認為容器也是在運行狀態 echo "existed demo" # 停止刪除容器和鏡像 docker stop demoapi docker rm -f demoapi docker rmi demo:v1 fi # 重新build後生成鏡像並運行容器 cd DemoWebApi/ # 發佈到到指定路徑 dotnet publish -c Release -o /publish # 進入路徑生成鏡像後啟動容器 cd /publish docker build -t demo:v1 . docker run --name demoapi -dp 5009:80/tcp demo:v1
保存後點擊立即構建驗證一下,如果構建失敗可以在控制臺輸出中查看詳細構建過程和錯誤信息
回到 Gogs 的管理 Web 鉤子頁面重新推送,成功後 Jenkins 會自動構建發佈,之後隻要 Push 到 Master 分支就會自動發佈
總結
簡單記錄瞭自己折騰的全過程,Jenkins 和 Docker 還有很多功能,要在使用過程中慢慢瞭解。
到此這篇關於Gogs+Jenkins+Docker 自動化部署.NetCore的方法步驟的文章就介紹到這瞭,更多相關Docker 自動化部署.NetCore內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於Jenkins + Docker + ASP.NET Core自動化部署的問題(避免踩坑)
- Linux系統Docker 部署 ASP.NET Core應用的流程分析
- .NET 5 部署在docker上運行的方法
- Centos8.3、docker部署springboot項目實戰案例分析
- .NET 6 從0到1使用Docker部署至Linux環境超詳細教程