Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore的方法步驟
環(huán)境說(shuō)明
- 騰訊云輕量服務(wù)器, 配置
1c 2g 6mb
,系統(tǒng)是ubuntu 20.14
,Docker 和 Jenkins 都在這臺(tái)服務(wù)器上面, - 群暉218+一臺(tái),Gogs 在這臺(tái)服務(wù)器上。
Docker安裝
卸載舊的 Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
更新 apt 包索引并安裝包以允許 apt 通過(guò) HTTPS 使用存儲(chǔ)庫(kù)
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ò)運(yùn)行 hello-world 驗(yàn)證 Docker 是否已正確安裝。輸出 Hello from Docker! 表示安裝成功
sudo docker run hello-world
不同的系統(tǒng)安裝方式可以查閱 docker 官方安裝說(shuō)明
Gogs安裝
Gogs 是一款用 Go 語(yǔ)言開(kāi)發(fā)的輕量級(jí)極易搭建的自助 Git 服務(wù)。 選擇 Gogs 主要因?yàn)樗鄬?duì)于 Gitlab 動(dòng)則幾個(gè)G的內(nèi)用暫用率來(lái)說(shuō)輕太多了。Gogs 會(huì)大大減低系統(tǒng)消耗,跑起來(lái)也就占用100mb內(nèi)存。我的 Gogs 是跑在群暉上面的,效果都是一樣,都是在 Docker 中托管
拉取 Gogs 鏡像
sudo docker pull gogs/gogs
創(chuàng)建 Gogs 文件掛載路徑
mkdir -p /var/gogs
啟動(dòng)容器 6022 是 https,6080 是 http,可以通過(guò) docker ps
命令來(lái)查看是否啟動(dòng)成功。
docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs
容器啟動(dòng)后通過(guò) http://xxxxxxxx:6080
進(jìn)行 Gogs 的初始配置
數(shù)據(jù)庫(kù)類型建議選擇 linux 自帶的 SQLite3 ,支撐十幾個(gè)人左右的團(tuán)隊(duì)使用足夠了。域名填寫 Gogs 所在服務(wù)器的域名或者 ip 地址。http 端口號(hào)和容器內(nèi)部端口一致,應(yīng)用 URL 填寫訪問(wèn) Gogs 的域名端口或 ip 端口,點(diǎn)擊安裝后注冊(cè)一個(gè)新用戶登陸即可
Gogs安裝完成后新建一個(gè) Demo 倉(cāng)庫(kù)稍后使用
Docker中托管.NetCore服務(wù)
新建一個(gè) WebApi 項(xiàng)目
項(xiàng)目中增加一個(gè) DockerFile 文件并且簡(jiǎn)單配置
# 指定依賴版本 FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim WORKDIR /app COPY . /publish WORKDIR /publish # 設(shè)置Docker容器對(duì)外暴露端口 EXPOSE 80 # 設(shè)置時(shí)區(qū) RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' >/etc/timezone # 程序入口 ENTRYPOINT ["dotnet", "DemoWebApi.dll"]
發(fā)布Api服務(wù),如果發(fā)布文件中沒(méi)有 DockerFile 文件需要手動(dòng)修改項(xiàng)目文件,發(fā)布成功后將發(fā)布文件 copy 到服務(wù)器指定的文件夾中
<ItemGroup> <None Update="Dockerfile"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup>
進(jìn)入服務(wù)器剛 copy 的發(fā)布文件根路徑下,執(zhí)行 docker build -t {REPOSITORY}:{TAG} .
命令 通過(guò) DockerFile 來(lái)生成 Docker 鏡像文件,REPOSITORY 是鏡像的名字,TAG 是標(biāo)簽。譬如 docker build -t demo:v1 .
通過(guò) docker images
命令來(lái)查看生成的所有鏡像
鏡像生成成功后就可以通過(guò)鏡像創(chuàng)建并運(yùn)行容器了。執(zhí)行 docker run --name demoapi -dp 5009:80/tcp demo:v1
命令創(chuàng)建并運(yùn)行容器
-d:后臺(tái)運(yùn)行容器,并返回容器ID;
-p:指定端口映射,格式為:主機(jī)(宿主)端口:容器端口,容器的端口就是你程序啟動(dòng)的端口,建議直接在項(xiàng)目中寫死。
-- name:容器名字
執(zhí)行后可以通過(guò) docker ps
查看所有運(yùn)行起來(lái)的容器狀態(tài),需要查看所有容器可以使用 docker ps -a
命令
用 postman 測(cè)試一下是否部署成功了
列舉一些docker常用命令
docker restart {容器id}
#重啟容器docker start {容器id}
#啟動(dòng)容器docker attach {容器id}
# 這樣進(jìn)入容器退出會(huì)導(dǎo)致容器也退出,attach 可以用戶看容器的標(biāo)準(zhǔn)輸出docker attach {容器id} --sig-proxy=false
# 加上參數(shù)不會(huì)導(dǎo)致同期退出docker exec -it {容器id} /bin/bash
# 進(jìn)入容器需要在容器中執(zhí)行命令需要使用 exec 命令docker logs {容器id} -f
# 跟蹤日志輸出 -f 跟蹤日志輸出docker rm -f {容器id}
# 刪除已經(jīng)停止的容器docker rmi {REPOSITORY:TAG}
# 刪除指定鏡像docker image prune
# 刪除懸空鏡像,也就是沒(méi)有被容器引用的鏡像
到這里服務(wù)已經(jīng)在 Docker 完成了托管,但是每次發(fā)布都需要 build 新的鏡像,然后停止老的容器,在創(chuàng)建一個(gè)新的容器,無(wú)形中增加了工作量。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
查看運(yùn)行狀態(tài) systemctl status jenkins
正常會(huì)輸出如下內(nèi)容
Jenkins 默認(rèn)端口是 8080,安裝成功后通過(guò) http://xxxx:8080
即可訪問(wèn),第一步需要先解鎖,管理員密碼會(huì)在安裝成功后輸出,也可以通過(guò)命令 cat /var/lib/jenkins/secrets/initialAdminPassword
輸入密碼后進(jìn)入初始化頁(yè)面,選擇安裝推薦插件
插件安裝進(jìn)度,需要一些些時(shí)間
結(jié)束后創(chuàng)建管理賬號(hào)登錄即可,進(jìn)入系統(tǒng)管理,選擇插件管理,搜索gogs
插件后安裝。
安裝后需要重啟一下 Jenkins,訪問(wèn)鏈接 http://xxxx:8080/restart
后點(diǎn)擊重啟,或者通過(guò)執(zhí)行 service jenkins restart
重啟
為了方便執(zhí)行腳本,需要讓 Jenkins 以 root 用戶來(lái)運(yùn)行,編輯文件 vim /etc/sysconfig/jenkins
或 vim /etc/default/jenkins
取消 JENKINS_USER
注釋,并把值設(shè)置成 JENKINS_USER="root"
后修改文件夾權(quán)限
chown -R root:root /var/lib/jenkins chown -R root:root /var/cache/jenkins chown -R root:root /var/log/jenkins
jenkins 常用操作
- 啟動(dòng)
service jenkins start
- 重啟
service jenkins restart
或訪問(wèn)http://xxxx:8080/restart
- 停止
service jenkins stop
或訪問(wèn)http://xxxx:8080/exit
- 重新加載配置文件
http://xxxx:8080/reload
使用Jenkins自動(dòng)化
因?yàn)樾枰诜?wù)器上 build 項(xiàng)目,所以需要安裝 .NetCore 環(huán)境,可以查閱 微軟官方文檔 自行安裝
把新建的項(xiàng)目推送到 Gogs 倉(cāng)庫(kù)中后點(diǎn)擊倉(cāng)庫(kù)高級(jí)設(shè)置
選擇 Web 鉤子,添加新 Gogs 的 Web 鉤子
配置 Web 鉤子,推送地址前面是 Jenkins 的訪問(wèn)鏈接,后面 job 名字可以自己定義,選擇只有在 push 的時(shí)候觸發(fā)鉤子,也可以自己選定事件
添加后重新點(diǎn)擊管理 Web 鉤子,選擇剛才新建的鉤子,點(diǎn)擊測(cè)試推送來(lái)驗(yàn)證是否正常,拋出的異常如果是 job 未定義說(shuō)明鉤子是正常的,如果是其他的異??梢圆榭赐扑偷刂肥欠裾_,以及 Jenkins 上的 Gogs 插件是否正確安裝
回到 Jenkins 頁(yè)面,新建一個(gè)任務(wù),任務(wù)名就是之前 Gogs 里面的 job 名字,選擇構(gòu)建自由風(fēng)格的軟件項(xiàng)目
添加倉(cāng)庫(kù)配置,Repository URL 是你的倉(cāng)庫(kù)地址,點(diǎn)擊添加你的倉(cāng)庫(kù)憑據(jù)信息,最后指定操作的分支
構(gòu)建選擇執(zhí)行shell腳本,腳本也可以放在服務(wù)器上這里調(diào)用就行,為了方便就直接寫在這里
# 判斷是否存在demo鏡像是否存在 docker images | grep demo &> /dev/null if [ $? -ne 0 ] then # 不存在不做處理 echo "not existed demo" else # 如果鏡像存在默認(rèn)認(rèn)為容器也是在運(yùn)行狀態(tài) echo "existed demo" # 停止刪除容器和鏡像 docker stop demoapi docker rm -f demoapi docker rmi demo:v1 fi # 重新build后生成鏡像并運(yùn)行容器 cd DemoWebApi/ # 發(fā)布到到指定路徑 dotnet publish -c Release -o /publish # 進(jìn)入路徑生成鏡像后啟動(dòng)容器 cd /publish docker build -t demo:v1 . docker run --name demoapi -dp 5009:80/tcp demo:v1
保存后點(diǎn)擊立即構(gòu)建驗(yàn)證一下,如果構(gòu)建失敗可以在控制臺(tái)輸出中查看詳細(xì)構(gòu)建過(guò)程和錯(cuò)誤信息
回到 Gogs 的管理 Web 鉤子頁(yè)面重新推送,成功后 Jenkins 會(huì)自動(dòng)構(gòu)建發(fā)布,之后只要 Push 到 Master 分支就會(huì)自動(dòng)發(fā)布
總結(jié)
簡(jiǎn)單記錄了自己折騰的全過(guò)程,Jenkins 和 Docker 還有很多功能,要在使用過(guò)程中慢慢了解。
到此這篇關(guān)于Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore的方法步驟的文章就介紹到這了,更多相關(guān)Docker 自動(dòng)化部署.NetCore內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
rocketmq-streams的ILeaseService使用示例詳解
這篇文章主要為大家介紹了rocketmq-streams的ILeaseService使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Docker手動(dòng)構(gòu)建JDK鏡像的實(shí)現(xiàn)示例
本文主要介紹了 Docker手動(dòng)構(gòu)建JDK鏡像的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Docker 部署單機(jī)版 Pulsar 和集群架構(gòu) Redis(開(kāi)發(fā)神器)的方法
這篇文章主要介紹了Docker 部署單機(jī)版 Pulsar 和集群架構(gòu) Redis(開(kāi)發(fā)神器)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10docker搭建Hadoop?CDH高可用集群實(shí)現(xiàn)
本文主要介紹了docker搭建Hadoop?CDH高可用集群實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳解docker容器硬盤動(dòng)態(tài)擴(kuò)容
本篇文章主要介紹了詳解docker容器硬盤動(dòng)態(tài)擴(kuò)容,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04