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