一、安裝Jenkins
我這邊服務器是Linux CentOS 7 ,使用SSH 登錄云服務器后,輸入以下命令安裝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
安裝成功后,在瀏覽器中輸入服務器?公網IP地址+8080端口訪問
上圖提示你需要從服務器上的initialAdminPassword文件復制jenkins的初始登錄密碼進行輸入,輸入后點擊繼續。
然后選擇?安裝Jenkins推薦的插件,然后等待所有推薦插件安裝完成.
安裝完后,創建一個登錄Jenkins的賬號
訪問地址配置用默認的就好(通過8080端口訪問)。
二、安裝Gitee插件
這邊以我的個人博客代碼為例子,因為目前我的個人博客代碼是托管到碼云上,因此這里利用Gitee插件來實現持續發布功能.
點擊左側 Dashboard->Manage Jenkins(系統管理) 菜單,并點擊Manage Plugins(插件管理)
選擇可選插件,然后輸入Gitee,然后點 Download now and install after restart,
這個插件主要是用于接收gitee WebHook通知(如:代碼提交、PR等)并觸發jenkins構建
安裝成功后,前往 Jenkins -> Manage Jenkins(系統管理) -> Configure System(系統配置) -> Gitee Configuration(Gitee配置) ,對插件進行配置。
添加一個新的證書令牌,按照如下配置,GiteeAPIV5 私人令牌可以通過頁面:https://gitee.com/profile/personal_access_tokens 生成,然后點擊添加。
這個時候點擊測試連接會發現報錯,無法連上,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/)下載。
需要注意的是:安裝完相應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.jarchmod a+x javax.ws.rs-api-2.1.1.jar
systemctl restart jenkins
按照以上方法試了后,我這邊還是不行,可能是我那個流程沒有操作對。
然后安裝Jersey 2 API后,重啟jenkins發現可行(我這邊jenkins版本比較新)
三、服務器相關編譯環境配置
-
安裝.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
四、新建自動構建任務
進入 Dashboard->新建任務,輸入任務名稱,然后選擇流水線。
General配置
配置構建觸發器
配置流水線
點擊Credentials 右下方的添加按鈕,添加用于拉取代碼用的身份驗證憑據。
需要注意的是:如果使用git ssh 協議(也就是格式為git開頭的倉儲地址),則添加身份驗證憑據的時候,憑據類型只支持:Username with password (用戶名和密碼驗證)、SSH Username with private key(用戶名和私鑰驗證),用戶名就是gitee的登錄賬號。
創建身份驗證憑據秘鑰前,需要將服務器登錄用戶先切換到jenkins用戶,不然以root用戶創建的秘鑰文件,將無法拉取代碼(存在權限問題),切換到jenkins用戶前,先執行以下命令,以便允許jenkins用戶登錄。
sudo usermod -s /bin/bash jenkins
切換到jenkins用戶
sudo su - jenkins
在服務器上輸入以下命令創建身份驗證憑據私鑰,-C 后面的參數可以是任意內容,但通常用郵箱賬號。
ssh-keygen -t ed25519 -C?"xxxxx@xxxxx.com"
生成后,服務器上輸入以下命令讀取公鑰內容,然后將公鑰內容復制到gitee指定項目的 管理->部署公鑰管理->添加公鑰中添加指定公鑰,
cat ~/.ssh/id_ed25519.pub
gitee上添加公鑰后,在服務器上執行以下命令
ssh -T git@gitee.com
通過執行以下命令讀取ssh身份驗證私鑰內容,并輸入到 jenkins 身份驗證憑據的以下位置。
cat ~/.ssh/id_ed25519
添加身份驗證憑據后,按照下圖配置。
在jenkins 服務器上執行以下命令,創建ssh 身份認證秘鑰,并將公鑰復制到應用服務器上,以便在編譯成功后,直接復制dll到應用服務器上,而無需輸入應用服務的登錄密碼,需要注意的是,創建秘鑰前,先切換到jenkins用戶賬號。
sudo su - jenkins
ssh-keygen -t rsa
以下命令表示將jenkins所在服務器生成的公鑰復制到應用服務器(因為~/.ssh/目錄下已經有其他的秘鑰,因此這邊指定復制哪一個公鑰)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@115.159.114.65?-p?1200
以上兩個命令執行成功后,可以創建一個文本文件進行測試,看下是否能無需輸入密碼就可以復制文件到應用服務器。
cd ~
touch test.txt
echo?"測試內容"?>> test.txt
以下命令用于將jenkins服務器上用戶主目錄下的test.txt文件復制到應用服務器上用戶主目錄。
# -P 表示應用服務器的ssh登錄端口(如果不是22,必須指定),-i 后面跟的是jekins服務器上生成的私鑰文件。
scp -P?1200?-i ~/.ssh/id_rsa ~/test.txt root@115.159.114.65:~
在項目的解決方案文件(.sln)同級目錄下新建名稱為jenkinsfile的文件,并輸入以下腳本內容
pipeline {agent anystages {stage('build') {steps {echo?'開始拉取代碼'sh?'git pull origin dev:dev'echo?'切換到本地dev分支'sh?'git checkout dev'echo?'當前工作目錄及文件列表如下'sh?'pwd'sh?'ls -al'dir("${WORKSPACE}/BlogSys") {echo?'開始編譯博客前端站點'sh?'dotnet publish ./BlogSys.csproj -c Release -r linux-x64 --no-restore'}//WORKSPACE表示存放代碼的根目錄。dir("${WORKSPACE}/BlogSysManagement"){echo?'開始編譯博客后臺站點'sh?'dotnet publish ./BlogSysManagement.csproj -c Release -r linux-x64 --no-restore'}}}stage('deploy'){steps {echo?'開始發布流程,當前工作目錄如下'sh?'pwd'echo?'開始發布個人博客前端系統'echo?'停止前端站點'sh?'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl stop blogsys"'//dir函數里面要用環境變量記得用雙引號,該函數用于改變當前目錄,dir函數塊里面包含的所有相對路徑都是相對于dir指定的目錄。dir("${WORKSPACE}/BlogSys/bin/Release/netcoreapp3.1/linux-x64/publish/"){//-i 用于指定ssh傳輸身份驗證私鑰,-r表示復制目錄下的所有文件及子目錄以及子目錄下的所有文件,也可以將這個文件夾打包壓縮后再傳輸。sh?'scp -P 1200 -i ~/.ssh/id_rsa -r ./ root@115.159.114.65:/var/www/blogsys'}echo?'重啟前端站點'//這里不能使用-t 選項,應該使用-T 或 -tt 代理,否則無法正確執行。sh?'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -T "systemctl restart blogsys"'echo?'開始發布個人博客后臺管理系統'echo?'停止后臺站點'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?'重啟后臺站點'sh?'ssh -i ~/.ssh/id_rsa root@115.159.114.65 -p 1200 -tt "systemctl restart blogsysmgr"'echo?'系統發布成功'}}}
}
完成以上步驟后就可以開始測試構建啦.
gitee+jenkins 實現代碼自動發布流程大概的流程
總結起來就是:
1、提交代碼到gitee
2、gitee通過Webhook鉤子通知jenkins gitee插件
3、gitee插件觸發構建(Gitee API V5 Token驗證)
4、git插件拉取代碼(通過SSH Username with Private key身份驗證方式)
5、執行編譯腳本
6、發布到應用服務器,另外需要注意的是 jenkins 默認是以jenkins用戶來執行的,因此需要開通jenkins用戶能執行bash的權限,以及創建git插件身份驗證秘鑰的時候一定要以jenkins用戶登錄去創建,否則要拉取代碼的時候會出現權限問題。