持续集成(二)

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

 

 

 

 

 

 

 配置成功后状态

 

 同时执行多个构建测试

 

 

 

 



 

 








 




 

 





 

 






 





 



 

 



 



posted @ 2021-02-19 01:49  上善若水~小辉  阅读(170)  评论(0编辑  收藏  举报