環境說明
- 騰訊雲輕量服務器, 配置
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 倉庫稍后使用
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 還有很多功能,要在使用過程中慢慢了解。