asp.net?core?+?jenkins?實(shí)現(xiàn)自動(dòng)化發(fā)布功能
由于部署個(gè)人博客系統(tǒng)的服務(wù)器只有2G內(nèi)存,每次利用jenkins編譯,發(fā)布的時(shí)候jenkins老是掛,因此新買(mǎi)了一臺(tái)輕量應(yīng)用服務(wù)器,專(zhuān)門(mén)用于個(gè)人博客系統(tǒng)的持續(xù)發(fā)布任務(wù),下面講解如何利用jenkins實(shí)現(xiàn)系統(tǒng)的持續(xù)發(fā)布功能。
一、安裝Jenkins
我這邊服務(wù)器是Linux CentOS 7 ,使用SSH 登錄云服務(wù)器后,輸入以下命令安裝jenkins.
sudo wget -O /etc/yum.repos.d/jenkins.repo \ https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key sudo yum upgrade # Add required dependencies for the jenkins package sudo yum install java-11-openjdk sudo yum install jenkins sudo systemctl daemon-reload
systemctl enable jenkins
sudo systemctl start jenkins
安裝成功后,在瀏覽器中輸入服務(wù)器 公網(wǎng)IP地址+8080端口訪(fǎng)問(wèn)
上圖提示你需要從服務(wù)器上的initialAdminPassword文件復(fù)制jenkins的初始登錄密碼進(jìn)行輸入,輸入后點(diǎn)擊繼續(xù)。
然后選擇 安裝Jenkins推薦的插件,然后等待所有推薦插件安裝完成.
安裝完后,創(chuàng)建一個(gè)登錄Jenkins的賬號(hào)
訪(fǎng)問(wèn)地址配置用默認(rèn)的就好(通過(guò)8080端口訪(fǎng)問(wèn))。
二、安裝Gitee插件
這邊以我的個(gè)人博客代碼為例子,因?yàn)槟壳拔业膫€(gè)人博客代碼是托管到碼云上,因此這里利用Gitee插件來(lái)實(shí)現(xiàn)持續(xù)發(fā)布功能.
點(diǎn)擊左側(cè) Dashboard->Manage Jenkins(系統(tǒng)管理) 菜單,并點(diǎn)擊Manage Plugins(插件管理)
選擇可選插件,然后輸入Gitee,然后點(diǎn) Download now and install after restart,
這個(gè)插件主要是用于接收gitee WebHook通知(如:代碼提交、PR等)并觸發(fā)jenkins構(gòu)建、
安裝成功后,前往 Jenkins -> Manage Jenkins(系統(tǒng)管理) -> Configure System(系統(tǒng)配置) -> Gitee Configuration(Gitee配置) ,對(duì)插件進(jìn)行配置。
添加一個(gè)新的證書(shū)令牌,按照如下配置,GiteeAPIV5 私人令牌可以通過(guò)頁(yè)面:https://gitee.com/profile/personal_access_tokens 生成,然后點(diǎn)擊添加。
這個(gè)時(shí)候點(diǎn)擊測(cè)試連接會(huì)發(fā)現(xiàn)報(bào)錯(cuò),無(wú)法連上,https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I4NQAJ 這里面提出了解決方案 , javax.ws.rs-api jar包可以在這里(https://repo1.maven.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1.1/)下載。
,需要注意的是:安裝完相應(yīng)jar包或者Jersey 2 API 插件后后記得重啟jenkins才能生效。
mkdir -p /var/cache/jenkins/war/WEB-INF/lib cd /var/cache/jenkins/war/WEB-INF/lib wget https://repo1.maven.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1.1/javax.ws.rs-api-2.1.1.jar chmod a+x javax.ws.rs-api-2.1.1.jar systemctl restart jenkins
按照以上方法試了后,我這邊還是不行,可能是我那個(gè)流程沒(méi)有操作對(duì)。
然后安裝Jersey 2 API后,重啟jenkins發(fā)現(xiàn)可行(我這邊jenkins版本比較新)
三、服務(wù)器相關(guān)編譯環(huán)境配置
安裝.net core sdk.用于編譯,我這邊用的dotnet版本還是.net core 3.1,輸入以下命令安裝
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-3.1
安裝git
sudo yum install git
四、新建自動(dòng)構(gòu)建任務(wù)
進(jìn)入 Dashboard->新建任務(wù),輸入任務(wù)名稱(chēng),然后選擇流水線(xiàn)。
General配置
配置構(gòu)建觸發(fā)器
配置流水線(xiàn)
點(diǎn)擊Credentials 右下方的添加按鈕,添加用于拉取代碼用的身份驗(yàn)證憑據(jù)。
需要注意的是:如果使用git ssh 協(xié)議(也就是格式為git開(kāi)頭的倉(cāng)儲(chǔ)地址),則添加身份驗(yàn)證憑據(jù)的時(shí)候,憑據(jù)類(lèi)型只支持:Username with password (用戶(hù)名和密碼驗(yàn)證)、SSH Username with private key(用戶(hù)名和私鑰驗(yàn)證),用戶(hù)名就是gitee的登錄賬號(hào)。
創(chuàng)建身份驗(yàn)證憑據(jù)秘鑰前,需要將服務(wù)器登錄用戶(hù)先切換到j(luò)enkins用戶(hù),不然以root用戶(hù)創(chuàng)建的秘鑰文件,將無(wú)法拉取代碼(存在權(quán)限問(wèn)題),切換到j(luò)enkins用戶(hù)前,先執(zhí)行以下命令,以便允許jenkins用戶(hù)登錄。
sudo usermod -s /bin/bash jenkins
切換到j(luò)enkins用戶(hù)
sudo su - jenkins
在服務(wù)器上輸入以下命令創(chuàng)建身份驗(yàn)證憑據(jù)私鑰,-C 后面的參數(shù)可以是任意內(nèi)容,但通常用郵箱賬號(hào)。
ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"
生成后,服務(wù)器上輸入以下命令讀取公鑰內(nèi)容,然后將公鑰內(nèi)容復(fù)制到gitee指定項(xiàng)目的 管理->部署公鑰管理->添加公鑰中添加指定公鑰,
cat ~/.ssh/id_ed25519.pub
gitee上添加公鑰后,在服務(wù)器上執(zhí)行以下命令
ssh -T git@gitee.com
通過(guò)執(zhí)行以下命令讀取ssh身份驗(yàn)證私鑰內(nèi)容,并輸入到 jenkins 身份驗(yàn)證憑據(jù)的以下位置。
cat ~/.ssh/id_ed25519
添加身份驗(yàn)證憑據(jù)后,按照下圖配置。
在jenkins 服務(wù)器上執(zhí)行以下命令,創(chuàng)建ssh 身份認(rèn)證秘鑰,并將公鑰復(fù)制到應(yīng)用服務(wù)器上,以便在編譯成功后,直接復(fù)制dll到應(yīng)用服務(wù)器上,而無(wú)需輸入應(yīng)用服務(wù)的登錄密碼,需要注意的是,創(chuàng)建秘鑰前,先切換到j(luò)enkins用戶(hù)賬號(hào)。
sudo su - jenkins ssh-keygen -t rsa
以下命令表示將jenkins所在服務(wù)器生成的公鑰復(fù)制到應(yīng)用服務(wù)器(因?yàn)閪/.ssh/目錄下已經(jīng)有其他的秘鑰,因此這邊指定復(fù)制哪一個(gè)公鑰)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@115.159.114.65 -p 1200
以上兩個(gè)命令執(zhí)行成功后,可以創(chuàng)建一個(gè)文本文件進(jìn)行測(cè)試,看下是否能無(wú)需輸入密碼就可以復(fù)制文件到應(yīng)用服務(wù)器。
cd ~ touch test.txt echo "測(cè)試內(nèi)容" >> test.txt
以下命令用于將jenkins服務(wù)器上用戶(hù)主目錄下的test.txt文件復(fù)制到應(yīng)用服務(wù)器上用戶(hù)主目錄。
# -P 表示應(yīng)用服務(wù)器的ssh登錄端口(如果不是22,必須指定),-i 后面跟的是jekins服務(wù)器上生成的私鑰文件。 scp -P 1200 -i ~/.ssh/id_rsa ~/test.txt root@115.159.114.65:~
在項(xiàng)目的解決方案文件(.sln)同級(jí)目錄下新建名稱(chēng)為jenkinsfile的文件,并輸入以下腳本內(nèi)容
pipeline { agent any stages { stage('build') { steps { echo '開(kāi)始拉取代碼' sh 'git pull origin dev:dev' echo '切換到本地dev分支' sh 'git checkout dev' echo '當(dāng)前工作目錄及文件列表如下' sh 'pwd' sh 'ls -al' dir("${WORKSPACE}/BlogSys") { echo '開(kāi)始編譯博客前端站點(diǎn)' sh 'dotnet publish ./BlogSys.csproj -c Release -r linux-x64 --no-restore' } //WORKSPACE表示存放代碼的根目錄。 dir("${WORKSPACE}/BlogSysManagement"){ echo '開(kāi)始編譯博客后臺(tái)站點(diǎn)' sh 'dotnet publish ./BlogSysManagement.csproj -c Release -r linux-x64 --no-restore' } } } stage('deploy') { steps { echo '開(kāi)始發(fā)布流程,當(dāng)前工作目錄如下' sh 'pwd' echo '開(kāi)始發(fā)布個(gè)人博客前端系統(tǒng)' echo '停止前端站點(diǎn)' sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl stop blogsys"' //dir函數(shù)里面要用環(huán)境變量記得用雙引號(hào),該函數(shù)用于改變當(dāng)前目錄,dir函數(shù)塊里面包含的所有相對(duì)路徑都是相對(duì)于dir指定的目錄。 dir("${WORKSPACE}/BlogSys/bin/Release/netcoreapp3.1/linux-x64/publish/"){ //-i 用于指定ssh傳輸身份驗(yàn)證私鑰,-r表示復(fù)制目錄下的所有文件及子目錄以及子目錄下的所有文件,也可以將這個(gè)文件夾打包壓縮后再傳輸。 sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@115.159.114.65:/var/www/blogsys' } echo '重啟前端站點(diǎn)' //這里不能使用-t 選項(xiàng),應(yīng)該使用-T 或 -tt 代理,否則無(wú)法正確執(zhí)行。 sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl restart blogsys"' echo '開(kāi)始發(fā)布個(gè)人博客后臺(tái)管理系統(tǒng)' echo '停止后臺(tái)站點(diǎn)' sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -tt "systemctl stop blogsysmgr"' dir("${WORKSPACE}/BlogSysManagement/bin/Release/netcoreapp3.1/linux-x64/publish/"){ sh 'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@115.159.114.65:/var/www/blogsysmgr' } echo '重啟后臺(tái)站點(diǎn)' sh 'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -tt "systemctl restart blogsysmgr"' echo '系統(tǒng)發(fā)布成功' } } } }
完成以上步驟后就可以開(kāi)始測(cè)試構(gòu)建啦.
gitee+jenkins 實(shí)現(xiàn)代碼自動(dòng)發(fā)布流程大概的流程總結(jié)起來(lái)就是:提交代碼到gitee->gitee通過(guò)Webhook鉤子通知jenkins gitee插件->gitee插件觸發(fā)構(gòu)建(Gitee API V5 Token驗(yàn)證)->git插件拉取代碼(通過(guò)SSH Username with Private key身份驗(yàn)證方式)->執(zhí)行編譯腳本->發(fā)布到應(yīng)用服務(wù)器,另外需要注意的是 jenkins 默認(rèn)是以jenkins用戶(hù)來(lái)執(zhí)行的,因此需要開(kāi)通jenkins用戶(hù)能執(zhí)行bash的權(quán)限,以及創(chuàng)建git插件身份驗(yàn)證秘鑰的時(shí)候一定要以jenkins用戶(hù)登錄去創(chuàng)建,否則要拉取代碼的時(shí)候會(huì)出現(xiàn)權(quán)限問(wèn)題。
參考:
https://www.jenkins.io/doc/book/installing/linux/
https://gitee.com/help/articles/4193
https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I4NQAJ
https://gitee.com/oschina/Gitee-Jenkins-Plugin/issues/I27J6U?from=project-issue
https://stackoverflow.com/questions/60184012/jenkins-does-not-show-configured-git-credentials
https://gitee.com/help/articles/4181
https://www.cnblogs.com/zinan/p/14106186.html
https://stackoverflow.com/questions/21434064/how-to-become-a-jenkins-user
https://www.cyberciti.biz/faq/force-ssh-client-to-use-given-private-key-identity-file/
https://unix.stackexchange.com/questions/494483/specifying-an-identityfile-with-ssh
到此這篇關(guān)于asp.net core + jenkins 實(shí)現(xiàn)自動(dòng)化發(fā)布的文章就介紹到這了,更多相關(guān)asp.net core jenkins自動(dòng)化發(fā)布內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GridView高效分頁(yè)和搜索功能的實(shí)現(xiàn)代碼
GridView高效分頁(yè)和搜索功能的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-03-03ng-repeat中Checkbox默認(rèn)選中的方法教程
這篇文章主要給大家介紹了關(guān)于ng-repeat中Checkbox默認(rèn)選中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性
這篇文章主要介紹了asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性的相關(guān)資料,需要的朋友可以參考下2015-06-06asp.net文件上傳解決方案(圖片上傳、單文件上傳、多文件上傳、檢查文件類(lèi)型)
這篇文章主要介紹了asp.net文件上傳解決方案,包括:圖片上傳、單文件上傳、多文件上傳、檢查文件類(lèi)型等案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09ASP.NET Core項(xiàng)目中集成TypeScript
這篇文章介紹了ASP.NET Core項(xiàng)目中集成TypeScript的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07asp.net 每天定點(diǎn)執(zhí)行任務(wù)
下面是每天零點(diǎn)執(zhí)行一個(gè)存儲(chǔ)過(guò)程2009-05-05利用noesis.Javascript開(kāi)源組件.Net中執(zhí)行javascript腳本
利用Noesis.Javascript開(kāi)源組件可以做到在.net中執(zhí)行js腳本,同時(shí)js腳本也能調(diào)用C#函數(shù)。這個(gè)組件的獲得方式:在NuGet中輸入搜索"Noesis"就能找到,我們來(lái)做個(gè)搜索功能:用戶(hù)能夠在textbox中輸入js腳本來(lái)篩選list記錄2013-12-12.NET Core利用skiasharp文字頭像生成方法教程(基于docker發(fā)布)
這篇文章主要給大家介紹了關(guān)于.NET Core利用skiasharp文字頭像生成(基于docker發(fā)布)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Asp.net內(nèi)置對(duì)象之Request對(duì)象(概述及應(yīng)用)
Request對(duì)象主要用于獲取來(lái)自客戶(hù)端的數(shù)據(jù),如用戶(hù)填入表單的數(shù)據(jù)、保存在客戶(hù)端的Cookie等,本文將圍繞Request對(duì)象,講解其的主要作用:讀取窗體變量、讀取查詢(xún)字符串變量、取得Web服務(wù)器端的系統(tǒng)信息。取得客戶(hù)端瀏覽器信息等等,感興趣的朋友可以了解下2013-02-02IIS應(yīng)用池回收造成Application_Start中定時(shí)執(zhí)行程序停止的問(wèn)題的解決方法
最近在做一個(gè)項(xiàng)目,需要在程序中定時(shí)不斷的執(zhí)行某些操作,結(jié)果發(fā)現(xiàn)每天7,8點(diǎn)過(guò)后到第二天9點(diǎn),定時(shí)程序經(jīng)常都沒(méi)有在執(zhí)行,后來(lái)才知道由于IIS的應(yīng)用池回收導(dǎo)致Application停止。2010-03-03