Gogs+Jenkins+Docker 自動化部署.NetCore
環境說(shuō)明
騰訊雲輕量服務器, 配置
1c 2g 6mb
,系統是(shì)ubuntu 20.14
,Docker 和(hé / huò) Jenkins 都在(zài)這(zhè)台服務器上(shàng)面,群晖218+一(yī / yì /yí)台,Gogs 在(zài)這(zhè)台服務器上(shàng)。
Docker安裝
卸載舊的(de) Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
更新 apt 包索引并安裝包以(yǐ)允許 apt 通過 HTTPS 使用存儲庫
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release
添加 Docker 官方的(de) 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 是(shì)否已正确安裝。輸出(chū) Hello from Docker! 表示安裝成功
sudo docker run hello-world
不(bù)同的(de)系統安裝方式可以(yǐ)查閱 docker 官方安裝說(shuō)明
Gogs安裝
Gogs 是(shì)一(yī / yì /yí)款用 Go 語言開發的(de)輕量級極易搭建的(de)自助 Git 服務。 選擇 Gogs 主要(yào / yāo)因爲(wéi / wèi)它相對于(yú) Gitlab 動則幾個(gè)G的(de)内存占用率來(lái)說(shuō)輕太多了(le/liǎo)。Gogs 會大(dà)大(dà)減低系統消耗,跑起來(lái)也(yě)就(jiù)占用100mb内存。我的(de) Gogs 是(shì)跑在(zài)群晖上(shàng)面的(de),效果都是(shì)一(yī / yì /yí)樣,都是(shì)在(zài) Docker 中托管
拉取 Gogs 鏡像
sudo docker pull gogs/gogs
創建 Gogs 文件挂載路徑
mkdir -p /var/gogs
啓動容器 6022 是(shì) https,6080 是(shì) http,可以(yǐ)通過
docker ps
命令來(lái)查看是(shì)否啓動成功。docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs
容器啓動後通過
http://xxxxxxxx:6080
進行 Gogs 的(de)初始配置數據庫類型建議選擇 linux 自帶的(de) SQLite3 ,支撐十幾個(gè)人(rén)左右的(de)團隊使用足夠了(le/liǎo)。域名填寫 Gogs 所在(zài)服務器的(de)域名或者 ip 地(dì / de)址。http 端口号和(hé / huò)容器内部端口一(yī / yì /yí)緻,應用 URL 填寫訪問 Gogs 的(de)域名端口或 ip 端口,點擊安裝後注冊一(yī / yì /yí)個(gè)新用戶登陸即可
Gogs安裝完成後新建一(yī / yì /yí)個(gè) Demo 倉庫稍後使用
Docker中托管.NetCore服務
新建一(yī / yì /yí)個(gè) WebApi 項目
項目中增加一(yī / yì /yí)個(gè) DockerFile 文件并且簡單配置
# 指定依賴版本 FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim WORKDIR /app COPY . /publish WORKDIR /publish # 設置Docker容器對外暴露端口 EXPOSE 80 # 設置時(shí)區 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' >/etc/timezone # 程序入口 ENTRYPOINT ["dotnet", "DemoWebApi.dll"]
發布Api服務,如果發布文件中沒有 DockerFile 文件需要(yào / yāo)手動修改項目文件,發布成功後将發布文件 copy 到(dào)服務器指定的(de)文件夾中
Always
進入服務器剛 copy 的(de)發布文件根路徑下,執行
docker build -t {REPOSITORY}:{TAG} .
命令 通過 DockerFile 來(lái)生成 Docker 鏡像文件,REPOSITORY 是(shì)鏡像的(de)名字,TAG 是(shì)标簽。譬如docker build -t demo:v1 .
通過
docker images
命令來(lái)查看生成的(de)所有鏡像鏡像生成成功後就(jiù)可以(yǐ)通過鏡像創建并運行容器了(le/liǎo)。執行
docker run --name demoapi -dp 5009:80/tcp demo:v1
命令創建并運行容器
-d:後台運行容器,并返回容器ID;
-p:指定端口映射,格式爲(wéi / wèi):主機(宿主)端口:容器端口,容器的(de)端口就(jiù)是(shì)你程序啓動的(de)端口,建議直接在(zài)項目中寫死。
-- name:容器名字執行後可以(yǐ)通過
docker ps
查看所有運行起來(lái)的(de)容器狀态,需要(yào / yāo)查看所有容器可以(yǐ)使用docker ps -a
命令用 postman 測試一(yī / yì /yí)下是(shì)否部署成功了(le/liǎo)
列舉一(yī / yì /yí)些docker常用命令
docker restart {容器id}
#重啓容器docker start {容器id}
#啓動容器docker attach {容器id}
# 這(zhè)樣進入容器退出(chū)會導緻容器也(yě)退出(chū),attach 可以(yǐ)用戶看容器的(de)标準輸出(chū)docker attach {容器id} --sig-proxy=false
# 加上(shàng)參數不(bù)會導緻同期退出(chū)docker exec -it {容器id} /bin/bash
# 進入容器需要(yào / yāo)在(zài)容器中執行命令需要(yào / yāo)使用 exec 命令docker logs {容器id} -f
# 跟蹤日志輸出(chū) -f 跟蹤日志輸出(chū)docker rm -f {容器id}
# 删除已經停止的(de)容器docker rmi {REPOSITORY:TAG}
# 删除指定鏡像docker image prune
# 删除懸空鏡像,也(yě)就(jiù)是(shì)沒有被容器引用的(de)鏡像
到(dào)這(zhè)裏服務已經在(zài) Docker 完成了(le/liǎo)托管,但是(shì)每次發布都需要(yào / yāo) build 新的(de)鏡像,然後停止老的(de)容器,在(zài)創建一(yī / yì /yí)個(gè)新的(de)容器,無形中增加了(le/liǎo)工作量。Jenkins 可以(yǐ)替我們完成這(zhè)些工作
Jenkins安裝
Jenkins 是(shì)依賴 java 的(de),所以(yǐ)需要(yào / yāo)安裝 java 的(de) sdk,這(zhè)裏選擇 java8
sudo apt-get install openjdk-8-jdk
安裝 LTS 版本的(de) 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
正常會輸出(chū)如下内容Jenkins 默認端口是(shì) 8080,安裝成功後通過
http://xxxx:8080
即可訪問,第一(yī / yì /yí)步需要(yào / yāo)先解鎖,管理員密碼會在(zài)安裝成功後輸出(chū),也(yě)可以(yǐ)通過命令cat /var/lib/jenkins/secrets/initialAdminPassword
輸入密碼後進入初始化頁面,選擇安裝推薦插件
插件安裝進度,需要(yào / yāo)一(yī / yì /yí)些些時(shí)間
結束後創建管理賬号登錄即可,進入系統管理,選擇插件管理,搜索
gogs
插件後安裝。安裝後需要(yào / yāo)重啓一(yī / yì /yí)下 Jenkins,訪問鏈接
http://xxxx:8080/restart
後點擊重啓,或者通過執行service jenkins restart
重啓爲(wéi / wèi)了(le/liǎo)方便執行腳本,需要(yào / yāo)讓 Jenkins 以(yǐ) root 用戶來(lái)運行,編輯文件
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自動化
因爲(wéi / wèi)需要(yào / yāo)在(zài)服務器上(shàng) build 項目,所以(yǐ)需要(yào / yāo)安裝 .NetCore 環境,可以(yǐ)查閱 微軟官方文檔 自行安裝
把新建的(de)項目推送到(dào) Gogs 倉庫中後點擊倉庫高級設置
選擇 Web 鈎子(zǐ),添加新 Gogs 的(de) Web 鈎子(zǐ)
配置 Web 鈎子(zǐ),推送地(dì / de)址前面是(shì) Jenkins 的(de)訪問鏈接,後面 job 名字可以(yǐ)自己定義,選擇隻有在(zài) push 的(de)時(shí)候觸發鈎子(zǐ),也(yě)可以(yǐ)自己選定事件
添加後重新點擊管理 Web 鈎子(zǐ),選擇剛才新建的(de)鈎子(zǐ),點擊測試推送來(lái)驗證是(shì)否正常,抛出(chū)的(de)異常如果是(shì) job 未定義說(shuō)明鈎子(zǐ)是(shì)正常的(de),如果是(shì)其他(tā)的(de)異常可以(yǐ)查看推送地(dì / de)址是(shì)否正确,以(yǐ)及 Jenkins 上(shàng)的(de) Gogs 插件是(shì)否正确安裝
回到(dào) Jenkins 頁面,新建一(yī / yì /yí)個(gè)任務,任務名就(jiù)是(shì)之(zhī)前 Gogs 裏面的(de) job 名字,選擇構建自由風格的(de)軟件項目
添加倉庫配置,Repository URL 是(shì)你的(de)倉庫地(dì / de)址,點擊添加你的(de)倉庫憑據信息,最後指定操作的(de)分支
構建選擇執行shell腳本,腳本也(yě)可以(yǐ)放在(zài)服務器上(shàng)這(zhè)裏調用就(jiù)行,爲(wéi / wèi)了(le/liǎo)方便就(jiù)直接寫在(zài)這(zhè)裏
# 判斷是(shì)否存在(zài)demo鏡像是(shì)否存在(zài)docker images | grep demo &> /dev/nullif [ $? -ne 0 ] then # 不(bù)存在(zài)不(bù)做處理 echo "not existed demo"else # 如果鏡像存在(zài)默認認爲(wéi / wèi)容器也(yě)是(shì)在(zài)運行狀态 echo "existed demo" # 停止删除容器和(hé / huò)鏡像 docker stop demoapi docker rm -f demoapi docker rmi demo:v1 fi# 重新build後生成鏡像并運行容器cd DemoWebApi/# 發布到(dào)到(dào)指定路徑dotnet publish -c Release -o /publish# 進入路徑生成鏡像後啓動容器cd /publish docker build -t demo:v1 . docker run --name demoapi -dp 5009:80/tcp demo:v1
保存後點擊立即構建驗證一(yī / yì /yí)下,如果構建失敗可以(yǐ)在(zài)控制台輸出(chū)中查看詳細構建過程和(hé / huò)錯誤信息
回到(dào) Gogs 的(de)管理 Web 鈎子(zǐ)頁面重新推送,成功後 Jenkins 會自動構建發布,之(zhī)後隻要(yào / yāo) Push 到(dào) Master 分支就(jiù)會自動發布
總結
簡單記錄了(le/liǎo)自己折騰的(de)全過程,Jenkins 和(hé / huò) Docker 還有很多功能,要(yào / yāo)在(zài)使用過程中慢慢了(le/liǎo)解。