Jenkins使用pipeline部署服務到遠程服務器
寫這篇文章是對之前搭建Jenkins做的修改和完善,讓jenkins更好的為我們服務
Docker搭建Jenkins服務
使用過程中遇到的問題:
為方便部署,打算將jenkins用到的jdk11、maven、gradle工具下載下來(方便以後部署使用),然後掛載到jenkins容器內部
在使用maven打包服務過程中,發現每次構建都要重新下載maven依賴,耗時間耗內存,將jenkins容器內的maven倉庫做持久化存儲
docker部署jenkins一般是使用jenkins/jenkins:lts-jdk11穩定版鏡像,如出現插件下載失敗,版本太老,可將容器內jenkins.war替換成最新版
容器時間和宿主機時間同步
docker啟動容器限制內存策略。如果不限制會把內存都吃掉。
jenkins構建項目的數據持久化存儲
最終的docker搭建jenkins腳本就變成:
docker run --name jenkins -p 8081:8080 -p 50000:50000 \ -u root --privileged=true -m 1G --memory-swap=3G \ -v /home/docker/server/jenkins/data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ -v /home/docker/server/jenkins/m2:/root/.m2 \ -v /home/docker/server/jenkins/gradle:/root/.gradle \ -v /home/docker/server/jenkins/pack/apache-maven-3.5.4:/usr/local/maven \ -v /home/docker/server/jenkins/pack/gradle6.4:/usr/local/gradle \ -v /home/docker/server/jenkins/pack/jdk1.8.0_171:/usr/local/jdk \ -v /home/docker/server/jenkins/pack/jdk-11.0.9:/usr/local/jdk11 \ -v /etc/localtime:/etc/localtime \ -d jenkins/jenkins:lts-jdk11
然後訪問jenkins,安裝插件:
Locale 漢化插件(如漢化不完全,下載此插件)
Maven Integration 構建maven項目插件
Publish over SSH 使用ssh免密登錄到目標服務器
Deploy to container 用於部署war程序到tomcat中
git parameter 選擇指定分支進行構建的功能
pipeline 流水線腳本
Pipeline Stage View Plugin 構建過程圖示
配置jdk、maven、gradle環境變量
配置應用服務器地址及賬號:
系統管理——>系統配置——> Publish over SSH
Pipeline腳本部署服務到遠程服務器
新建流水線任務
進入任務配置—參數配置—git參數,選擇代碼分支
流水線語法—選擇sshPublisher: Send build artifacts over SSH
點擊生成流水線腳本,複製到任務的流水線腳本中
流水線腳本以及生成流水線語法的入口,有其他需求也可以用它生成
完整的流水線腳本如下:
#!/usr/bin/env groovy def desc_ip = "10.249.29.22" def desc_path = "/server/temp" def app_name = "ll-heat" def app_file = "${app_name}-0.0.1-SNAPSHOT.jar" def install_path = "/server/${app_name}" def target_path = "target/" def target_file = "target/${app_file}" def log_file = "${app_name}.log" def git_address = "//git.ecashback.com.cn/zhenhongxue/ll-heat.git" def git_auth = "fe896e04-3743-4931-83f8-32d716461388" def JAVA_OPTS = "-Xms128m -Xmx256m -Xmn64m -Dfile.encoding=UTF8 -Dspring.profiles.active=test" pipeline { agent any stages { stage('拉取代碼') { steps { checkout([$class: 'GitSCM', branches: [[name: '${branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } } stage('代碼編譯') { steps { sh """ pwd JAVA_HOME=/usr/local/jdk PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH mvn clean package -Dmaven.test.skip=true """ } } stage('遠程啟動服務') { steps { sshPublisher(publishers: [sshPublisherDesc(configName: "${desc_ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """ cd ${install_path} pwd ps -ef | grep ll-heat-0.0.1-SNAPSHOT.jar | grep -v grep |awk '{print \$2}' |xargs kill -9 mv ${desc_path}/${app_file} ./ java -jar ${JAVA_OPTS} ${app_file} >${log_file} & """, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${desc_path}", remoteDirectorySDF: false, removePrefix: "${target_path}", sourceFiles: "${target_file}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) } } } }
pipeline腳本需要注意:變量的使用需要加${},如果是在pipeline語法中生成的語句,變量的使用需要加雙引號”${}”
腳本寫完後會提示哪裡有錯誤需要怎麼改,要注意特殊字符需要轉義處理,如'{print \$2}’需要轉義
構建過程中遇到的錯誤:
1、SSH出錯:IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:uLW/iHik7jxKZ6IRgRV7pfWAKuBgZGxInXba1aSb8hA. Please contact your system administrator. Add correct host key in /home/docker/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/docker/.ssh/known_hosts:3 ECDSA host key for 192.168.1.22 has changed and you have requested strict checking. Host key verification failed.
原因:控制端保存的被控制端秘鑰改變,導致SSH錯誤
解決方案:需要刪除控制端保存的秘鑰,然後重新SSH登錄
cat ~/.ssh/know_hosts
刪除文件中對應的主機和秘鑰記錄
ssh 192.168.1.22
輸入密碼就可以了
2、publish over ssh傳輸文件數為0
SSH: Connecting from host [test-22]
SSH: Connecting with configuration [test-22] ...
SSH: Disconnecting configuration [test-22] ...
SSH: Transferred 0 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
Finished: SUCCESS
原因:源文件的位置沒寫對
解決:可以在構建日誌里看到jenkins運行的位置和jar包位置
因為jenkins運行位置是/var/jenkins_home/workspaces/ll-heat,所以源文件jar包的位置應該寫target/ll-heat-0.0.1-SNAPSHOP.jar