...

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

2021-06-28

環境說(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 倉庫稍後使用


  • Gogs 官方文檔

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)解。

來(lái)源:cnblogs