如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解
前言
在前后端分離開(kāi)發(fā)的項(xiàng)目當(dāng)中為了避免重復(fù)構(gòu)建發(fā)布,我們需要部署一個(gè)持續(xù)發(fā)布環(huán)境,而目前的開(kāi)發(fā)環(huán)境服務(wù)器都是基于 CentOS 的,因此每次在本地發(fā)布之后還需要打包,上傳,部署,十分繁瑣。故這里采用了比較成熟的Jenkins 作為持續(xù)部署環(huán)境。
為了方便安裝,我們這里使用了 Docker 來(lái)進(jìn)行安裝,至于 Docker 安裝的步驟這里不在贅述,詳情可以參考這一篇博文。
上面安裝的是一個(gè)較老的版本,這里推薦參考Docker 官方文檔來(lái)進(jìn)行安裝。
安裝好 Docker 之后,拉取 Jenkins 的官方鏡像。執(zhí)行如下命令:
docker pull jenkins/jenkins
拉取完畢之后我們基于這個(gè)鏡像封裝一個(gè)新的鏡像出來(lái),可能會(huì)問(wèn)為什么不能直接使用呢?因?yàn)檫@兒的 jenkins鏡像并不包含 docker 環(huán)境,所以我們需要封裝一個(gè)新的鏡像讓其能夠訪(fǎng)問(wèn)宿主機(jī)的 Docker 程序。
構(gòu)建 Dockerfile 內(nèi)容如下:
FROM jenkins/jenkins:latest USER root #清除了基礎(chǔ)鏡像設(shè)置的源,切換成阿里云的源 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
完成之后執(zhí)行如下命令構(gòu)建新的 Docker 鏡像:
docker build -t docker/jenkins .
下面我們就開(kāi)始運(yùn)行我們的 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 映射到了宿主機(jī)的 /root/docker/jenkins 文件夾,在這個(gè)文件夾里面都存放的是 Jenkins 的一些配置項(xiàng)等。
注意,這里可能會(huì)出現(xiàn)如下錯(cuò)誤:
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?
這是因?yàn)樵?docker 內(nèi)部的 jenkins user 用戶(hù)沒(méi)有權(quán)限,因?yàn)橛成涞?/root/docker/jenkins/ 文件夾屬于root 用戶(hù)的,而 jenkins user 的 uid 為 1000,執(zhí)行如下命令:
sudo chown -R 1000:1000 /home/docker/jenkins
之后再次運(yùn)行 Jenkins 的容器,訪(fǎng)問(wèn) http://服務(wù)器IP:8080/ 站點(diǎn),會(huì)提示你輸入密鑰:
我們來(lái)到宿主機(jī)執(zhí)行以下 shell 命令:
docker container logs jenkins
就可以看到密鑰其實(shí)已經(jīng)輸出在終端了,復(fù)制過(guò)來(lái),粘貼進(jìn)去就可以了。之后就是選擇你需要安裝的插件,選擇第一個(gè)默認(rèn)即可,可能這里因?yàn)榫W(wǎng)絡(luò)原因會(huì)安裝失敗,可以多重試幾次,或者直接忽略掉,后面我們會(huì)將如何解決。
安裝完成之后輸入用戶(hù)名密碼,就可以開(kāi)始使用了,可能你剛才會(huì)因?yàn)榫W(wǎng)絡(luò)等原因造成插件安裝失敗,這里我們來(lái)到
Jenkins>>系統(tǒng)管理>>管理插件>>高級(jí)
然后將 升級(jí)站點(diǎn) 地址改為 http://mirror.xmission.com/jenkins/updates/current/update-center.json。之后安裝之前缺失的插件。
這里我們項(xiàng)目使用的是 TFS 進(jìn)行源代碼管理,所以我們需要安裝 TFS 插件,在 Manage Jenkins 的 Manage Plugin 里面我們找到 Team Foundation Server Plug-in 插件,勾選,點(diǎn)擊 Download now and install after restart 按鈕,勾選 Restart Jenkins when installation is complete and no jobs are running 。
安裝完成之后 Jenkins 會(huì)重啟,等待重啟完畢之后,來(lái)到 Jenkins>>Manage Jenkins>>Configure System 查看 TFS/Team Services 然后添加你的 TFS Collection。
保存之后我們就可以新建項(xiàng)目了。
首先,我們來(lái)到首頁(yè),選擇 New Item:
然后選擇自由風(fēng)格項(xiàng)目,填上名稱(chēng).
在 Source Code Management 上選擇 TFS,并且填入你的 TFS 服務(wù)器地址,項(xiàng)目路徑,與你的賬號(hào)密碼:
然后你就可以嘗試構(gòu)建一下,構(gòu)建成功之后就會(huì)在 Workspace 看到你的項(xiàng)目文件被拉下來(lái)了。
那么我們的代碼如何構(gòu)建并且部署呢?因?yàn)槲覀冎霸?Jenkins 的 Docker 鏡像啟動(dòng)的時(shí)候掛載了宿主機(jī)的 Docker 程序,我們現(xiàn)在就可以直接基于微軟的 dotnetcore 鏡像來(lái)構(gòu)建我們的項(xiàng)目。所以,我們先拉取微軟的 dotnetcore 鏡像,運(yùn)行如下命令:
docker pull microsoft/dotnet:latest
拉取鏡像之后,我們來(lái)編寫(xiě)一個(gè) Dockerfile 文件來(lái)讓 Jenkins 來(lái)執(zhí)行 Shell 構(gòu)建。
如果你還不知道如何編寫(xiě) 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"]
然后將這個(gè) Dockerfile 放在你的項(xiàng)目里面,類(lèi)似于這樣:
然后我們?cè)倩氐絼偛?Jenkins 里面,配置剛才項(xiàng)目,新建一個(gè) 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 處于終止?fàn)顟B(tài)的容器,然后判斷有沒(méi)有叫 api_identityserver 的容器在運(yùn)行,如果有就直接停掉,然后清除所有的虛懸鏡像,使用當(dāng)前目錄的 dockerfile 構(gòu)建一個(gè)新的 api_identityserver 鏡像,使用 api_identityserver 鏡像運(yùn)行一個(gè)新的容器。
這兒我安裝了 Jenkins 的一個(gè) Blue Ocean 插件,來(lái)看一下:
運(yùn)行一下:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:WPF自定義TreeView控件樣式實(shí)現(xiàn)QQ聯(lián)系人列表效果
欄 目:C#教程
本文標(biāo)題:如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5197.html
您可能感興趣的文章
- 01-10Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術(shù)實(shí)現(xiàn)去掉按鈕選中時(shí)的邊框效果
- 01-10C#圖片處理3種高級(jí)應(yīng)用
- 01-10C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中
- 01-10C#異步下載文件
- 01-10C# Console利用mspaint打開(kāi)圖像并保存的方法
- 01-10C#利用delegate實(shí)現(xiàn)Javascript的each方法
- 01-10解析C#中的常量及如何在C#編程中定義常量
- 01-10如何使用C#從word文檔中提取圖片


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線(xiàn)程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)