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

她微笑的臉發表於2021-06-28

環境說明


  • 騰訊雲輕量伺服器, 配置 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 倉庫稍後使用
    圖片名稱

  • Gogs 官方文件

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/jenkinsvim /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 還有很多功能,要在使用過程中慢慢了解。

相關文章