...

Gogs+Jenkins+Docker 自動化部署.NetCore

2021-06-28

環境說(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)使用


  • Gogs 官方文檔

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ò)程中慢慢了解。

來源:cnblogs