[C#]使用 Jenkins 為 .Net Core 實現持續集成/部署

来源:https://www.cnblogs.com/myzony/archive/2018/02/09/8434121.html
-Advertisement-
Play Games

在前後端分離開發的項目當中為了避免重覆構建發佈,我們需要部署一個持續發佈環境,而目前的開發環境伺服器 都是基於 CentOS 的,因此每次在本地發佈之後還需要打包,上傳,部署,十分繁瑣。故這裡採用了比較成熟的 Jenkins 作為持續部署環境。 為了方便安裝,我們這裡使用了 Docker 來進行安裝 ...


在前後端分離開發的項目當中為了避免重覆構建發佈,我們需要部署一個持續發佈環境,而目前的開發環境伺服器都是基於 CentOS 的,因此每次在本地發佈之後還需要打包,上傳,部署,十分繁瑣。故這裡採用了比較成熟的Jenkins 作為持續部署環境。

為了方便安裝,我們這裡使用了 Docker 來進行安裝,至於 Docker 安裝的步驟這裡不在贅述,詳情可以參考這一篇博文

上面安裝的是一個較老的版本,這裡推薦參考Docker 官方文檔來進行安裝。

安裝好 Docker 之後,拉取 Jenkins 的官方鏡像。執行如下命令:

docker pull jenkins/jenkins

拉取完畢之後我們基於這個鏡像封裝一個新的鏡像出來,可能會問為什麼不能直接使用呢?因為這兒的 jenkins鏡像並不包含 docker 環境,所以我們需要封裝一個新的鏡像讓其能夠訪問宿主機的 Docker 程式。
構建 Dockerfile 內容如下:

FROM jenkins/jenkins:latest
USER root
#清除了基礎鏡像設置的源,切換成阿裡雲的源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源並安裝缺少的包
RUN apt-get update && apt-get install -y libltdl7
ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group \
USER jenkins

完成之後執行如下命令構建新的 Docker 鏡像:

docker build -t docker/jenkins .

下麵我們就開始運行我們的 Jenkins 容器了:

docker run -d -p 8080:8080 -p 50000:50000 \
    --name=jenkins -v /root/docker/jenkins:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/usr/bin/docker \
    docker/jenkins

這裡我們將 Jenkins 鏡像裡面的 /var/jenkins_home 映射到了宿主機的 /root/docker/jenkins 文件夾,在這個文件夾裡面都存放的是 Jenkins 的一些配置項等。
註意,這裡可能會出現如下錯誤:

touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

這是因為在 docker 內部的 jenkins user 用戶沒有許可權,因為映射的 /root/docker/jenkins/ 文件夾屬於root 用戶的,而 jenkins user 的 uid 為 1000,執行如下命令:

sudo chown -R 1000:1000 /home/docker/jenkins

之後再次運行 Jenkins 的容器,訪問 http://伺服器IP:8080/ 站點,會提示你輸入密鑰:

我們來到宿主機執行以下 shell 命令:

docker container logs jenkins

就可以看到密鑰其實已經輸出在終端了,複製過來,粘貼進去就可以了。之後就是選擇你需要安裝的插件,選擇第一個預設即可,可能這裡因為網路原因會安裝失敗,可以多重試幾次,或者直接忽略掉,後面我們會將如何解決。

安裝完成之後輸入用戶名密碼,就可以開始使用了,可能你剛纔會因為網路等原因造成插件安裝失敗,這裡我們來到

Jenkins>>系統管理>>管理插件>>高級

然後將 升級站點 地址改為 http://mirror.xmission.com/jenkins/updates/current/update-center.json。之後安裝之前缺失的插件

這裡我們項目使用的是 TFS 進行源代碼管理,所以我們需要安裝 TFS 插件,在 Manage Jenkins 的 Manage Plugin 裡面我們找到 Team Foundation Server Plug-in 插件,勾選,點擊 Download now and install after restart 按鈕,勾選 Restart Jenkins when installation is complete and no jobs are running 。

安裝完成之後 Jenkins 會重啟,等待重啟完畢之後,來到 Jenkins>>Manage Jenkins>>Configure System 查看 TFS/Team Services 然後添加你的 TFS Collection。

保存之後我們就可以新建項目了。

首先,我們來到首頁,選擇 New Item:

然後選擇自由風格項目,填上名稱.

在 Source Code Management 上選擇 TFS,並且填入你的 TFS 伺服器地址,項目路徑,與你的賬號密碼:

然後你就可以嘗試構建一下,構建成功之後就會在 Workspace 看到你的項目文件被拉下來了。

那麼我們的代碼如何構建並且部署呢?因為我們之前在 Jenkins 的 Docker 鏡像啟動的時候掛載了宿主機的 Docker 程式,我們現在就可以直接基於微軟的 dotnetcore 鏡像來構建我們的項目。所以,我們先拉取微軟的 dotnetcore 鏡像,運行如下命令:

docker pull microsoft/dotnet:latest

拉取鏡像之後,我們來編寫一個 Dockerfile 文件來讓 Jenkins 來執行 Shell 構建。
如果你還不知道如何編寫 Dockerfile 文件,可以參考 這篇文章

FROM microsoft/dotnet:latest
WORKDIR /app
COPY ./ .
ENV ASPNETCORE_URLS http://+:5000
EXPOSE 5000

RUN cd ./HKERP.IdentityServer.Host \
    && dotnet restore \
    && dotnet build

WORKDIR /app/HKERP.IdentityServer.Host
ENTRYPOINT ["dotnet","run"]

然後將這個 Dockerfile 放在你的項目裡面,類似於這樣:

然後我們再回到剛纔 Jenkins 裡面,配置剛纔項目,新建一個 Shell Step,就像這樣:

代碼如下:

#!/bin/sh
cd /var/jenkins_home/workspace/API_IdentityServer
docker container prune << EOF
y
EOF
docker container ls -a | grep "api_identityserver"
if [ $? -eq 0 ];then
    docker container stop api_identityserver
    docker container rm api_identityserver
fi
docker image prune << EOF
y
EOF
docker build -t api_identityserver .
docker run -d -p 8083:5000 --name=api_identityserver api_identityserver

步驟就是首先清理掉 docker 處於終止狀態的容器,然後判斷有沒有叫 api_identityserver 的容器在運行,如果有就直接停掉,然後清除所有的虛懸鏡像,使用當前目錄的 dockerfile 構建一個新的 api_identityserver 鏡像,使用 api_identityserver 鏡像運行一個新的容器。

這兒我安裝了 Jenkins 的一個 Blue Ocean 插件,來看一下:

運行一下:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python擅長的領域: WEB開發:Django\pyramid\Tornado\Bottle\Flask\WebPy網路編程:Twisted\Requests\Scrapy\Paramiko科學運算:SciPy\Pandas\IpythonGUI圖形開發:wxPythin\PyQT\Kivy運維 ...
  • 1.1 基於UDP協議實現簡單的套接字通信 udp是無鏈接的,先啟動哪一端都不會報錯 udp套接字簡單示例 1.1.1.1 客戶端: from socket import * client=socket(AF_INET,SOCK_DGRAM) #數據報協議,創建一個客戶的套接字 while True ...
  • 在python中,可以使用try...except語句來處理異常。做法是,把可能引發異常的語句放在try 塊中,把處理異常的語句放在except 塊中。 當程式在try內部打開文件引發異常時,會跳過try中剩下的代碼,直接跳轉到except中的語句處理異常。於是輸出了“File not exists ...
  • Python讀寫csv文件 覺得有用的話,歡迎一起討論相互學習~ "Follow Me" 前言 逗號分隔值(Comma Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味著該文件是一個字元序列,不含必 ...
  • 前言 在上一篇 "Kafka使用Java實現數據的生產和消費demo" 中介紹如何簡單的使用kafka進行數據傳輸。本篇則重點介紹kafka中的 consumer 消費者的講解。 應用場景 在上一篇kafka的consumer消費者,我們使用的是自動提交offset下標。 但是offset下標自動提 ...
  • Python 學習之路(一) 以下所用的是Python 3.6 一、編碼問題 二、基礎知識 2.1 標識符 在 Python 里,標識符由字母、數字、下劃線組成。 在 Python 中,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。 Python 中的標識符是區分大小寫的。 2.2 ...
  • 目前正在學習python基本語法以及電腦網路課,所以正好結合學習python網路編程,看的是《python核心編程》第三版,發現示例2-1代碼返回錯誤…..糾結很久 發現這裡python3.5和Python2.7在套接字返回值解碼上有區別。 先介紹一下 python bytes和str兩種類型轉換 ...
  • 本篇導航: RESTful RESTful API設計 基於django實現 基於Django Rest Framework框架實現 一、RESTful REST與技術無關,代表的是一種軟體架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表徵狀態 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...