需要宣告的一點是,此處實現的專案自動構建原理是 Github+Jenkins 的 webhook,因此得保證 github 能存取 到 jenkins,需要一臺具有公網ip的伺服器用於部署jenkins,或配合nps/fpr作為內網穿透的代理。
用於測試的專案是周志明老師的「鳳凰書城」,詳情參考—— https://github.com/fenixsoft/microservice_arch_springcloud 需要把該專案 fork 到自己的倉庫。
jenkins關聯github
在github 個人資訊 --> Settings --> Developer Settings --> Personal access tokens --> Tokens(calssic) --> Generate new token 生成token。生成前勾選"repo"和"admin:repo_hook"的許可權。儲存token備用。
進入 github 剛剛 fork 的"鳳凰書城"專案 --> Settings --> Webhooks --> Add Webhook --> 輸入剛剛部署 jenkins 的伺服器的IP + /github-webhook/
例如: "http://123.123.123.123:8080/github-webhook/" jenkins的github外掛會在該介面上監聽。一定要留意,不能忽略url後面的斜槓"/",如果沒有這個斜槓,jenkins會回302
參考——jenkins - Github Webhook 與 Jenkins 返回 302 Found
系統管理 --> 系統設定 --> GitHub --> 新增Github伺服器(URL填"https://api.github.com")
憑證 Credentials 點選新增,型別選擇 Secret Text,把github生成的token填入儲存。
點選新增按鈕後,下拉選擇憑證,選擇剛才新增的憑證,然後點選連線測試按鈕,此處還需要把「管理Hook」勾選上
新增「多分支流水線」任務,該種型別的任務對後續的操作更方便。
選擇「GitHub專案」,填寫專案地址
設定「構建觸發器」,選擇"Github hook trigger for GITSCM polling"
設定流水線資訊
1、選擇流水線型別「Pipeline script from SCM」,
設定SCM資訊,即設定github專案路徑、設定github的憑證、指定要構建的專案分支
2、指定Jenkins流水線指令碼的路徑,此處"Jenkinsfile"表示專案根目錄下的"Jenkinsfile"檔案
1、把 fork 的專案程式碼 clone 到本地,使用 Idea 開啟,在專案根目錄新建名為"Jenkinsfile" 的 jenkins 流水線指令碼檔案,內容可參考下文——
pipeline {
agent any
environment {
WS = "$WORKSPACE"
}
//定義流水線的加工流程
stages {
stage('1.環境檢查'){
steps {
sh 'printenv'
sh 'id'
sh 'docker version'
sh 'java -version'
sh 'git --version'
sh 'mvn -v'
sh 'pwd && ls -alh'
}
}
stage('2.專案編譯'){
steps {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('3.應用部署'){
steps {
sh 'docker-compose -f docker-compose.dev.yml -p fenix up -d'
}
}
}
}
2、編輯好Jenkinsfile檔案後,把專案 push 到 github,即可在專案中的Settings --> Webhooks --> Recent Deliveries 看到 github 觸發的deleveries
點選對應的delivery即可檢視詳細的請求資訊,如果想做測試,可以點選"Redeliver"按鈕
開啟Jenkins,即可看到構建歷史
存取對應的IP+埠即可看到計畫頁面
在操作過程中,可能會遇到github webhook請求不成功,構建不觸發等問題,需要針對不同情況做不同處理
1、Github webhook 不生效,提示403 No valid crumb was included in the request,因為被 jenkins 跨域攔截了,解決方法——
使用systemctl edit開啟jenkins的服務設定,新增啟動引數
sudo systemctl edit jenkins
新增如下內容
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
重啟服務
sudo systemctl restart jenkins
詳情參考——Ubuntu Jenkins升級2.346.3後遠端呼叫403解決方案(HTTP ERROR 403 No valid crumb was included in the request)
2、github webhook 提示 403 Authentication required
git使用webhook觸發Jenkins構建問題Error 403 No valid crumb was included in the reques和Authentication required
在Jenkins全域性安全設定 --> 授權策略 --> 登入使用者可以做任何事下,勾選"匿名使用者具有可讀許可權"即可解決。注意,該方法只用於臨時的測試,有安全風險。
3、github請求jenkins成功,但專案不自動構建。這裡有個問題需要注意,對於pipeline型別的job,要在設定job時取消勾選"輕量級檢出"("lightweight checkout"),並且要手動構建一次,後續才會觸發自動構建。參考——Jenkins not triggering pipeline build on successful github webhook