持續整合(二)

上善若水~小輝發表於2021-02-19

Maven

Maven是一個專案管理和綜合工具。Maven提供給開發人員構建一個完整的生命週期框架。

開發團隊可以自動完成該專案的基礎設施建設,Maven使用標準的目錄結構和預設構建生命週期。

Apache的開源專案主要服務於JAVA平臺的構建、依賴管理、專案管理。

Project Object Model,專案物件模型。通過xml格式儲存的pom.xml檔案。該檔案用於管理:原始碼、配置檔案、開發者的資訊和角色、問題追蹤系統、組織資訊、專案授權、專案的url、專案的依賴關係等等。該檔案是由開發維護,我們運維人員可以不用去關心。


安裝到jenkins伺服器

  1. 下載Maven 3安裝包

官網:http://maven.apache.org/download.cgi

清華映象:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

  1. 安裝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
  1. 上傳一個簡單的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 (清除) : 清除上次編譯的結果
  1. 建立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版本

nexus下載

③ 解壓,移動,配置,啟動,開機自啟動

 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

 

 

 

 

  1. 配置Maven倉庫使用nexus源

① 在專案下的pom.xml配置,只在當前的專案生效

② 在maven下的settings.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倉庫

 

 

 

  1. 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
  1. Jenkins配置Maven整合

主頁-->系統管理(Manage Jenkins)-->全域性工具配置(Global Tool Configuration)-->Maven-->新增 Maven -->去掉自動安裝的勾-->填寫Name和手動安裝 Maven 客戶端的路徑-->儲存

 

 

 Jenkins新建maven專案

 

 

 

 

 

 

 

 

 

Post Steps --> add post-build step --> Execute shell --> 命令 --> 儲存

遠端推送war包

命令根據tomcat安裝方式不同路徑有所區別(見下文)

方法一

 

 

 

 方法二

 

 

 

  1. 部署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
  1. 執行構建-->瀏覽器訪問 http://10.0.0.7:8080/

 

 

 

  1. 配置maven專案引數化釋出和回滾

① 配置maven專案使用的引數

 

 

 ② 配置根據版本號進行拉取程式碼

 

 

 

③ 配置執行指令碼 --> 儲存

 sh /server/scripts/maven.sh

 

 

 

④ java專案指令碼

 [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

  1. SonarQube基於java開發,需安裝open JDK8版本

  2. SonarQube需要依賴MySQL資料庫,至少5.6版本以上

  3. SonarQube的小型例項至少4G記憶體,如果大型例項需要16G記憶體


安裝依賴軟體

 yum -y install git java unzip wget

安裝資料庫

mysql yum源

 

 

 

 

 

 

安裝資料庫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) 生效

 

 

 

注意: 預設已安裝C JAVA Python PHP JS 等程式碼質量分析工具。

如果一個專案使用了JAVA CSS JS HTML,預設情況下sonar只會檢測JAVA JS等程式碼的漏洞和bug。

只有安裝了CSS HTML等外掛,才會檢測該專案程式碼中JAVA JS HTML CSS程式碼的漏洞和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

配置--> 許可權 -->開啟認證--> 儲存

jenkins伺服器

進入專案目錄-->推送程式碼

 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

頁面檢視

執行成功後的結果

 

 

 

 

 

 

 

 

 

 

推送java程式碼進行分析

方法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. 時時提醒

  3. 便於檢視

  4. 郵件配置複雜

  5. 郵件容易被當做垃圾郵件被拒收 1) 建立群組 2) 新增機器人電腦端選擇群設定->群智慧助手->新增更多->自定義通過webhook接入自定義服務

 

 

 

 

 

 

Jenkins整合微信

git有新程式碼提交時會觸發鉤子自動完成上線,運維和開發人員不用時刻盯著jenkins,通過微信的方式給運維和開發人員傳送結果。


  1. 註冊微信企業公眾號 搜尋微信公眾平臺=->立即註冊=->選擇企業微信-->完善資訊-->手機驗證碼-->微信掃二維碼-->註冊成功進入後臺

 

 

 

 

 

 

 應用管理->建立應用

 

 上傳圖片-->填寫應用名稱-->可見範圍-->建立應用

儲存好

AgentId 1000002

Secret vccwlcoLvyzjIKIGmOTtIuvdPP7C8BsyubFWrcU7fhA

賬戶 LiZhenYa

我的企業--> 企業ID wwdda5a3fe8e107a73

後面要寫入py指令碼

 

 

  1. jenkins伺服器使用指令碼

 cd /server/scripts/ 
 rz jenkins_notify.py

更改py指令碼內對應的內容

 vim jenkins_notify.py
 ... ...
         "touser" : "LiZhenYa",
 ... ...
         "agentid" : 1000002,
 ... ...
     Corpid = "wwdda5a3fe8e107a73"
     Secret = "vccwlcoLvyzjIKIGmOTtIuvdPP7C8BsyubFWrcU7fhA"
 ... ...

 

 

 

 之前沒記住, 可以看下圖去找

 

 

  1. jenkins安裝外掛

由於jenkins沒有官網的外掛來完成此功能,所以我們只能用網路上一些開源的外掛(前面手動安裝外掛包中已下載

 wget https://github.com/daniel-beck/changelog-environment-plugin
 cd changelog-environment-plugin-master
 mvn verify

執行完成 當前目錄下生成檔案 target/changelog-environment.hpi,上傳到jenkins即可使用

  1. 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

Post build task 選項依賴Hudson 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

SCM_CHANGELOG 變數依賴 Changelog Environment Plugin外掛(前面手動安裝外掛包中已下載

 

 執行構建--> 在企業微信檢視結果

 

 

Jenkins Pipeline

CI 持續整合

持續整合(Continuous Integration)是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,通過每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。

比如(你裝潢修廚房,其中一項是鋪地磚,邊角地磚要切割大小。如果一次全切割完再鋪上去,發現尺寸有誤的話,浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續整合。)

CD 持續部署

持續部署(Continuous Deployment)是通過自動化的構建、測試和部署迴圈來快速交付高質量的產品。某種程度上代表了一個開發團隊工程化的程度,畢竟快速運轉的網際網路公司人力成本會高於機器,投資機器優化開發流程化相對也提高了人的效率。

比如(裝修廚房有很多部分,每個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。如果全部裝完了再測,出現問題可能會互相影響,比如電路不行可能要把地磚給挖開……。那麼每完成一部分就測試,這是持續部署。)

持續交付

持續交付(Continuous Delivery)頻繁地將軟體的新版本,交付給質量團隊或者使用者,以供評審儘早發現生產環境中存在的問題;如果評審通過,程式碼就進入生產階段。

比如(全部裝修完了,你去驗收,發現地磚顏色不合意,水池太小,灶臺位置不對,返工嗎?所以不如每完成一部分,你就去用一下試用驗收,這就是持續交付。)

敏捷思想中提出的這三個觀點,還強調一件事:通過技術手段自動化這三個工作。加快交付速度。

在Jenkins流程穩定,不再需要修改後,再將流程寫入pipeline,顯示階段檢視,變數解析顯示,方便查詢問題。

  1. 什麼是pipeline

Jenkins 2.0的精髓是Pipeline as Code,是幫助Jenkins實現CI到CD轉變的重要角色。

什麼是Pipeline,簡單來說,就是一套執行於Jenkins上的工作流框架,將原本獨立執行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜釋出流程。Pipeline的實現方式是一套Groovy DSL,任何釋出流程都可以表述為一段Groovy指令碼,並且Jenkins支援從程式碼庫直接讀取指令碼,從而實現了Pipeline as Code的理念。


  1. Pipeline 概念

Pipeline 是一個使用者定義的 CD 流水線模式。Pipeline 程式碼定義了通常包含構建、測試和釋出步驟的完整的構建過程。

Node

node 是一個機器,它是 Jenkins 環境的一部分,並且能夠執行 Pipeline。同時,node 程式碼塊也是指令碼式 Pipeline 語法的關鍵特性。

Stage

Stage 塊定義了在整個 Pipeline 中執行的概念上不同的任務子集(例如"構建","測試"和"部署"階段),許多外掛使用它來視覺化或呈現 Jenkins 管道狀態/進度。

Step

一項任務。從根本上講,一個步驟告訴 Jenkins 在特定時間點(或過程中的"步驟")要做什麼。例如,使用 sh step:sh 'make' 可以執行 make 這個 shell 命令。


  1. 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"'
             }
         }
     }
 }

執行構建-->檢視結果

 


  1. 流水線語法

 

 

 

 

 

 

分散式構建

如果專案需要定期整合,同時每次整合都需要較長時間。如果都執行在master伺服器上,會消耗過多資源,導致其他專案擱置無法整合,這時就需要在建立多臺裝置,並配置作為slave機器來為master提供負載服務。


slave端配置(nexus伺服器)

  1. 安裝java jdk git 並建立指令碼目錄

 [root@nexus ~]# yum -y install java git
 [root@nexus ~]# mkdir -p /server/scripts

  1. 配置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伺服器配置

  1. 配置SSH免祕鑰認證

拷貝jenkins的公鑰推送給slave端

 ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.202

  1. 將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'
注意: 做軟連結的要推送帶版本號的目錄!

  1. 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

 

 

 

 

 

 

 配置成功後狀態

 

 同時執行多個構建測試

 

 

 

 

 

 



 

 








 




 

 





 

 






 





 



 

 



 



相關文章