持续集成(二)
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
配置成功后状态
同时执行多个构建测试