asp.net core + jenkins 實現自動化釋出

chenxin.dm發表於2022-04-11

 

由於部署個人部落格系統的伺服器只有2G記憶體,每次利用jenkins編譯,釋出的時候jenkins老是掛,因此新買了一臺輕量應用伺服器,專門用於個人部落格系統的持續釋出任務,下面講解如何利用jenkins實現系統的持續釋出功能。

一、安裝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埠訪問

asp.net core + jenkins 實現自動化釋出

上圖提示你需要從伺服器上的initialAdminPassword檔案複製jenkins的初始登入密碼進行輸入,輸入後點選繼續。

然後選擇 安裝Jenkins推薦的外掛,然後等待所有推薦外掛安裝完成.

asp.net core + jenkins 實現自動化釋出

安裝完後,建立一個登入Jenkins的賬號

asp.net core + jenkins 實現自動化釋出

訪問地址配置用預設的就好(通過8080埠訪問)。

asp.net core + jenkins 實現自動化釋出

 

二、安裝Gitee外掛

這邊以我的個人部落格程式碼為例子,因為目前我的個人部落格程式碼是託管到碼雲上,因此這裡利用Gitee外掛來實現持續釋出功能.

點選左側 Dashboard->Manage Jenkins(系統管理) 選單,並點選Manage Plugins(外掛管理)

asp.net core + jenkins 實現自動化釋出

 

選擇可選外掛,然後輸入Gitee,然後點 Download now and install after restart,

這個外掛主要是用於接收gitee WebHook通知(如:程式碼提交、PR等)並觸發jenkins構建、

asp.net core + jenkins 實現自動化釋出

 

 

安裝成功後,前往 Jenkins -> Manage Jenkins(系統管理) -> Configure System(系統配置) -> Gitee Configuration(Gitee配置) ,對外掛進行配置。

 

新增一個新的證照令牌,按照如下配置,GiteeAPIV5 私人令牌可以通過頁面:https://gitee.com/profile/personal_access_tokens 生成,然後點選新增。

asp.net core + jenkins 實現自動化釋出

這個時候點選測試連線會發現報錯,無法連上,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.jar
 chmod a+x javax.ws.rs-api-2.1.1.jar
systemctl restart jenkins

按照以上方法試了後,我這邊還是不行,可能是我那個流程沒有操作對。

然後安裝Jersey 2 API後,重啟jenkins發現可行(我這邊jenkins版本比較新)

asp.net core + jenkins 實現自動化釋出asp.net core + 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->新建任務,輸入任務名稱,然後選擇流水線。

asp.net core + jenkins 實現自動化釋出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

General配置

asp.net core + jenkins 實現自動化釋出

配置構建觸發器

asp.net core + jenkins 實現自動化釋出

 

asp.net core + jenkins 實現自動化釋出

 

配置流水線

點選Credentials 右下方的新增按鈕,新增用於拉取程式碼用的身份驗證憑據。

需要注意的是:如果使用git ssh 協議(也就是格式為git開頭的倉儲地址),則新增身份驗證憑據的時候,憑據型別只支援:Username with password (使用者名稱和密碼驗證)、SSH Username with private key(使用者名稱和私鑰驗證),使用者名稱就是gitee的登入賬號。

asp.net core + jenkins 實現自動化釋出

建立身份驗證憑據祕鑰前,需要將伺服器登入使用者先切換到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

asp.net core + jenkins 實現自動化釋出

 

gitee上新增公鑰後,在伺服器上執行以下命令

ssh -T git@gitee.com

通過執行以下命令讀取ssh身份驗證私鑰內容,並輸入到 jenkins 身份驗證憑據的以下位置。

cat ~/.ssh/id_ed25519

asp.net core + jenkins 實現自動化釋出

新增身份驗證憑據後,按照下圖配置。

asp.net core + jenkins 實現自動化釋出

 

在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 any
    stages {
        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 '系統釋出成功'
            }
        }
    }
}

 

完成以上步驟後就可以開始測試構建啦.

asp.net core + jenkins 實現自動化釋出

 

gitee+jenkins 實現程式碼自動釋出流程大概的流程總結起來就是:提交程式碼到gitee->gitee通過Webhook鉤子通知jenkins gitee外掛->gitee外掛觸發構建(Gitee API V5 Token驗證)->git外掛拉取程式碼(通過SSH Username with Private key身份驗證方式)->執行編譯指令碼->釋出到應用伺服器,另外需要注意的是 jenkins 預設是以jenkins使用者來執行的,因此需要開通jenkins使用者能執行bash的許可權,以及建立git外掛身份驗證祕鑰的時候一定要以jenkins使用者登入去建立,否則要拉取程式碼的時候會出現許可權問題。

 

參考:

https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos

https://gitee.com/help/articles/4193#article-header2

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://stackoverflow.com/questions/7114990/pseudo-terminal-will-not-be-allocated-because-stdin-is-not-a-terminal

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

相關文章