持续集成(二)
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.binariessonar.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



配置成功后状态

同时执行多个构建测试




浙公网安备 33010602011771号