Maven
Maven是一個專案管理和綜合工具。Maven提供給開發人員構建一個完整的生命週期框架。
開發團隊可以自動完成該專案的基礎設施建設,Maven使用標準的目錄結構和預設構建生命週期。
Apache的開源專案主要服務於JAVA平臺的構建、依賴管理、專案管理。
Project Object Model,專案物件模型。通過xml格式儲存的pom.xml檔案。該檔案用於管理:原始碼、配置檔案、開發者的資訊和角色、問題追蹤系統、組織資訊、專案授權、專案的url、專案的依賴關係等等。該檔案是由開發維護,我們運維人員可以不用去關心。
安裝到jenkins伺服器
-
下載Maven 3安裝包
官網:http://maven.apache.org/download.cgi
清華映象:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/
-
安裝Maven
tar xf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/maven
# 加入環境變數
echo "PATH=\$PATH:/usr/local/maven/bin" >> /etc/profile
. /etc/profile
# 檢視版本號
mvn -v
-
上傳一個簡單的java專案包hello-world.tar.gz並進行解壓
tar xf hello-world-war.tar.gz
# 進入目錄
cd hello-world-war
# 打包, 預設會去maven的中央倉庫去下載需要的依賴包和外掛到.m2目錄下
mvn package
# 跳過測試用例打包
mvn package -Dmaven.test.skip=true
打包流程命令
validate(驗證): 驗證專案正確,並且所有必要資訊可用。compile(編譯): 編譯專案原始碼
test(測試): 使用合適的單元測試框架測試編譯後的原始碼。
package(打包): 原始碼編譯之後,使用合適的格式(例如JAR格式)對編譯後的原始碼進行打包。integration-test(整合測試): 如果有需要,把包處理並部署到可以執行整合測試的環境中去。verify(驗證): 進行各種測試來驗證包是否有效並且符合質量標準。
install(安裝): 把包安裝到本地倉庫,使該包可以作為其他本地專案的依賴。
deploy(部署): 在整合或釋出環境中完成,將最終軟體包複製到遠端儲存庫,以與其他開發人員和專案共享。
clean (清除) : 清除上次編譯的結果
-
建立Maven私服nexus
① 安裝Java
方式一: 安裝rpm包
rpm -ivh jdk-8u181-linux-x64.rpm
方式二: 直接yum安裝java
yum -y install java
安裝完JDK測試
[root@jenkins ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
注意統一Java版本
②
③ 解壓,移動,配置,啟動,開機自啟動
tar xf nexus-3.13.0-01-unix.tar.gz
mv nexus-3.13.0-01 /usr/local/nexus
echo "PATH=\$PATH:/usr/local/nexus/bin" >> /etc/profile
. /etc/profile
nexus start
echo /usr/local/nexus/bin/nexus start >> /etc/rc.local && chmod +x /etc/rc.d/rc.local
④
使用者名稱: admin 密碼: admin123
修改源為阿里雲源-->頁面最下放 儲存(Save)
http://maven.aliyun.com/nexus/content/groups/public
-
配置Maven倉庫使用nexus源
① 在專案下的pom.xml配置,只在當前的專案生效
# 在指定標籤下插入配置項 # <servers> 標籤,新增 Nexus 預設認證資訊 # <mirrors> 標籤,新增映象 # <profiles> 標籤,新增倉庫資訊 # <settings></settings>標籤中, 新增 <activeProfiles> 標籤,啟用倉庫 vim /usr/local/maven/conf/settings.xml ... ... <servers> ... ... <server> <id>my-nexus-releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>my-nexus-snapshot</id> <username>admin</username> <password>admin123</password> </server> ... ... </servers> ... ... <mirrors> ... ... <mirror> <!--This sends everything else to /public --> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public/</url> </mirror> ... ... </mirrors> ... ... <profiles> ... ... <profile> <id>nexus</id> <!--Enable snapshots for the built in central repo to direct --> <!--all requests to nexus via the mirror --> <repositories> <repository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> ... ... <profiles> <activeProfiles> <!--make the profile active all the time --> <activeProfile>nexus</activeProfile> </activeProfiles> ... ...
gitlab建立一個maven倉庫
-
git伺服器上傳java專案到maven倉庫
tar xf hello-world-war.tar.gz
# 進入目錄
cd hello-world-war
git init
git remote add maven git@10.0.0.200:oldboy/maven.git
git add .
git commit -m "Initial commit"
git push -u maven master
-
Jenkins配置Maven整合
Jenkins新建maven專案
Post Steps --> add post-build step --> Execute shell --> 命令 --> 儲存
遠端推送war包
命令根據tomcat安裝方式不同路徑有所區別(見下文)
方法一
方法二
-
部署tomcat到web伺服器
方法一 提前準備的包 rz apache-tomcat-8.0.27.tar.gz tar zvxf apache-tomcat-8.0.27.tar.gz mv apache-tomcat-8.0.27 /usr/local/tomcat # tomcat啟動加速的方法 sed -i '117c securerandom.source=file:/dev/urandom' /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security /usr/local/tomcat/bin/startup.sh 遠端推送war包 ssh root@10.0.0.7 'rm -rf /usr/local/tomcat/webapps/*' scp -rp target/*.war 10.0.0.7:/usr/local/tomcat/webapps/ROOT.war 方法二 yum yum -y install tomcat # tomcat啟動加速的方法 sed -i '117c securerandom.source=file:/dev/urandom' /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/lib/security/java.security systemctl start tomcat systemctl enable tomcat 遠端推送war包 ssh root@10.0.0.7 'rm -rf /usr/share/tomcat/webapps/*' scp -rp target/*.war 10.0.0.7:/usr/share/tomcat/webapps/ROOT.war
-
執行構建-->瀏覽器訪問 http://10.0.0.7:8080/
-
配置maven專案引數化釋出和回滾
② 配置根據版本號進行拉取程式碼
③ 配置執行指令碼 --> 儲存
sh /server/scripts/maven.sh
[root@jenkins ~]# vi /server/scripts/maven.sh #!/bin/sh DATE="v$BUILD_NUMBER.0" CODE_DIR="$WORKSPACE" # tomcat方法一安裝 #WEB_DIR="/usr/local/tomcat/webapps" #ln_java(){ # ssh root@10.0.0.7 "cd $WEB_DIR && rm -rf ROOT ROOT.war && ln -s java-${git_version} ROOT.war && /usr/local/tomcat/bin/shutdown.sh
&& /usr/local/tomcat/bin/startup.sh" #} # tomcat方法二安裝 WEB_DIR="/usr/share/tomcat/webapps" ln_java(){ ssh root@10.0.0.7 "cd $WEB_DIR && rm -rf ROOT ROOT.war && ln -s java-${git_version} ROOT.war && systemctl restart tomcat" } scp_code(){ scp target/*.war 10.0.0.7:$WEB_DIR/java-${git_version} } main(){ scp_code ln_java } if [ "$deploy_env" == "deploy" ];then if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then echo "該 $git_version 版本號已部署, 不用重複部署" else main fi elif [ "$deploy_env" == "rollback" ];then ln_java fi
⑤ 提交三個tag版本v1.0和v2.0和v3.0
[root@git ~]# cd hello-world-war/ [root@git hello-world-war]# git tag -a v1.0 -m "v1.0" [root@git hello-world-war]# git push -u maven v1.0 [root@git hello-world-war]# vim src/main/webapp/index.jsp [root@git hello-world-war]# git commit -am "modified index.jsp" [root@git hello-world-war]# git push -u maven master [root@git hello-world-war]# git push -u maven master v2.0 [root@git hello-world-war]# vim src/main/webapp/index.jsp [root@git hello-world-war]# git commit -am "modified index.jsp" [root@git hello-world-war]# git tag -a v3.0 -m "v3.0" [root@git hello-world-war]# git push -u maven master v3.0
⑥ 執行引數化構建--> 瀏覽器訪問 http://10.0.0.7:8080/ 驗證
擴充套件重Java專案
# 為jeesns專案準備好資料庫jeesns,設定資料庫root使用者密碼為root yum installl mariadb-server -y mysql_secure_installation mysqladmin -uroot password 'root' mysql -uroot -proot -e 'create database jeesns;' yum install sshpass -y sshpass -p123456 scp /opt/jeesns/jeesns-web/database/jeesns.sql root@10.0.0.12:/tmp sshpass -p123456 ssh root@10.0.0.12 'mysql -uroot -proot jeesns </tmp/jeesns.sql'
提交兩個tag版本v1.0和v2.0
vim jeesns-web/src/main/webapp/WEB-INF/templates/front/index.ftl # 修改推薦閱讀 為推薦閱讀v1.0
程式碼質量檢測SonarQube
-
SonarQube基於java開發,需安裝open JDK8版本
-
SonarQube需要依賴MySQL資料庫,至少5.6版本以上
-
SonarQube的小型例項至少4G記憶體,如果大型例項需要16G記憶體
安裝依賴軟體
yum -y install git java unzip wget
安裝資料庫
安裝資料庫yum源
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 安裝MySQL5.6 yum -y --enablerepo=mysql56-community --disablerepo=mysql80-community install mysql-community-server 啟動mysql systemctl start mysqld systemctl enable mysqld 如果埠監聽到tcp6 netstat -tulnp 方法一: 修改配置檔案並重啟mysql sed -i "/\[mysqld\]/a bind-address=0.0.0.0" /etc/my.cnf systemctl restart mysqld 方法二: 關閉系統的tcp6並載入 cat >> /etc/sysctl.conf <<EOF net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 EOF sysctl -p 配置資料庫密碼 mysqladmin -uroot passwd 123 建立sonar庫 mysql -uroot -p123 -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;" mysql -u root -p123 -e "show databases;" 安裝SonarQube 下載sonar 社群版本 wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.5.1.38104.zip 或上傳 rz sonarqube-7.0.zip 解壓,移動,建立sonar使用者並授權 unzip sonarqube-7.0.zip -d /usr/local/ mv /usr/local/sonarqube-7.0 /usr/local/sonarqube useradd sonar chown -R sonar.sonar /usr/local/sonarqube/ 配置sonar連線本地資料庫(去掉三條註釋) vim /usr/local/sonarqube/conf/sonar.properties sonar.jdbc.username=root sonar.jdbc.password=123 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewrieBatchedStatements=true&useConfigs=maxPerformance&useSSL=false 使用普通使用者sonar啟動sonarqube su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start" 加入開機自啟動 echo su - sonar -c \"/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start\" >> /etc/rc.local && chmod +x /etc/rc.d/rc.local
瀏覽器訪問http://10.0.0.203:9000/about
選擇配置, 設定專案名稱
客戶端推送操作
sonar-scanner \ -Dsonar.projectKey=a \ -Dsonar.sources=. \ -Dsonar.host.url=http://10.0.0.203:9000 \ -Dsonar.login=eadcae17c5dc28b26a1e7612e37593a8ff21a669
安裝外掛
-
安裝中文漢化外掛
在頁面標題的配置(Quality Gates) --> 應用市場 --> 搜尋框輸入chinese
檢出 chinese pack 外掛,然後點選右側 安裝(install),安裝完點選 重啟(restart) 生效
如果一個專案使用了JAVA CSS JS HTML,預設情況下sonar只會檢測JAVA JS等程式碼的漏洞和bug。
-
手動安裝外掛
移除原有外掛目錄 -->上傳並解壓已有外掛目錄備份包到原有外掛目錄 --> 授權使用者sonar--> 以sonar使用者過載sonar
mv /usr/local/sonarqube/extensions/plugins /usr/local/sonarqube/extensions/plugins_back rz -bye sonar_plugins.tar.gz tar xf sonar_plugins.tar.gz -C /usr/local/sonarqube/extensions chown sonar.sonar -R /usr/local/sonarqube/extensions/plugins su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"
下載客戶端
jenkins伺服器推送html程式碼至SonarQube檢測
SonarScanner 4.0 https://docs.sonarqube.org/7.9/analysis/scan/sonarscanner/
右鍵複製連結在jenkins伺服器
下載客戶端,解壓,移動,配置
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip unzip sonar-scanner-cli-4.2.0.1873-linux.zip mv sonar-scanner-4.2.0.1873-linux /usr/local/sonar-scanner cat > /usr/local/sonar-scanner/conf/sonar-scanner.properties <<EOF #Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here #----- Default SonarQube server sonar.host.url=http://10.0.0.203:9000 sonar.login=eadcae17c5dc28b26a1e7612e37593a8ff21a669 #----- Default source code encoding sonar.sourceEncoding=UTF-8 EOF
命令列程式碼推送
-
sonar Web
配置--> 許可權 -->開啟認證--> 儲存
進入專案目錄-->推送程式碼
cd /var/lib/jenkins/workspace/freestyle_job /usr/local/sonar-scanner/bin/sonar-scanner \ -Dsonar.projectKey=html \ -Dsonar.sources=.
echo "PATH=\$PATH:/usr/local/sonar-scanner/bin" >> /etc/profile . /etc/profile
頁面檢視
方法1 使用sonar-scanner推送
cd /var/lib/jenkins/workspace/maven-job sonar-scanner \ -Dsonar.projectKey=java \ -Dsonar.sources=.
方法2 使用推送
cd /var/lib/jenkins/workspace/maven-job mvn sonar:sonar \ -Dsonar.host.url=http://10.0.0.203:9000 \ -Dsonar.login=eadcae17c5dc28b26a1e7612e37593a8ff21a669
整合sonar
將sonar整合到jenkins中,在測試環境自動釋出前先推送到sonar進行檢測
1)jenkins安裝外掛
jenkins需要安裝SonarQube Scanner外掛,前面手動安裝外掛包中已下載
2)jenkins配置SonarQube服務端
主頁-->系統管理(Manage Jenkins)-->系統設定(Configure System)-->SonarQube servers
填寫 --> secret text --> 之前安裝SonarQube的Token --> ID --> 描述 --> 新增
3) jenkins配置執行sonar-scanner命令的家目錄,讓jenkins能找到該命令
主頁-->系統管理(Manage Jenkins)-->全域性工具配置(Global Tool Configuration)-->SonarQube Scanner-->去掉自動安裝的勾-->填寫Name和手動安裝sonar客戶端的路徑-->儲存
4) jenkins使用自動構建指令碼
[root@jenkins ~]# vi /server/scripts/deploy_rollback.sh #!/bin/sh DATE=$(date +%Y-%m-%d-%H-%M-%S) CODE_DIR="$WORKSPACE" WEB_DIR="/usr/share/nginx/" tar_code(){ cd $CODE_DIR && tar zcf /opt/web-$DATE.tar.gz ./* } scp_code_to_web(){ scp /opt/web-$DATE.tar.gz 10.0.0.7:$WEB_DIR } tarxf_code(){ ssh 10.0.0.7 "cd $WEB_DIR && mkdir web-$DATE && tar xf web-$DATE.tar.gz -C web-$DATE ; rm -f web-$DATE.tar.gz" } ln_html(){ ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s web-$DATE html" } main(){ tar_code; scp_code_to_web; tarxf_code; ln_html; } main
5) jenkins專案配置中增加構建項sonar
按住滑鼠左鍵上下拖動調換兩個Execute的位置
Analysis properties --> 儲存
# 專案在sonarqube上的顯示名稱
# 專案的唯一標識ID,不能重複
# 專案的原始碼的位置,.表示當前目錄
sonar.projectName=${JOB_NAME}
sonar.projectKey=html
sonar.sources=.
執行構建--> 在SonarQube中檢視結果
6) jenkins配置java專案
方法1 使用sonar客戶端推送
增加構建項sonar --> Analysis properties 設定 --> 儲存
sonar.projectName=${JOB_NAME} sonar.projectKey=java sonar.sources=.
注意: 如果需要class路徑, 請新增引數
sonar.java.binaries
sonar.java.binaries=jeesns-service/target/sonar
方法2 使用maven推送
clean verify sonar:sonar -Dsonar.host.url=http://10.0.0.203:9000 -Dsonar.login=eadcae17c5dc28b26a1e7612e37593a8ff21a669
Jenkins整合釘釘
專案釋出結果通過釘釘的方式傳送給運維人員
釘釘目前系統已關閉自定義功能,所以目前暫時無法使用狀態,使用微信方式
-
實現簡單
-
時時提醒
-
便於檢視
-
郵件配置複雜
-
郵件容易被當做垃圾郵件被拒收 1) 建立群組 2) 新增機器人電腦端選擇群設定->群智慧助手->新增更多->自定義通過webhook接入自定義服務
Jenkins整合微信
git有新程式碼提交時會觸發鉤子自動完成上線,運維和開發人員不用時刻盯著jenkins,通過微信的方式給運維和開發人員傳送結果。
-
註冊微信企業公眾號 搜尋
應用管理->建立應用
上傳圖片-->填寫應用名稱-->可見範圍-->建立應用
儲存好
AgentId 1000002
Secret vccwlcoLvyzjIKIGmOTtIuvdPP7C8BsyubFWrcU7fhA
賬戶 LiZhenYa
我的企業--> 企業ID wwdda5a3fe8e107a73
後面要寫入py指令碼
-
jenkins伺服器使用指令碼
cd /server/scripts/ rz jenkins_notify.py 更改py指令碼內對應的內容 vim jenkins_notify.py ... ... "touser" : "LiZhenYa", ... ... "agentid" : 1000002, ... ... Corpid = "wwdda5a3fe8e107a73" Secret = "vccwlcoLvyzjIKIGmOTtIuvdPP7C8BsyubFWrcU7fhA" ... ...
之前沒記住, 可以看下圖去找
-
jenkins安裝外掛
由於jenkins沒有官網的外掛來完成此功能,所以我們只能用網路上一些開源的外掛(前面手動安裝外掛包中已下載)
wget https://github.com/daniel-beck/changelog-environment-plugin cd changelog-environment-plugin-master mvn verify 執行完成 當前目錄下生成檔案 target/changelog-environment.hpi,上傳到jenkins即可使用
-
jenkins配置
jenkins專案配置-->構建環境-->勾選 Add Changelog Information to Environment
Entry Format
ChangeLog內容,時間,提交人
%3$s(at %4$s via %1$s)
Date Format
時間格式
yyyy-MM-dd HH:mm:ss
構建後操作-->增加構建後操作步驟-->Post build task
jenkins伺服器安裝python requests模組
yum -y install python-pip pip2.7 install requests -i https://pypi.mirrors.ustc.edu.cn/simple/ Script echo "==========Start Notify==============" echo ${SCM_CHANGELOG} > /tmp/${JOB_NAME}_change.log python /server/scripts/jenkins_notify.py ${BUILD_URL} /tmp/${JOB_NAME}_change.log ${JOB_NAME} rm -fv /tmp/${JOB_NAME}_change.log
執行構建--> 在企業微信檢視結果
Jenkins Pipeline
CI 持續整合
持續整合(Continuous Integration)是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,通過每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。
比如(你裝潢修廚房,其中一項是鋪地磚,邊角地磚要切割大小。如果一次全切割完再鋪上去,發現尺寸有誤的話,浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續整合。)
CD 持續部署
持續部署(Continuous Deployment)是通過自動化的構建、測試和部署迴圈來快速交付高質量的產品。某種程度上代表了一個開發團隊工程化的程度,畢竟快速運轉的網際網路公司人力成本會高於機器,投資機器優化開發流程化相對也提高了人的效率。
比如(裝修廚房有很多部分,每個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。如果全部裝完了再測,出現問題可能會互相影響,比如電路不行可能要把地磚給挖開……。那麼每完成一部分就測試,這是持續部署。)
持續交付
持續交付(Continuous Delivery)頻繁地將軟體的新版本,交付給質量團隊或者使用者,以供評審儘早發現生產環境中存在的問題;如果評審通過,程式碼就進入生產階段。
比如(全部裝修完了,你去驗收,發現地磚顏色不合意,水池太小,灶臺位置不對,返工嗎?所以不如每完成一部分,你就去用一下試用驗收,這就是持續交付。)
敏捷思想中提出的這三個觀點,還強調一件事:通過技術手段自動化這三個工作。加快交付速度。
在Jenkins流程穩定,不再需要修改後,再將流程寫入pipeline,顯示階段檢視,變數解析顯示,方便查詢問題。
Jenkins 2.0的精髓是Pipeline as Code,是幫助Jenkins實現CI到CD轉變的重要角色。
什麼是Pipeline,簡單來說,就是一套執行於Jenkins上的工作流框架,將原本獨立執行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜釋出流程。Pipeline的實現方式是一套Groovy DSL,任何釋出流程都可以表述為一段Groovy指令碼,並且Jenkins支援從程式碼庫直接讀取指令碼,從而實現了Pipeline as Code的理念。
-
Pipeline 概念
Pipeline 是一個使用者定義的 CD 流水線模式。Pipeline 程式碼定義了通常包含構建、測試和釋出步驟的完整的構建過程。
Node
node 是一個機器,它是 Jenkins 環境的一部分,並且能夠執行 Pipeline。同時,node 程式碼塊也是指令碼式 Pipeline 語法的關鍵特性。
Stage
Stage 塊定義了在整個 Pipeline 中執行的概念上不同的任務子集(例如"構建","測試"和"部署"階段),許多外掛使用它來視覺化或呈現 Jenkins 管道狀態/進度。
Step
一項任務。從根本上講,一個步驟告訴 Jenkins 在特定時間點(或過程中的"步驟")要做什麼。例如,使用 sh step:sh 'make'
可以執行 make 這個 shell 命令。
-
jenkins file
宣告式 指令碼式
指令碼式語法格式:
pipeline{ agent any stages{ stage("get code"){ steps{ echo "get code from scm" } } stage("package"){ steps{ echo "packge code" } } stage("deploy"){ steps{ echo "deploy packge to node1" } } } }
建立一個pipeline專案
① 直接在jenkins專案配置頁面編寫指令碼式pipeline
執行構建-->檢視結果
② jenkins專案配置頁面從Gitlub倉庫讀取Jenkinsfile檔案
在Gitlub倉庫中建立一個Jenkinsfile檔案
執行構建-->檢視結果
③ 更改Gitlub倉庫Jenkinsfile檔案 --> 提交修改
pipeline{ agent any stages{ stage("get code"){ steps{ echo "get code" } } stage("unit test"){ steps{ sh '/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html -Dsonar.projectName=${JOB_NAME} -Dsonar.sources=.' } } stage("package"){ steps{ sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=jenkinsfile' } } stage("deploy"){ steps{ sh 'ssh 10.0.0.7 "cd /usr/share/nginx && mkdir web-${BUILD_ID}"' sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.7:/usr/share/nginx/web-${BUILD_ID}' sh 'ssh 10.0.0.7 "cd /usr/share/nginx/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -rf web-${BUILD_ID}.tar.gz"' sh 'ssh 10.0.0.7 "cd /usr/share/nginx && rm -rf html && ln -s web-${BUILD_ID} /usr/share/nginx/html"' } } } } 執行構建-->檢視結果
-
流水線語法
分散式構建
如果專案需要定期整合,同時每次整合都需要較長時間。如果都執行在master伺服器上,會消耗過多資源,導致其他專案擱置無法整合,這時就需要在建立多臺裝置,並配置作為slave機器來為master提供負載服務。
slave端配置(nexus伺服器)
-
安裝java jdk git 並建立指令碼目錄
[root@nexus ~]# yum -y install java git
[root@nexus ~]# mkdir -p /server/scripts
-
配置SSH免祕鑰認證
① 生成金鑰對
ssh-keygen
② 拷貝slave端的公鑰推送給web
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
③ ssh連結gitlab伺服器獲取known_hosts
ssh 10.0.0.200
④ 拷貝slave端的公鑰上傳至gitlab
cat .ssh/id_rsa.pub
⑤ 手動拉取測試
git clone git@10.0.0.200:oldboy/monitor.git
jenkins伺服器配置
-
配置SSH免祕鑰認證
拷貝jenkins的公鑰推送給slave端
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.202
-
將jenkins上已配置好的 soanr-scanner 和 maven 目錄 及指令碼檔案推送到slave端
scp -r /usr/local/sonar-scanner 10.0.0.202:/usr/local/
scp -r /usr/local/maven 10.0.0.202:/usr/local/
scp /server/scripts/* 10.0.0.202:/server/scripts/
ssh 10.0.0.202 'echo "PATH=\$PATH:/usr/local/sonar-scanner/bin:/usr/local/maven/bin" >> /etc/profile && . /etc/profile'
注意: 做軟連結的要推送帶版本號的目錄!
-
jenkins配置節點
主頁-->系統管理(Manage Jenkins)-->節點管理(Manage Nodes)-->新建節點
填寫節點名稱-->勾選 Permanent Agent --> 確定
配置-->Jenkins憑據
描述 node1-10.0.0.202
併發構建數 2
遠端工作目錄 /home/jenkins
標籤 node1
用法 儘可能的使用這個節點
配置jenkins私鑰 --> 新增 --> 選擇剛新增的憑據
[root@jenkins ~]# cat .ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAwRHJiUaAHhaDDcZbH20+/czGv/Ig/QwwORHarn0M2eGc0skW ... ... -----END RSA PRIVATE KEY-----
配置從節點的工具目錄
git /usr/libexec/git-core/git maven /usr/local/maven sonar /usr/local/sonar-scanner
配置成功後狀態
同時執行多個構建測試