使用Jenkins來發(fā)布和代理.NetCore項目


注:書接上文,上回《【CI/CD系列】使用Docker安裝Jenkins》咱們說到了使用Docker鏡像的方式,來建立Jenkins服務(wù),用來持續(xù)集成和持續(xù)發(fā)布項目,但是上一篇文章有兩個問題:
創(chuàng)建的容器不能操作和使用宿主機(jī)的docker,導(dǎo)致我們無法在Jenkins服務(wù)中去使用docker命令去構(gòu)建asp.netcore項目鏡像。
文章只是重點(diǎn)講解了下如何構(gòu)建和配置Jenkins服務(wù)應(yīng)用,那接下來如何發(fā)布項目和代理項目,沒有具體說明。
所以今天就重點(diǎn)說一下這兩點(diǎn),其實(shí)也是很簡單的,昨天的基本內(nèi)容已經(jīng)三分之二了,今天就是簡單的補(bǔ)充說明一下。

PS:最終的鏡像,我已經(jīng)推送到dockerHub上了,可以自行pull下來,然后按照下文的命令執(zhí)行下即可。

當(dāng)然相關(guān)的視頻版本我會接下來的兩周,配合著我的六個項目遷移的時候進(jìn)一步講解,現(xiàn)在我已經(jīng)在生產(chǎn)環(huán)境構(gòu)建好了,域名就是:
http://jenkins.neters.club
下一步就是把項目遷移了,這樣就能省很多時間,甚至就不需要登錄服務(wù)器操作了。

還是昨天的鏡像文件,只不過這次啟動容器實(shí)例的命令不一樣了,用這個:
docker run -u root --rm -d -p 3001:8080 --name jenkins2 \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-v /home/dockerVolumes2/jenkins_home:/var/jenkins_home \laozhangisphi/dnt-docker-jenkins
第一行表示啟動一個容器名為Jenkins2的對外開放3001端口實(shí)例。
第二行表示將宿主機(jī)上面的docker命令行工具掛載到容器中,使jenkins用戶能夠執(zhí)行docker命令。
第三行表示將宿主機(jī)上的docker.sock掛載到容器中的相應(yīng)位置,使得容器中的dockercli能跟宿主機(jī)的docker通信。
第四行表示掛載我們創(chuàng)建的配置文件存放目錄到指定的文件夾。
啟動好了以后,就可以瀏覽器里正常的訪問{ip}:3001端口了,接下來就是和上篇文章里說的一樣,無腦配置一波就行了。
配置的過程中,如果插件有安裝失敗的,不用擔(dān)心,只要能繼續(xù)我往下走,就沒事,因為后臺管理里,我們可以繼續(xù)安裝的:

這個時候我們可以進(jìn)入到容器里,執(zhí)行命令,可以看到該有的命令都有了:


如果僅僅是查看Jenkins密碼,不用進(jìn)入也可以,直接一句話即可
docker exec jenkins2 cat /var/jenkins_home/secrets/initialAdminPassword是不是很方便。


01、首先還是需要一個實(shí)例項目
在上篇文章中,我們創(chuàng)建了一個空的webapi項目,現(xiàn)在要創(chuàng)建Docker項目了,肯定就需要一個Dockerfile文件了:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS baseWORKDIR /appEXPOSE 80FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS buildWORKDIR /srcCOPY ["HelloWorldPrj/HelloWorldPrj.csproj", "HelloWorldPrj/"]RUN dotnet restore "HelloWorldPrj/HelloWorldPrj.csproj"COPY . .WORKDIR "/src/HelloWorldPrj"RUN dotnet build "HelloWorldPrj.csproj" -c Release -o /app/buildFROM build AS publishRUN dotnet publish "HelloWorldPrj.csproj" -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "HelloWorldPrj.dll"]
這個每個人肯定都能看懂,因為是vs官方給我們創(chuàng)建的,只不過要注意一點(diǎn),注意路徑問題,要放到項目根目錄,也就是和vs同級目錄。

02、配置Jenkins工作任務(wù)
基本的和上篇文章一樣,還是一個自由風(fēng)格的模式,配置Git地址,和構(gòu)建命令。



之所以注釋了,是因為第一次構(gòu)建,宿主機(jī)里不存在容器和鏡像,以后每次修改代碼,都是刪掉容器和鏡像,重新生成。
但是,上邊用的Dockerfile是vs官方給我們默認(rèn)創(chuàng)建的,如果是國內(nèi)的服務(wù)器,構(gòu)建的時候會特別慢,那我們就用第二種方案,先發(fā)布再構(gòu)建鏡像,而不是在構(gòu)建鏡像的過程中發(fā)布,這樣的話構(gòu)建鏡像的時候,可以使用國內(nèi)的一些源鏡像。
首先配置鏡像文件Dockersfile,注意這個是在最終的publish文件夾里,所以我就右鍵屬性,始終復(fù)制了:
FROM swr.cn-south-1.myhuaweicloud.com/mcr/aspnet:3.1-alpineWORKDIR /appCOPY . .EXPOSE 80ENTRYPOINT ["dotnet", "HelloWorldPrj.dll"]
然后編輯我們的Jenkins的構(gòu)建shell命令:
dotnet?restoredotnet?buildcd?HelloWorldPrjdotnet?publish?echo?"Successfully!!!!?^?please?see?the?file?."cd?bin/Debug/netcoreapp3.1/publish/#docker stop helloworldcontainer#docker rm helloworldcontainer#docker?rmi?hello-world-docjekdocker build -t hello-world-docjek .docker?run --name helloworldcontainer -p 5055:80 -d hello-world-docjek
03、點(diǎn)擊構(gòu)建,查看結(jié)果

可以看到我們在Jenkins中,構(gòu)建了一個hello-world-docjek的項目鏡像,然后生成了一個容器實(shí)例。

因為我們的Docker是宿主機(jī)的,可以在宿主機(jī)查看全部容器:

而且用Jenkins是直接將端口映射到公網(wǎng)的,直接訪問{ip}:5055,就可以看到效果了,比如我們剛剛測試的我的http://neters.club:5055/weatherforecast:

04、Nginx做域名匹配和反向代理
剩下的就是很簡單了,簡單的在nginx里配置下就行了,將端口映射到域名下,然后配置下跨域的反向代理,整體的開發(fā)流程就是這么簡單。
以后我們每次修改代碼,就可以直接在Jenkins里構(gòu)建一下,然后就能快速的部署了,是不是很方便。
當(dāng)然,最后還有發(fā)郵件推送消息,編輯觸發(fā)器,視圖管理,docker-compose編排或者其他的知識點(diǎn),等待視頻的時候再說吧。
