1. 简述什么是Jenkins ?
Jenkins是一个开源的持续集成的服务器,Jenkins开源帮助我们自动构建各类项目。
Jenkins强大的插件式,使得Jenkins可以集成很多软件,可以帮助我们持续集成我们的工程项目,对于我们测试来说,同样可以使用它来为我们做一些自动化的构建,可以结合JMeter、RobotFramework等等。
想象一下这个场景,我们实际的项目中经常会遇到这种情况,客户临时提出一个需求,让我们短时间内做出一个产品原型,然后客户看了满意之后再在这个产品原型的基础上提出一些新的需求点,然后不断迭代这个过程。
如果我们按照原来的瀑布流程来开发产品肯定是无法完成这个任务的,首先就卡在需求上,因为客户无法提供完整的需求,我们就无法根据需求来开发一个完成度很高的产品,那么客户就会产生不满,公司拿不到项目会因此丢单。
其次,时间问题,无法短时间内完成一个高完成度的产品,如果赶工可能会存在产品有重大缺陷无法被发布之前就发现,导致公司由此蒙受损失。
为了避免以上这些风险,持续集成就成了一个很好的解决问题方案,它能保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
•持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量。
2. 列出 Jenkins 的一些特性?
Jenkins 具有以下特点:
开源免费
全面的插件和集成集
卓越的社区和文档
基于 Java,因此易于在任何平台上设置、安装和使用。
确保采用主从架构的分布式构建,减少 CI 服务器负载。
3. 简述使用 Jenkins 有什么要求?
Jenkins 需要以下内容:
可访问的源代码存储库,例如 Git 存储库。
存储库中的工作构建脚本,如 Maven 脚本。
4. 简述Jenkins 有什么优势?
Jenkins 有几个优点,包括:
1 您可以在集成阶段缓存构建失败。
2 每次代码提交更改都会生成自动构建报告。
3 它与 LDAP 邮件服务器集成,以在构建报告成功或不成功时发送通知。
4 实现持续集成、测试驱动开发、敏捷开发。
5 使用简单的步骤,您可以自动化 Maven 发布项目。
6 在开发环境中跟踪错误比在生产环境中更容易
5. 简述Jenkins 中实用的插件?
#1,Rebuilder。
官方地址:https://plugins.jenkins.io/rebuild
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:此插件可以直接重复上次构建,也可以用于查看一些参数比较复杂的构建时,上次构建所选的参数是什么。非常nice的一个插件。
#2,AnsiColor。
官方地址:https://plugins.jenkins.io/ansicolor
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:扩展支持我们在shell当中定义的echo -e指令,从而给一定的输出上颜色。
使用方式:点此跳转到使用介绍。(opens new window)
#3,Maven Release Plug-in。
maven风格插件。安装方式:在Jenkins插件当中直接搜索即可安装。
#4,user build vars。
官方地址:https://wiki.jenkins.io/display/JENKINS/Build+User+Vars+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:通过此插件,让整个Jenkins系统中的用户参数成为一个可调用的变量。
使用方式:在构建环境中选中Set Jenkins user build variables。
选中之后,即可在当次构建的全程里调用对应的变量了。
变量分为如下几种:
Full name :全名
BUILD_USER_FIRST_NAME:名字
BUILD_USER_LAST_NAME :姓
BUILD_USER_ID :Jenkins用户ID
BUILD_USER_EMAIL :用户邮箱
#5,Active Choices Plugin
官方地址:https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:根据所选参数,自动调出对应参数所依赖的后续参数。
使用方式:点此跳转到使用介绍。(opens new window)
#6,build-name-setter
官方地址:http://wiki.jenkins.io/display/JENKINS/Build+Name+Setter+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:通过这个插件,可以动态更改项目构建的名称。不要小瞧这个功能,有时候合理应用对于工作的效率提升,可是非常高的。比如,常用的钉钉插件推送的信息过于简单,有一些信息无法从中得知,其实它推送的就是项目构建的名称,这个时候我们可以通过更改项目名称,来直接将一些构建的变量进行传递。
使用方式:可以通过这样一个妙用示例对其进行理解。(opens new window)
#7,Email Extension Template
官方地址:https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:Jenkins部署状态邮件通知插件。
使用方式:可以通过这样一个妙用示例对其进行理解。(opens new window)
#8,description setter
官方地址:https://wiki.jenkins.io/display/JENKINS/Description+Setter+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:可以在构建名称下,定义一些描述信息的插件,也是非常好用的插件。
使用方式:可以通过这样一个妙用示例对其进行理解。(opens new window)
#9,Git Parameter
官方地址:http://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:在参数化构建步骤当中,可添加Git的branch或者tag来作为参数进行构建。
使用方式:可以通过这样一个妙用示例对其进行理解。(opens new window)
#10,Role-Based Strategy
官方地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:生产当中常用的Jenkins用户视图权限管理插件。
使用方式:可以通过这样一个妙用示例对其进行理解。(opens new window)
#11,Job Configuration History Plugin
官方地址:https://wiki.jenkins.io/display/JENKINS/JobConfigHistory+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:jenkins配置当中的后悔药,如果你更改了某个配置,但是现在又想更改回去,没有备份而且忘了,那么可以使用这个插件。
使用方式:提供有diff对比功能,以及回滚功能。
非常友好的配置更改历史记录:image查看不同,以及配置回滚这里就不演示了。
#12,Simple Theme
官方地址:http://afonsof.com/jenkins-material-theme/?tdsourcetag=s_pctim_aiomsg
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:可以自定义Jenkins主题的插件。
使用方式:使用方式见官方网站的说明,配置起来非常简单。
#13,Build Trigger Badge
官方地址:https://wiki.jenkins-ci.org/display/JENKINS/Build+Trigger+Badge+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:能够在项目视图首页展示项目构建人的插件。
使用方式:事实上这个功能之前我已经在可以通过这样一个妙用示例对其进行理解这篇文章里通过智慧使用其他方式实现了,只不过现在这个插件可以直接实现对应的功能。如果首页视图当中看不到,可以通过编辑视图,添加cause即可看到。
#14,Console Column Plugin
官方地址:https://wiki.jenkins.io/display/JENKINS/Console+Column+Plugin
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:能够在项目视图首页展示项目构建输出面板的地址。
使用方式:首页视图中,可以通过编辑视图,添加Last Console即可看到。
#15,Display Console Output Plugin
官方地址:https://plugins.jenkins.io/display-console-output
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:点击项目构建之后,可以直接在当前窗口显示构建日志。
使用方式:安装之后默认启用,随便点击一个自由风格的项目构建即可看到效果。
#16,Version Number
官方地址:https://plugins.jenkins.io/versionnumber/
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:通过插件的方式提供更加丰富的构建版本号
使用方式:安装之后默认启用,随便点击一个自由风格的项目构建即可看到效果。
#17,figlet-buildstep
官方地址:https://plugins.jenkins.io/figlet-buildstep/
安装方式:在Jenkins插件当中直接搜索即可安装。
功能说明:这个插件允许你在构建过程中输出一个简单的横幅。
使用方式:使用方法我们可以在流水线语法中直接获取:
figlet '"start build"'
如上代码放到任意地方,会得到如下输出:
008k1Yt0gy1gtldstgu9uj60w80e20u902
6. 解释如何将 Jenkins 从一台服务器移动或复制到另一台服务器?
Jenkins作为一款流行的开源CI/CD工具,在实际使用过程中难免会遇到需要迁移的情况,比如主机更换、目录迁移等。本文将提供Jenkins迁移的完整步骤与指南。
准备工作
在正式迁移Jenkins之前,需要准备好以下环境:
- 新的Jenkins主机:可以是物理机、虚拟机或Docker,需要提前安装好Jenkins及其运行依赖。
- 相同的Jenkins版本:新老主机上的Jenkins版本需要保持一致,否则可能导致配置或数据不兼容的问题。
- 相同的插件版本:如果有使用到第三方插件,插件版本也需要一致,以防止出现问题。
- 备份原Jenkins数据:为安全起见,在迁移前先备份Jenkins的主目录,以备还原或比对数据。
- 服务停止计划:为避免Jenkins服务中断,需要提前计划好切换时机,停止原Jenkins服务并启动新服务。
迁移步骤 - 拷贝Jenkins主目录:Jenkins主目录包含Jenkins的配置、数据、插件等最关键信息,必须完整拷贝。目录默认路径为/var/lib/jenkins。需要将jenkins主目录原有数据拷贝到新的机器或者新目录下,主要包含config.xml文件以及jobs、users、workspace、plugins四个目录,然后重启jenkins即可
- 拷贝日志文件:如需要登录审计,可以选择拷贝Jenkins的日志文件。目录默认为/var/log/jenkins。
- 拷贝环境配置:拷贝Jenkins的环境配置文件/etc/sysconfig/jenkins和服务脚本/etc/init.d/jenkins。
- 确认权限和用户:确认新目录的权限和所属用户与原目录相同。Jenkins需要对主目录有读写权限。
- 配置环境变量:配置JENKINS_HOME环境变量,指向新主目录路径。
- 启动Jenkins服务:在新主机上启动Jenkins服务,命令为service jenkins start或systemctl start jenkins。
- Jenkins重新配置:登录Jenkins web界面,重新配置管理员用户、插件管理器源等信息。
- 测试与切换:进行测试,确保新Jenkins工作正常。然后停止原Jenkins服务,使用新的Jenkins服务。
- 后续监控:Jenkins迁移后,需持续监控Jenkins运行状况,确保服务稳定。出现问题及时还原或处理。
7. 简述可以使用哪些命令手动启动 Jenkins?
Jenkins 可以通过以下两种方式手动启动:
(Jenkins_url)/restart: 强制重启 Jenkins 而不等待当前构建完成。
(Jenkin_url)/safeRestart: 它让所有正在运行的构建完成
8. 如何保证 Jenkins 的安全?
确保 global security 配置项已经打开。
确保用适当的插件将 Jenkins 与企业员工目录进行集成。
确保启用项目矩阵的权限访问设置。
通过自定义版本控制的脚本来自动化 Jenkins 中设置权限/特权的过程。
限制对 Jenkins 数据/文件夹的物理访问。
定期对其进行安全审核。
9. 简述如何配置 Jenkins 的 job?
转到 Jenkins 首页,选择"New Job",然后选择"Build a free-style software project"。然后你可以设置这个自由式 job 的元素:
可选的 SCM,例如源代码所在的 CVS 或 Subversion。
用于控制 Jenkins 何时执行构建的触发器。
某种构建脚本,用于执行实际工作的构建(ant,maven,shell 脚本,批处理文件等)。
从构建中收集信息的可选步骤,例如归档制品、记录 javadoc 和测试结果。
配置构建结果通知其他人/系统的步骤,例如发送电子邮件、即时消息、更新问题跟踪器等。
10. 简述Jenkins 如何创建Pipeline ?
将其中一个示例复制到您的存储库并将其命名Jenkinsfile
单击Jenkins中的New Item菜单
new-item-selection
为您的新项目提供名称(例如我的Pipeline),然后选择多分支Pipeline
单击添加源按钮,选择要使用的存储库的类型并填写详细信息。
点击保存按钮并观看您的第一条Pipeline运行!
您可能需要修改一个示例Jenkinsfile以使其与您的项目一起运行。尝试修改sh命令以运行您在本地计算机上运行的相同命令。
设置你的Pipeline后,Jenkins将自动检测在存储库中创建的任何新分支或拉请求,并为其启动运行Pipeline。
11. Jenkins 主要集成的两个组件是什么?
Jenkin 主要由两部分组成:
SVN、GIT 等版本控制系统
构建工具,例如 Apache Maven
12. 解释如何在 Jenkins 中创建备份和复制文件?
数据备份有两种办法,一种是手动的,一种是自动的。
1.手动备份
比较简单就像上述迁移步骤那样,把原始机器上的数据打包。打包后有两种选择,第一种是在原始机器上,其他路径下创建一个文件夹,把数据丢进去。例如原始机器上的数据是存储在/home/jenkins,我们打包后可以放到/home/backups,这样做的好处是如果误删了jenkins,我们可以到backups下找回原始数据;第二种是将打包的文件拷贝到另外一台物理机上,这样做的好处是如果原始机器宕机了,我们可以在另外一台机器上找到备份文件,在最短的时间内恢复工作。
2.自动备份
相对于手动备份,我们也可以编写脚本实现自动备份,例如linux系统中,使用shell脚本,如下命令可以实现备份:
cp -r /home/jenkins/需要备份的文件夹名 /home/backups/目标文件夹名
注意:命令中的两个路径之间是有空格的。
同理windows下可以使用批处理:
xcopy D:\jenkins\需要备份的文件夹名*.* D:\backups\目标文件夹名\ /s /e
注意:*.*后面有一个空格,目标文件夹名后面有个斜杠不能丢(你若皮,可以丢一下试试看会有怎么样的效果)
那么跨平台备份文件应该怎么办呢?Linux的文件传到windows上,windows的文件传到linux上。这里我们需要借助一个工具pscp,安装好以后就可以直接用了。
Windwos传到linux命令如下:
pscp D:\jenkins root@192.168.0.15:/mnt/backups
其中?D:\jenkins是windows文件夹,root是用户名,@后面是ip,冒号后面是linux的文件夹
从linux传到windows把命令倒过来就行了,如下
pscp root@192.168.0.15:/mnt/backups D:\jenkins
13. 解释如何通过 Jenkins 克隆 Git 存储库?
Jenkins 需要您的 Jenkins 系统的用户名和电子邮件地址来克隆 Git 存储库。为此,您必须切换到您的作业目录并执行"git config"命令
14. 简述Jenkins整个工作流程 ?
- 开发者检入代码到源代码仓库。
- CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。
- CI系统会在对应的工作区内执行构建过程。
- (配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。
- (配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge之类的网站。
- CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。
15. 请详细列举Jenkins各配置选项 ?
#1, 系统设置
此处定义Jenkins的全局消息,或者是邮箱的配置。
#2, 全局安全配置
主要是配置用户访问的控制,这里仅开启允许用户注册,这样的话,可以让所有开发测试小伙伴在这里以自己的名字注册自己的账号,然后运维管理人员根据他们不同的项目与权限进行规则的设置就行了。
#3, 全局工具设置
里边包含了所有的代码库,或者打包工具的位置,根据情况进行设置就行。或者什么都不设置也可以。只不过以后脚本里边注意添加命令加载变量。
#4, 管理插件
可参考:https://www.w3cschool.cn/jenkins/jenkins-s5xk28l5.html
里边有丰富的插件提供,详细的插件功能,不多赘述,有几个重要的需要在:
ant:打包的
LDAP:就是上边的访问控制功能
Git:从代码库拉取代码
Role-Based Strategy:角色管理。
Email Extension Plugin: (邮件通知)
Publish Over SSH: (远程Shell)
Maven Integration plugin:Maven集成,否则新建的时候没有Maven Project
Monitoring:监控Jenkins所消耗的系统资源,如内存使用等
#5, 管理节点
如果服务器数量过于庞大,则可能会使用到主从式的集群进行构建发布。
#6, 管理用户
这些用户能够登录到Jenkins。这是列表的子集,也包括那些只是提交了代码到某些项目但是从未登录Jenkins而自动创建的用户。这是官方的介绍,点击用户后边的设置,还可以更改他的信息以及密码的重置等。
#7, 小黄锁。
需要安装插件Role-Based Strategy
此处可以参考:
所有的用户分组规则权限都在这里设置了。管理角色是规则的设置
1,全局变量的设置,也可以理解成是组的添加设置,这里只设置出了开发者一个组。也可以通过下边的add新增。他们对全局有读的权限就好了。
2,项目的分组。这个地方有点像Git里边的权限了,有分组的,也有项目的,经过这样两层的过滤,基本上每个人都会有合适的权限了。
分配角色
这里边就是对每个人的权限进行具体的分配了。这里边的又是与上边全局配置的规则对应的,因此先add把人添加进来,然后在后边勾选合适的权限就可以了。
注意不同人身份的不同权限设置。
现在,基本上对Jenkins的基础配置已经完成了,接下来就能够进行项目的构建与部署了。
16. 简述Jenkins配置项目构建的钉钉通知 ?
Jenkins配置钉钉的通知非常简单。
首先在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook。
复制webhook。
Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警
17. 简述Jenkins忘记管理员密码怎么办 ?
一、admin密码未更改情况
1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码;
2.访问Jenkins页面,输入管理员admin,及刚才的密码;
3.进入后可更改其他管理员密码;
#二、admin密码更改忘记情况
1,删除Jenkins目录下config.xml文件中下面代码,并保存文件。
true
true
true
false
2,重启Jenkins服务;
3,进入首页>"系统管理">"Configure Global Security";(全局安全配置)
4,勾选"启用安全";
5,点选"Jenkins专有用户数据库",并点击"保存";
6,重新点击首页>"系统管理",发现此时出现"管理用户";
7,点击进入展示"用户列表";
8,点击右侧进入修改密码页面,修改后即可重新登录。
18. 简述Jenkins与Gitlab的交互源码获取 ?
1, 直接通过其附带的Git插件来拉取代码。
通过在源码管理当中直接设置Git仓库的代码链接,然后下边添加相对应的已注册用户账号密码,如此就可以拉取到本地workspace里了。然后就能够针对代码进行操作了。
那么这种方式构建的项目,分支切换更加灵活,一般情况下构建记录当中所显现的代码变动记录也会非常大,在真正构建之前都是代码变动的记录。
2, 不通过Git插件对代码进行操作。
这种方式更适合于单一分支发布的情况,一般线上正是环境都是只发master分支,比较适合使用这种方式。
操作流程大概是这样,首先在Jenkins所在服务器上对要工作的项目进行手动clone,然后就可以在Jenkins这里直接对代码进行操作部署。
解释:
首先是分支已经在master。
然后显示从Git库链接拉取更新。
下边就是一些详细更新内容的展示。
两种方式都是可以进行正常构建部署的。第一种更适合于测试环境中使用,分支变动更加灵活,第二种更适合于正式环境,只针对单一分支进行部署更新。
而两种方式还有一个小区别,第一种构建方式,所有的代码变动更新都可以通过项目的变更记录里边看到,但是第二种方式去到变更记录里边,则全部是没有变动。有这个区别,就不会在开发来找你问我代码有没有发上去,而你在确认是否有发上去时--被动。
19. 简述Jenkins目录结构 ?
jobs:包含Jenkins管理的构建作业的配置细节、构建产物和数据;
logs:日志目录
plugins:存放jenkins已安装插件的相关文件(下载的推荐插件都在这个目录下存放)
updates:用来存放可用的插件更新,包括插件更新的地址都在该目录下的default.json存储
nodes:保存节点的配置
secrets:存放一些秘钥
userContent:网上说是存放为Jenkins服务器定制化的一些内容,这个小编也不清楚具体存放的啥,这个目录默认是空的,只有一个readme文件
users:存放用户账号信息
war:貌似是jenkinswar解压之后的文件
workspace:存放Jenkins配置的job中相关的文件和中间产物
根目录下的jenkins.xml文件:里面存储了jenkins的启动命令以及对应的端口,其实底层都是通过java -jar xxx.war的形式去启动,后续要更改端口,直接修改这个文件中的httpPort的值,然后重启服务即可
20. 简述Jenkins怎么备份以及对应的配置选项 ?
Jenkins 有一个备份插件,它可以用来与Jenkins备份重要的配置设置。按照下面给出有一个适当的备份所需的步骤。
1、 管理员登陆172.20.15.36:8080,点击"系统管理",然后选择"插件管理"选项
2、在可用Available选项卡上,搜索并勾选"ThinBackup"。点击"Install without Restart"。完成后,重新启动Jenkins实例
3、进入系统管理->ThinBackup→Settings下进行相关参数配置,配置说明如下:
备份目录
指定备份目录。Jenkins进程需要对此目录的写访问权。您可以使用$ {
JENKINS_WORKSPACE
}
等环境变量来指定路径。
完整备份的备份计划
指定触发完整备份的计划。使用Cron表示法。即使没有更改,完整备份也会备份所有文件。
差异备份的备份计划
指定触发差异备份的计划。使用Cron表示法。差异备份仅存储自上次完全备份以来修改的数据。如果未检测到任何更改,则不会创建差异备份。
注意:如果只需要完整备份,则无需指定差异备份计划。由于差异备份依赖于完整备份,因此如果指定差异备份计划,则必须提供完整备份计划。
等到Jenkins / Hudson闲置以执行备份
建议启用此选项(默认)。然而,许多用户报告说安静模式阻止了长时间运行的作业的执行。如果禁用此选项,则无需等待实例的安全状态即可进行备份。换句话说,备份将立即完成,这可能导致损坏的备份。
在指定的分钟后强制Jenkins进入完全模式
在指定的时间(分钟)后强制安静模式,以强制安全的备份环境。零表示在调度程序触发备份时直接强制执行完全模式。阅读下面有关备份过程的更多信息。
最大备份集数
要节省磁盘空间,可以指定存储的最大备份集数。备份集定义为完整备份及其引用差异备份。在下一次完整备份操作后,将删除较旧的备份集。这也适用于压缩备份集。
备份中排除的文件
如果您有特定文件而不想备份,则在此处输入标识这些文件的正则表达式将阻止它们被备份。名称与此正则表达式匹配的所有文件都不会被备份。如果不需要,请留空。如果表达式无效,则将忽略该表达式。
备份构建结果
如果启用此选项,则还将备份构建结果。这可能是很多数据,所以要仔细考虑它。一旦您决定备份构建结果,您还可以选择备份构建存档。再次注意这个选项,因为它可能非常耗时并且可能需要大量的磁盘空间!
备份'userContents'
Jenkins提供了一个URL,您可以在其中放置常用数据(例如静态HTML,工具...)。如果选中此选项,则可以备份所有这些数据。
备份仅构建标记为保留
如果启用此选项,则仅备份标记为"永久保留此构建"的构建的结果/工件。
清理差异备份
如果启用此选项,则只要完成新的完整备份,就会删除所有差异备份。
将旧备份移动到ZIP文件
如果选中此选项,则每当执行新的完整备份时,所有旧备份集都将移动到ZIP文件。每个ZIP文件将包含一个备份集,即一个完整备份和引用它的任何差异备份。文件名将标识包含备份的时间范围(即完整备份的时间戳和最新差异备份的时间戳)。
注意: " 最大备份集数"设置也适用于由thinBackup创建的备份ZIP文件。
注意:如果选中" 清理差异备份 ",则在完成压缩之前将执行diff清理,因此ZIP文件中不会进行差异备份。
以上配置表示每天凌晨12点自动完整备份到设置的目录/Trendy/jenkins_backup下
备份内容包括:Backup next build number file、Backup 'userContent'folder、
Backup plugins archives、 Clean up differential backups;
此外可以手工执行备份:
21. 简述配置gitlab提交代码Jenkins自动构建 ?
1、jenkins配置
1.1 安装Gitlab Hook Plugin插件
系统管理-管理插件-可选插件-Gitlab Hook Plugin和Build Authorization Token Root Plugin
1.2 生成随机token
#openssl rand -hex 12
0f2a47c861133916d2e299e3
1.3 创建项目触发器
项目-配置-构建触发器:
http://192.168.3.199:8080/jenkins/project/web-demo
2、配置gitlab
2.1 在Git项目配置界面设置链接和token
登录gitlab,在这个项目下找到钩子配置的地方
选择项目-设置-webhooks:
插件使用介绍,https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin
http://192.168.3.199:8080/jenkins/buildByToken/build?job=web-demo\&token=0f2a47c861133916d2e299e3
http://jenkins服务器地址:8080/buildByToken/build?job=项目名\&token=token值
2.2 测试
22. Jenkins 使用什么语法来计划构建作业或 SVN 轮询?
Cron语法使用五个星号表示,每个星号之间用空格隔开。 语法如下:
[分钟] [小时] [每月的某天] [月份] [一周的某天]。
例如,如果想为每个星期一的11.59 pm设置cron,则为
59 11 * * 1
23. 简述什么是DSL Jenkins?
Jenkins的"作业DSL /插件"由两部分组成-第一部分,域特定语言(DSL)本身,它允许用户使用基于Groovy的语言来描述工作,其次,是一个Jenkins插件,用于管理脚本和结果是更新并创建并维护了Jenkins工作
24. 如何在Jenkins中定义Post?
post 步骤在Jenkins pipeline语法中是可选的,包含的是整个pipeline或阶段完成后一些附加的步骤。 比如我们希望整个pipeline执行完成之后或pipeline的某个stage执行成功后发生一封邮件,就可以使用post,可以理解为"钩子"。
根据pipeline或阶段的完成状态,post部分分成多种条件块,包括: • always:不论当前完成状态是什么,都执行。 • changed:只要当前完成状态与上一次完成状态不同就执行。 • fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。 • regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。 • aborted:当前执行结果是中止状态时(一般为人为中止)执行。 • failure:当前完成状态为失败时执行。 • success:当前完成状态为成功时执行。 • unstable:当前完成状态为不稳定时执行。 • cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。post部分可以同时包含多种条件块。
25. 解释如何部署Jenkins核心插件的自定义版本?
以下是部署自定义构建核心插件的步骤:
停止Jenkins。
将自定义HPI复制到 $ Jenkins_Home / plugins。
删除以前扩展的插件目录。
制作一个名为 .hpi.pinned的空文件 。
启动Jenkins。
26. 解释Jenkins术语Agent,Post-section,Jenkinsfile ?
Agent:指示Jenkins以特定方式和顺序执行管道的指令。
Post-section:如果我们必须在管道的末尾添加一些通知并执行其他任务,则Post-section肯定会在每个管道的执行结束时运行。
Jenkinsfile:定义了管道的所有定义的文本文件称为Jenkinsfile。正在源代码控制存储库中检查它
27. 简述什么是 Groovy?
Groovy是一种来自 Apache 的 Java 语言。 Jenkins 使用它来编写本机脚本。基于 Groovy 的插件使 Jenkins 更具动态性,并提供一致且动态的构建报告
28. Jenkins 支持哪些 SCM 工具?
Jenkins 支持以下 SCM 工具:SVN、Clearcase、CVS、Git、AccuRev、Perforce、RTC、Mercurial。
29. 简述管道的概念以及Jenkins 为什么使用pipeline?
Jenkins管道的定义被写入到一个jenkinsfile的文本文件,该文件又可以被提交到项目的源代码控制库。这是"Pipeline-as-code"的基础。将CD管道作为应用程序的一部分进行版本控制,并像任何其他代码一样进行审查。
Jenkins从根本上说是一个支持多种自动化模式的自动化引擎。Pipeline在Jenkins上增加了一套强大的自动化工具,支持从简单的持续集成到全面的CD管道的用例。通过对一系列相关任务建模,用户可以利用Pipeline的更多功能,如:
可维护:管道是在代码中实现的,并且通常会被签入源代码管理,从而使团队能够编辑,审阅和迭代他们的交付管道。
可能出现:在继续进行管道运行之前,管道可以选择停止并等待人员输入或批准。
复杂场景:管道支持复杂的实际CD需求,包括分叉/连接,循环和并行执行工作的能力。
可扩展性:Pipeline插件支持对其DSL的定制扩展 。
30. Jenkins支持什么类型的管道Pipeline ?
Scripted Pipeline
声明式Declarative Pipeline
其中关键语法异同如下:
pipeline 是声明性管道特定语法,它定义了一个包含执行整个管道的所有内容和指令的"块"。
agent 是声明式管道特定的语法,它指示Jenkins为整个管道分配执行程序(在节点上)和工作空间。
stage是描述此Pipeline阶段的语法块 。stage在Pipeline语法页面上阅读关于声明式管道语法块的更多信息。如所提到的上述,stage块在脚本管道语法可选的。
steps是声明式管道特定语法,用于描述要在此中运行的步骤stage。
sh是一个Pipeline
步骤(由 Pipeline:Nodes和Processes插件提供)执行给定的shell命令。
node是脚本化的管道特定语法,指示Jenkins在任何可用的代理/节点上执行此管道(以及其中包含的任何阶段)。这与agent声明式管道特定语法中的效果相同。
31. 简述什么是Blue Ocean ?
Blue Ocean是pipeline的可视化UI。同时他兼容经典的自由模式的job。Jenkins Pipeline从头开始设计,但仍与自由式作业兼容,Blue Ocean减少了经典模式下的混乱并为团队中的每个成员增加了清晰度。Blue Ocean的主要特点包括:
连续交付(CD)管道的复杂可视化,可以让您快速直观地理解管道状态。
管道编辑器 - 通过引导用户通过直观和可视化的过程来创建管道,从而使管道的创建变得平易近人。
个性化以适应团队中每个成员的基于角色的需求。
在需要干预和/或出现问题时确定精确度。Blue Ocean显示的标注了关键步骤,促进异常处理和提高生产力
32. 解释 Jenkins 和 Bamboo 之间的区别?
詹金斯(Jenkins)是一个由世界各地的开发人员支持的辅助开放式项目。而Bamboo是其母公司开发和维护的工业工具
Bamboo具有可比性,并且使用简单,但是UI并不那么漂亮。Jenkin在上这堂课时要Bamboo。Jenkins的UI可能只是一个很小的老派,但是,新的Blue Ocean界面是一个严重的升级。
Bamboo的开箱即用选项较少,但是,它与Atlassian的其余工具本机集成在一起。这使Bamboo感到额外的功能-富裕而又不具备选项本身。Jenkins是3中功能最稀疏的工具,但是它通过庞大的插件方案弥补了这一不足
Jenkins包含大量的插件方案,使其具有无与伦比的定制性和可扩展性。Bamboo正在缓慢地发展其生态系统,但是,以这种速度,它很有可能会迎头赶上。
作为一个相关的开放供应项目,詹金斯(Jenkins)包含了一个庞大而有用的贡献者社区,它们为彼此提供了支持。因此,詹金斯(Jenkins)有大量的文档,但是,您只能自己梳理文档以找出或解决延迟剂。相反,Bamboo仍在不断增长的用户社区中,从其母公司提供熟练的支持。Bamboo使用者可以注意到公司积极支持的愉快混合,仍然是社区的众包支持。
许多中小型软件系统组仅在云基础架构上运行。因此,一旦Atlassian停止使用Bamboo云,迫使小组在内部运行它,对于某些Bamboo用户来说绝对是困难的。他们用BitBucket管道代替了该服务,但是,有些人认为这不是理想的替代方法。Jenkins仍然在那里可以在云服务器上运行。
作为一个开放式软件系统,尽管您的规模很大,但Jenkins完全不愿使用。Bamboo是最昂贵的工具。它的起价仅为10美元,但是,对于这个价格,它提供了特别有限的专业知识。对于全部专业知识,您将必须为每一个远程代理以$ 880的一次性价格许可Bamboo。
33. 简述什么是Bamboo (额外扩展)?
Bamboo是Atlassian的CI / CD服务器。Bamboo允许开发人员自动构建,集成然后准备应用程序以进行准备。Bamboo与Atlassian的替代工具(如Jira(项目管理)和Hipchat(团队沟通))紧密合作。Jenkins是当今市场上最受欢迎的开放式CI / CD工具。Jenkins允许开发人员在将代码提交到提供的存储库时自动构建,集成和查看当前代码。
什么是Bamboo?
只要您使用Bitbucket和JIRA进行开发,Bamboo就是强大的,并且愿意得到您的CI答案。而且,Bamboo易于使用,用户将在更少的时间内添加多个任务。希望更轻松的准备功能并愿意使用简单的UI的开发人员应该尝试一下。主要根据您的需求选择最简单的方法。
Bamboo特点:
简单直观的拖放式用户界面,用于计划管道,支持的恒定任务,工作,持续交付的阶段原则。扇出/扇入微不足道。
暂时禁用阶段,作业或任务是微不足道的。作业将在各个阶段之间放置,各个阶段和任务将被重新排序,并且如果您未做好准备的话会弹出警告。
尽管不像GoCD那样精巧,但也可以链接管道。但是,我会承认这通常是Bamboo的最弱点之一。
一个单独的准备管理器,您可以在其中简单地管理准备环境,跟踪您所排放的东西以及到达何处,以及从释放到腐烂提交的完整可追溯性,因此还包括其中的JIRA问题。
自动检测并建立新分支。(即使通过非常便宜的插件也可以)使恒定的管道在分支构建中以其他方式运行。
整个构建过程中的每条管道运行都会自动管理构建工件。不必强迫在关联的外部存储库中暂存工件。
正如您所期望的,与替代Atlassian产品的集成比您构想的替代组合要好得多
34. 您如何在Jenkins中定义构建的参数?
构建可以采用多个输入参数来执行。例如,如果您有多个测试套件,但只想运行一个。您可以设置一个参数,以便能够决定应运行哪个参数。要在作业中包含参数,则在定义参数时需要指定相同的参数。该参数可以是任何东西,例如字符串,文件或自定义
35. 配置Jenkins节点Agent以与Jenkins master通信的方式有哪些?
有两种方法可以启动节点代理
浏览器--如果从浏览器启动Jenkins节点代理,则将下载JNLP(Java Web Start)文件。该文件在客户端计算机上启动新进程以运行作业。
命令行--要使用命令行启动节点代理,客户端需要可执行的agent.jar文件。运行此文件时,它仅在客户端上启动一个进程以与Jenkins主服务器通信以运行构建作业
36. Jenkins如何验证用户身份?
有3种方法:
默认方式是将用户数据和凭据存储在内部数据库中。
将Jenkins配置为使用由部署它的应用程序服务器定义的身份验证机制。
配置Jenkins以针对LDAP服务器进行身份验证
37. Jenkins环境变量在批处理、shell中引用及命令编写 ?
一、在批处理、shell中引用
shell中引用 :
1、 直接使用 标志:如 标志:如 标志:如BUILD_STATUS
2、 使用$ {
}
标志:如$ {
BUILD_STATUS
}
批处理中引用:
% BUILD_STATUS %
二、命令编写
cd $ {
Html_Report
}
/;
rm -f html_report.zip;
zip -r html_report.zip .
/*
@echo off
set work_path=E:\Jenkins\ws\target\surefire-reports\html
E:
cd %work_path%
if exist html_report.rar (del /q /s html_report.rar)
WinRAR.exe a -idq -inul ./html_report.rar .
38. 如何使用Jenkins实现持续集成?
所有开发人员都将其源代码更改提交到共享的Git存储库。
Jenkins服务器按指定的时间间隔检查共享的Git存储库,然后将检测到的更改纳入构建。
构建结果和测试结果共享给各个开发人员
生成的应用程序显示在Selenium等测试服务器上,并运行自动化测试。
干净且经过测试的内部版本已部署到生产服务器。
39. 简述Jenkins多分支管道如何工作?
假设我希望Jenkins管道在以下条件下构建和部署应用程序。
开发人员通过向功能分支提交代码来从功能分支开始。
每当开发人员从功能分支提PR来开发分支时,Jenkins管道都应触发以运行单元测试和静态代码分析。
在功能分支中成功测试代码后,开发人员将PR合并到开发分支。
当代码准备发布时,开发人员将PR从develop分支提到master。它应该触发一个构建管道,该管道将运行单元测试用例,代码分析并将其部署到dev / QA环境。
从以上条件可以看出,没有手动触发Jenkins作业的情况,并且每当有分支请求请求时,都需要自动触发管道并为该分支运行所需的步骤。此工作流程为工程师建立了一个很好的反馈循环,并避免了依赖DevOps团队在非产品环境中进行构建和部署。开发人员可以在Github上检查构建状态,然后决定下一步要做的事情。
通过Jenkins多分支管道可以轻松实现此工作流程。下图显示了以上示例构建过程的多分支管道工作流的外观
这是多分支管道的工作方式。
当开发人员从功能分支创建PR来开发分支时,Github将带有PR信息的Webhook发送给Jenkins。
Jenkins收到PR,并找到相关的多分支管道并自动创建分支管道。然后,它按照功能分支中Jenkinsfile中提到的步骤运行作业。签出期间,PR中的源分支和目标分支将合并。PR合并将在Github上被阻止,直到从Jenkins返回构建状态为止。
构建完成后,Jenkins会将状态更新为Github PR。现在您将能够合并代码。另外,如果您想查看Jenkins构建日志,则可以在PR状态下找到Jenkins构建日志链接。
40. 简述如何在Jenkins中创建多分支管道?
为了使多分支管道正常工作,您需要在SCM存储库中包含Jenkinsfile。
如果您正在学习/测试,则可以使用下面提供的多分支管道Jenkinsfile。它具有一个检出阶段和其他阶段,它们会回显消息。
另外,您可以克隆并使用具有此Jenkinsfile的Github存储库
注意:将代理标签" master"替换为您的Jenkins代理名称。master也可以工作,但不建议它在实际的项目环境中运行。
pipeline {
agent {
node {
label 'master'
}
}
options {
buildDiscarder logRotator(
daysToKeepStr: '16',
numToKeepStr: '10'
)
}
stages {
stage('Cleanup Workspace') {
steps {
cleanWs()
sh """
echo "Cleaned Up Workspace For Project"
"""
}
}
stage('Code Checkout') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-petclinic.git']]
])
}
}
stage(' Unit Testing') {
steps {
sh """
echo "Running Unit Tests"
"""
}
}
stage('Code Analysis') {
steps {
sh """
echo "Running Code Analysis"
"""
}
}
stage('Build Deploy Code') {
when {
branch 'develop'
}
steps {
sh """
echo "Building Artifact"
"""
sh """
echo "Deploying Code"
"""
}
}
}
}
设置Jenkins多分支管道
在这里,我将逐步引导您逐步在Jenkins上建立多分支管道。该设置将基于Github和最新的Jenkins 2.x版本。您还可以将Bitbucket或Gitlab用作多分支管道的SCM源。
步骤1:在Jenkins主页上创建一个"新项目"。
步骤2:从选项中选择"多分支管道",然后单击"确定"。
步骤3:点击"添加来源",然后选择Github。
步骤4:在认证字段下,选择Jenkins并使用您的Github用户名和密码创建一个认证。
步骤5:选择创建的凭据,然后提供您的Github存储库以验证凭据,如下所示。
如果您正在测试多分支管道,则可以克隆演示Github存储库并使用它。https://github.com/devopscube/multibranch-pipeline-demo。
第6步:选择所需的选项以符合您的要求。您可以选择发现存储库中的所有分支,也可以仅选择具有"拉取请求"的分支。
管道还可以从分叉的仓库中发现具有PR的分支。
选择这些选项取决于所需的工作流程。
您可以从"添加"按钮中选择其他行为。
例如,如果选择不从存储库中发现所有分支,则可以选择正则表达式或通配符方法从存储库中发现分支,如下所示。
这是一个正则表达式和通配符示例。
步骤7:如果选择为Jenkinsfile使用其他名称,则可以通过在构建配置中指定名称来实现。在"脚本路径"选项中,您可以提供所需的名称。确保仓库中的Jenkinsfile与您在管道配置中提供的名称相同。
另外,启用"放弃旧版本"以仅保留所需的生成日志,如下所示。
步骤8:保存所有作业配置。Jenkins扫描已配置的Github存储库,以查找所有提升了PR的分支。
下图显示了扫描三个分支的作业,并且由于我没有提出任何拉取请求,Jenkins不会创建任何基于分支的管道。我将展示如何在设置Webhook之后测试自动管道创建。
到目前为止,我们已经在Jenkins完成了配置,可以根据PR请求扫描分支。为了拥有完整的工作流程,我们需要在Github中配置一个Webhook,以将所有事件(提交,PR等)发送给Jenkins,因为可以自动触发管道。
41. 解释为什么 Jenkins 与 Selenium 一起使用?
Jenkins 可以在软件或环境发生变化时运行 Selenium 测试。 Selenium 测试套件与 Jenkins 的集成允许测试作为构建过程的一部分自动运行
42. 解释什么是Jenkins触发器?举例说明在检测到新提交时如何轮询存储库
构建触发器指的是在什么条件下或者是什么时候去触发项目的构建,在前面我们都是手动点击Build Now去构架项目。而事实上Jenkins内置了4种构建触发器,可以让我们自动或者说半自动的去触发项目的构建,4种构建触发器分别是:
1 触发远程构建
2 其它工程构建后触发
3 定时构建
4 轮询SCM
轮询SCM是指扫描代码仓库的代码是否有变更,如果有变更就触发项目构建。
需要注意的是:设置该构建触发器,Jenkins会定时扫描整个项目的代码,增加系统的开销,不建议使用
43. Jenkins 节点代理与 Jenkins master 通信有哪些配置方式?
Node agent 可以通过两种方式启动:
Browser -- 当从浏览器启动 Jenkins 节点代理时,会下载一个 JNLP(Java Web Start)文件。在客户端计算机上,此文件启动一个新进程来运行作业。
命令行 -- 为了让客户端运行节点代理,它们需要一个名为 agent.jar 的可执行文件。运行此文件会在客户端上启动一个进程以连接到 Jenkins 主服务器并运行构建作业
44. 简述Jenkins 设置Nginx代理 ?
Jenkins在本地运行在端口8080上。我们可以从端口80-> 8080建立代理,因此可以通过以下方式访问Jenkins:
http://.com
而不是默认值
http://.com:8080
首先安装Nginx。
sudo aptitude -y install nginx
删除Nginx的默认设置
cd /etc/nginx/sites-available
sudo rm default .../sites-enabled/default
创建新的配置文件
sudo touch jenkins
将以下代码复制到新创建的jenkins文件中。
upstream app_server {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen [::]:80 default ipv6only=on;
server_name ;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server;
break;
}
}
}
在可用站点和启用站点之间创建符号链接:
sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
重新启动Nginx代理服务
sudo service nginx restart
现在可以从80端口访问Jenkins。
45. 解释什么是管道即代码 Pipeline-as-code ?
Pipeline-as-code 是一种方法或一组功能,可用于在 Jenkins 源存储库中维护 CI/CD 工作流逻辑,而无需单独配置 Jenkins 分支。以下适用于在其根文件夹中具有名为 Jenkinsfile 的文件(包含管道脚本)的项目。管道语法有两种类型:声明式和语法。
1 声明性: 它提供了一种创建管道的简单方法,并具有用于创建 Jenkins 管道的预定义层次结构。可以控制管道的各个方面。
2 脚本化: 它通过轻量级执行器在 Jenkins master 上运行,该执行器使用很少的资源将管道转换为代码(命令)。
46. 简述如何实现Jenkins+sonar构建代码扫描 ?
1,认识sonar。
Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量,通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。
通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。 在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
2,部署前准备。
主程序包:https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.5.zip
cli程序包:https://github.com/SonarSource/sonar-scanner-cli/archive/3.0.3.778.zip
中文语言包:https://github.com/SonarQubeCommunity/sonar-l10n-zh/archive/sonar-l10n-zh-plugin-1.19.zip
下载完成之后,将如上包传入服务器中。
#3,正式部署。
#1,依赖。
整个环境依赖jdk环境(官方建议使用OpenJDK 8),也要准备好maven工具在系统中,这两个的准备工作就不详细展示了。
对于主机配置的要求,官方建议是,实例需要至少2GB的RAM才能有效运行,并且1GB的可用RAM用于操作系统。磁盘方面,如果代码量足够大,那么应该给予足够大(150G)的磁盘,并且是出色读写性能的硬盘。
本次部署也是在Jenkins主机上直接进行的部署操作
#2,创建数据库。
关于数据库,如果选择MySQL,那么官方建议的是5.6和5.7这两个版本,这里我使用5.6版本的。
通过 curl 192.168.10.10/a | sh进行安装,安装完成之后,创建如下数据库:
mysql> CREATE DATABASE sonar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;
#3,使用普通用户。
这里使用普通用户来管理sonar,因为后边如果使用root启动会报错,这个还真别不听,如果不信,可以自己测试一下,主要是到时候的elasticsearch组件会因为root启动而报错can not run elasticsearch as root,所以还是乖乖的使用普通用户来部署吧。
[root@localhost ~] u s e r a d d s o n a r [ r o o t @ l o c a l h o s t ] useradd sonar [root@localhost ~] useraddsonar[root@localhost ]passwd sonar
给刚刚创建的普通用户以sudo权限。
[root@localhost opt] v i m / e t c / s u d o e r s 在第 93 行添加如下内容: s o n a r A L L = ( A L L ) A L L 顺便在这个当口,将程序的文件打开数放开一下: [ r o o t @ j e n k i n s ] vim /etc/sudoers 在第93行添加如下内容: sonar ALL=(ALL) ALL 顺便在这个当口,将程序的文件打开数放开一下: [root@jenkins ~] vim/etc/sudoers在第93行添加如下内容:sonarALL=(ALL)ALL顺便在这个当口,将程序的文件打开数放开一下:[root@jenkins ]vim /etc/security/limits.conf
在最末尾添加:
sonarqube - nofile 65536
sonarqube - nproc 2048
#4,SonarQube安装。
以下操作将在刚刚创建的普通用户sonar下进行。
1,先将刚刚的文件传输到服务器。
[sonar@jenkins ~] l s s o n a r − l 10 n − z h − s o n a r − l 10 n − z h − p l u g i n − 1.19. z i p s o n a r q u b e − 6.7.5. z i p s o n a r − s c a n n e r − c l i − 3.0.3.778. z i p 2 ,解压部署 s o n a r q u b e 。 [ s o n a r @ j e n k i n s ] ls sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip sonarqube-6.7.5.zip sonar-scanner-cli-3.0.3.778.zip 2,解压部署sonarqube。 [sonar@jenkins ~] lssonar−l10n−zh−sonar−l10n−zh−plugin−1.19.zipsonarqube−6.7.5.zipsonar−scanner−cli−3.0.3.778.zip2,解压部署sonarqube。[sonar@jenkins ]unzip sonarqube-6.7.5.zip
[sonar@jenkins ~] m v s o n a r q u b e − 6.7.5 s o n a r q u b e [ s o n a r @ j e n k i n s ] mv sonarqube-6.7.5 sonarqube [sonar@jenkins ~] mvsonarqube−6.7.5sonarqube[sonar@jenkins ]ll sonarqube
total 12
drwxr-xr-x 8 sonar sonar 136 Aug 6 10:29 bin
drwxr-xr-x 2 sonar sonar 50 Aug 6 10:20 conf
-rw-r--r-- 1 sonar sonar 7651 Aug 6 10:20 COPYING
drwxr-xr-x 2 sonar sonar 24 Aug 6 10:20 data
drwxr-xr-x 7 sonar sonar 150 Aug 6 10:29 elasticsearch
drwxr-xr-x 4 sonar sonar 40 Aug 6 10:20 extensions
drwxr-xr-x 9 sonar sonar 140 Aug 6 10:29 lib
drwxr-xr-x 2 sonar sonar 6 Aug 6 10:20 logs
drwxr-xr-x 2 sonar sonar 24 Aug 6 10:20 temp
drwxr-xr-x 9 sonar sonar 4096 Aug 6 10:29 web
3,将mysql启动包导入。
包名称mysql-connector-java-5.1.40.jar,此包在maven.aliyun.com (opens new window)里边搜索一下即可找到,上边的完整包里边已经包含。
下载之后传到服务器,放在对应目录下:
[sonar@jenkins ~] m k d i r s o n a r q u b e / e x t e n s i o n s / j d b c − d r i v e r / m y s q l [ s o n a r @ j e n k i n s ] mkdir sonarqube/extensions/jdbc-driver/mysql [sonar@jenkins ~] mkdirsonarqube/extensions/jdbc−driver/mysql[sonar@jenkins ]mv mysql-connector-java-5.1.40.jar sonarqube/extensions/jdbc-driver/mysql/
注意其中的路径,不要放错位置了。
4,配置sonarqube。
sonar的配置文件在/home/sonar/sonarqube/conf/sonar.properties。
[sonar@jenkins ~]$vim /home/sonar/sonarqube/conf/sonar.properties
配置如下三条:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
当然,如果数据库不在本机,那么localhost可以更改为对应主机ip。
下面是可以配置的一些其他参数:
#sonar.jdbc.maxActive=60
#sonar.jdbc.maxIdle=5
#sonar.jdbc.minIdle=2
#sonar.jdbc.maxWait=5000
#sonar.jdbc.minEvictableIdleTimeMillis=600000
#sonar.jdbc.timeBetweenEvictionRunsMillis=30000
保存出来。
#5,sonar-scanner安装。
1,解压之后配置。
[sonar@jenkins ~] u n z i p s o n a r − s c a n n e r − c l i − 3.0.3.778. z i p [ s o n a r @ j e n k i n s ] unzip sonar-scanner-cli-3.0.3.778.zip [sonar@jenkins ~] unzipsonar−scanner−cli−3.0.3.778.zip[sonar@jenkins ]mv sonar-scanner-cli-3.0.3.778 sonar-scanner
[sonar@jenkins ~] l l s o n a r − s c a n n e r t o t a l 52 − r w − r w − r − − 1 s o n a r s o n a r 2585 M a y 122017 a p p v e y o r . p s 1 − r w − r w − r − − 1 s o n a r s o n a r 351 M a y 122017 a p p v e y o r . y m l d r w x r w x r − x 4 s o n a r s o n a r 48 M a y 122017 i t − r w − r w − r − − 1 s o n a r s o n a r 7635 M a y 122017 L I C E N S E . t x t − r w − r w − r − − 1 s o n a r s o n a r 179 M a y 122017 N O T I C E . t x t − r w − r w − r − − 1 s o n a r s o n a r 12308 M a y 122017 p o m . x m l − r w − r w − r − − 1 s o n a r s o n a r 812 M a y 122017 R E A D M E . m d − r w − r w − r − − 1 s o n a r s o n a r 264 M a y 122017 r u n i n t e g r a t i o n t e s t s . s h d r w x r w x r − x 4 s o n a r s o n a r 30 M a y 122017 s r c − r w − r w − r − − 1 s o n a r s o n a r 166 M a y 122017 t h i r d − p a r t y − l i c e n s e s . s h − r w x r − x r − x 1 s o n a r s o n a r 475 M a y 122017 t r a v i s . s h 2 ,编译打包。注意,这个地方是要进行一些配置的,但是目前这种情况是无法配置的,也就是说,这个 c l i 需要编译之后才能够使用,那么可以通过 m a v e n 工具进行编译,也可以直接在安装包里下载可用的包。如果你的 m a v e n 工具已经配置好了,那么可以直接运行如下命令构建: [ s o n a r @ j e n k i n s s o n a r − s c a n n e r ] ll sonar-scanner total 52 -rw-rw-r-- 1 sonar sonar 2585 May 12 2017 appveyor.ps1 -rw-rw-r-- 1 sonar sonar 351 May 12 2017 appveyor.yml drwxrwxr-x 4 sonar sonar 48 May 12 2017 it -rw-rw-r-- 1 sonar sonar 7635 May 12 2017 LICENSE.txt -rw-rw-r-- 1 sonar sonar 179 May 12 2017 NOTICE.txt -rw-rw-r-- 1 sonar sonar 12308 May 12 2017 pom.xml -rw-rw-r-- 1 sonar sonar 812 May 12 2017 README.md -rw-rw-r-- 1 sonar sonar 264 May 12 2017 run_integration_tests.sh drwxrwxr-x 4 sonar sonar 30 May 12 2017 src -rw-rw-r-- 1 sonar sonar 166 May 12 2017 third-party-licenses.sh -rwxr-xr-x 1 sonar sonar 475 May 12 2017 travis.sh 2,编译打包。 注意,这个地方是要进行一些配置的,但是目前这种情况是无法配置的,也就是说,这个cli需要编译之后才能够使用,那么可以通过maven工具进行编译,也可以直接在安装包里下载可用的包。 如果你的maven工具已经配置好了,那么可以直接运行如下命令构建: [sonar@jenkins sonar-scanner] llsonar−scannertotal52−rw−rw−r−−1sonarsonar2585May122017appveyor.ps1−rw−rw−r−−1sonarsonar351May122017appveyor.ymldrwxrwxr−x4sonarsonar48May122017it−rw−rw−r−−1sonarsonar7635May122017LICENSE.txt−rw−rw−r−−1sonarsonar179May122017NOTICE.txt−rw−rw−r−−1sonarsonar12308May122017pom.xml−rw−rw−r−−1sonarsonar812May122017README.md−rw−rw−r−−1sonarsonar264May122017runintegrationtests.shdrwxrwxr−x4sonarsonar30May122017src−rw−rw−r−−1sonarsonar166May122017third−party−licenses.sh−rwxr−xr−x1sonarsonar475May122017travis.sh2,编译打包。注意,这个地方是要进行一些配置的,但是目前这种情况是无法配置的,也就是说,这个cli需要编译之后才能够使用,那么可以通过maven工具进行编译,也可以直接在安装包里下载可用的包。如果你的maven工具已经配置好了,那么可以直接运行如下命令构建:[sonar@jenkinssonar−scanner]mvn clean install
打包之后,会多出一个target目录,查看里边的文件
[sonar@jenkins sonar-scanner] l s t a r g e t / a r c h i v e − t m p g e n e r a t e d − s o u r c e s m a v e n − a r c h i v e r o r i g i n a l − s o n a r − s c a n n e r − c l i − 3.0.3 − S N A P S H O T . j a r s o n a r − s c a n n e r − c l i − 3.0.3 − S N A P S H O T . j a r s u r e f i r e − r e p o r t s c l a s s e s g e n e r a t e d − t e s t − s o u r c e s m a v e n − s t a t u s s o n a r − s c a n n e r − 3.0.3 − S N A P S H O T . z i p s o n a r − s c a n n e r − c l i − 3.0.3 − S N A P S H O T − s o u r c e s . j a r t e s t − c l a s s e s 而那个 s o n a r − s c a n n e r − 3.0.3 − S N A P S H O T . z i p 就是我们需要的文件了。拿出来,重新操作一波。 [ s o n a r @ j e n k i n s s o n a r − s c a n n e r ] ls target/ archive-tmp generated-sources maven-archiver original-sonar-scanner-cli-3.0.3-SNAPSHOT.jar sonar-scanner-cli-3.0.3-SNAPSHOT.jar surefire-reports classes generated-test-sources maven-status sonar-scanner-3.0.3-SNAPSHOT.zip sonar-scanner-cli-3.0.3-SNAPSHOT-sources.jar test-classes 而那个sonar-scanner-3.0.3-SNAPSHOT.zip就是我们需要的文件了。 拿出来,重新操作一波。 [sonar@jenkins sonar-scanner] lstarget/archive−tmpgenerated−sourcesmaven−archiveroriginal−sonar−scanner−cli−3.0.3−SNAPSHOT.jarsonar−scanner−cli−3.0.3−SNAPSHOT.jarsurefire−reportsclassesgenerated−test−sourcesmaven−statussonar−scanner−3.0.3−SNAPSHOT.zipsonar−scanner−cli−3.0.3−SNAPSHOT−sources.jartest−classes而那个sonar−scanner−3.0.3−SNAPSHOT.zip就是我们需要的文件了。拿出来,重新操作一波。[sonar@jenkinssonar−scanner]mv target/sonar-scanner-3.0.3-SNAPSHOT.zip ~/
[sonar@jenkins sonar-scanner] c d [ s o n a r @ j e n k i n s ] cd [sonar@jenkins ~] cd[sonar@jenkins ]unzip sonar-scanner-3.0.3-SNAPSHOT.zip
[sonar@jenkins ~] l s s o n a r − l 10 n − z h − s o n a r − l 10 n − z h − p l u g i n − 1.19. z i p s o n a r q u b e − 6.7.5. z i p s o n a r − s c a n n e r − 3.0.3 − S N A P S H O T s o n a r − s c a n n e r − c l i − 3.0.3.778. z i p s o n a r q u b e s o n a r − s c a n n e r s o n a r − s c a n n e r − 3.0.3 − S N A P S H O T . z i p [ s o n a r @ j e n k i n s ] ls sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip sonarqube-6.7.5.zip sonar-scanner-3.0.3-SNAPSHOT sonar-scanner-cli-3.0.3.778.zip sonarqube sonar-scanner sonar-scanner-3.0.3-SNAPSHOT.zip [sonar@jenkins ~] lssonar−l10n−zh−sonar−l10n−zh−plugin−1.19.zipsonarqube−6.7.5.zipsonar−scanner−3.0.3−SNAPSHOTsonar−scanner−cli−3.0.3.778.zipsonarqubesonar−scannersonar−scanner−3.0.3−SNAPSHOT.zip[sonar@jenkins ]rm -rf sonar-scanner
[sonar@jenkins ~] m v s o n a r − s c a n n e r − 3.0.3 − S N A P S H O T s o n a r − s c a n n e r 3 ,配置。接下来才可正式进入 c l i 的配置。 [ s o n a r @ j e n k i n s ] mv sonar-scanner-3.0.3-SNAPSHOT sonar-scanner 3,配置。 接下来才可正式进入cli的配置。 [sonar@jenkins ~] mvsonar−scanner−3.0.3−SNAPSHOTsonar−scanner3,配置。接下来才可正式进入cli的配置。[sonar@jenkins ]vim /home/sonar/sonar-scanner/conf/sonar-scanner.properties
将如下三句添加在文件末尾:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
#6,配置环境变量。
这里切回到root用户进行添加。
[root@jenkins ~]KaTeX parse error: Expected 'EOF', got '#' at position 25: ...profile 在末尾添加: #̲set sonar-quebe...PATH: S O N A R H O M E / b i n / l i n u x − x 86 − 64 : SONAR_HOME/bin/linux-x86-64: SONARHOME/bin/linux−x86−64:SONAR_RUNNER_HOME/bin
加载配置,注意,在加载之前,请确保主机目录与我上边的是一致的,否则可能出现环境被搞乱的风险。
[sonar@jenkins ~]$source /etc/profile
#7,运行sonarqube。
[sonar@jenkins ~] c d s o n a r q u b e / b i n / l i n u x − x 86 − 64 / [ s o n a r @ j e n k i n s l i n u x − x 86 − 64 ] cd sonarqube/bin/linux-x86-64/ [sonar@jenkins linux-x86-64] cdsonarqube/bin/linux−x86−64/[sonar@jenkinslinux−x86−64]ls
lib sonar.sh wrapper
[sonar@jenkins linux-x86-64] . / s o n a r . s h U s a g e : . / s o n a r . s h c o n s o l e ∣ s t a r t ∣ s t o p ∣ r e s t a r t ∣ s t a t u s ∣ d u m p [ s o n a r @ j e n k i n s l i n u x − x 86 − 64 ] ./sonar.sh Usage: ./sonar.sh { console | start | stop | restart | status | dump } [sonar@jenkins linux-x86-64] ./sonar.shUsage:./sonar.shconsole∣start∣stop∣restart∣status∣dump[sonar@jenkinslinux−x86−64]./sonar.sh start
关于启动脚本的各项参数,已经在上边展示出来了,可以尝试一下。
等待一会儿,就可以访问了。
通过192.168.10.3:9000进行访问。
image
点击login,用户名密码默认为admin/admin进行登入。
开始有一个教程,不过先跳过:
image
#8,配置开机自启动。
我的主机用的是CentOS-7。
先将启动命令加入环境中。
[root@jenkins ~] l n − s / h o m e / s o n a r / s o n a r q u b e / b i n / l i n u x − x 86 − 64 / s o n a r . s h / u s r / b i n / s o n a r 验证一下: [ r o o t @ j e n k i n s ] ln -s /home/sonar/sonarqube/bin/linux-x86-64/sonar.sh /usr/bin/sonar 验证一下: [root@jenkins ~] ln−s/home/sonar/sonarqube/bin/linux−x86−64/sonar.sh/usr/bin/sonar验证一下:[root@jenkins ]sonar status
SonarQube is running (36982).
然后创建service管理方式。
[root@jenkins ~]$vim /etc/init.d/sonar
添加如下内容:
#!/bin/bash
#rc file for SonarQube
#chkconfig: 345 96 10
#description: SonarQube system (www.sonarsource.org)
###BEGIN INIT INFO
#Provides: sonar
#Required-Start: $network
#Required-Stop: $network
#Default-Start: 3 4 5
#Default-Stop: 0 1 2 6
#Short-Description: SonarQube system (www.sonarsource.org)
#Description: SonarQube system (www.sonarsource.org)
###END INIT INFO
/usr/bin/sonar ∗ 简单配置: [ r o o t @ j e n k i n s ] * 简单配置: [root@jenkins ~] ∗简单配置:[root@jenkins ]chmod 755 /etc/init.d/sonar
[root@jenkins ~] c h k c o n f i g − − a d d s o n a r [ r o o t @ j e n k i n s ] chkconfig --add sonar [root@jenkins ~] chkconfig−−addsonar[root@jenkins ]chkconfig sonar on
测试一下:
[root@jenkins ~]$service sonar status
SonarQube is running (36982).
#9,插件安装。
这里主要先安装一个中文语言包的插件。
插件下载地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh
唯一要注意的问题就是,版本要与刚刚安装的相对应。
image
下载之后传入到服务器当中。
[sonar@jenkins ~] u n z i p s o n a r − l 10 n − z h − s o n a r − l 10 n − z h − p l u g i n − 1.19. z i p [ s o n a r @ j e n k i n s ] unzip sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip [sonar@jenkins ~] unzipsonar−l10n−zh−sonar−l10n−zh−plugin−1.19.zip[sonar@jenkins ]ll sonar-l10n-zh-sonar-l10n-zh-plugin-1.19
total 8
drwxrwxr-x 4 sonar sonar 79 Nov 14 2017 compare
-rw-rw-r-- 1 sonar sonar 3436 Nov 14 2017 pom.xml
-rw-rw-r-- 1 sonar sonar 983 Nov 14 2017 README.md
drwxrwxr-x 4 sonar sonar 30 Nov 14 2017 src
同样这里需要编译之后才能使用,当然也可以在刚才的链接当中直接下载所需的jar包。
[sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19] m v n c l e a n i n s t a l l 同样的,编译完成之后会多一个 t a r g e t 的目录。 [ s o n a r @ j e n k i n s s o n a r − l 10 n − z h − s o n a r − l 10 n − z h − p l u g i n − 1.19 ] mvn clean install 同样的,编译完成之后会多一个target的目录。 [sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19] mvncleaninstall同样的,编译完成之后会多一个target的目录。[sonar@jenkinssonar−l10n−zh−sonar−l10n−zh−plugin−1.19]ll target/
total 40
drwxrwxr-x 3 sonar sonar 17 Nov 6 13:48 classes
drwxrwxr-x 3 sonar sonar 25 Nov 6 13:48 generated-sources
drwxrwxr-x 3 sonar sonar 30 Nov 6 13:48 generated-test-sources
drwxrwxr-x 2 sonar sonar 28 Nov 6 13:48 maven-archiver
drwxrwxr-x 3 sonar sonar 35 Nov 6 13:48 maven-status
-rw-rw-r-- 1 sonar sonar 38340 Nov 6 13:48 sonar-l10n-zh-plugin-1.19-RC2-SNAPSHOT.jar
drwxrwxr-x 2 sonar sonar 123 Nov 6 13:48 surefire-reports
drwxrwxr-x 3 sonar sonar 17 Nov 6 13:48 test-classes
我们所需要的就是编译出来的jar包,把jar包移动到/home/sonar/sonarqube/extensions/plugins目录下即可。
[sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19] m v t a r g e t / s o n a r − l 10 n − z h − p l u g i n − 1.19 − R C 2 − S N A P S H O T . j a r / h o m e / s o n a r / s o n a r q u b e / e x t e n s i o n s / p l u g i n s / 移动之后重启一下服务即可。 [ s o n a r @ j e n k i n s ] mv target/sonar-l10n-zh-plugin-1.19-RC2-SNAPSHOT.jar /home/sonar/sonarqube/extensions/plugins/ 移动之后重启一下服务即可。 [sonar@jenkins ~] mvtarget/sonar−l10n−zh−plugin−1.19−RC2−SNAPSHOT.jar/home/sonar/sonarqube/extensions/plugins/移动之后重启一下服务即可。[sonar@jenkins ]/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh restart
重启完成之后,再去浏览器刷新一下,发现系统已经变成中文的了。
#4,Jenkins构建。
#1,添加插件。
首先在Jenkins当中下载对应的插件。
插件安装完成之后,在jenkins的"系统管理"--》"系统设置", 就能看到SonarQube servers的配置点,截图如下:
#2,添加用户。
配置之前,需要先在sonar当中添加一个连接用户。
这里创建一个用户,用户名为test,秘钥复制下来。回到刚刚Jenkins处进行配置:
注意这里的URL,应当填写部署sonar的主机ip,即便你是同样部署的Jenkins本机的,也不要写成localhost,因为在后边会用到这个配置信息。
#3,添加工具。
在Jenkins的系统管理中的全局工具当中,添加sonar工具。
此同时,不用多说的,也应将jdk的工具,maven的工具配置完善。
#4,创建一个测试项目。
创建一个maven风格的名称为test-sonar的项目。
过程不详细说了,直接看截图。
其中的sonar片段,除了定义一个名称,选中刚刚添加的jdk工具,重要的就是当中的那段配置了。
内容如下:
#项目key (随意输入,必填项)
sonar.projectKey=test-sonar
#项目名称和版本(必填项)
sonar.language=java
sonar.projectVersion=1.0
sonar.sourceEncoding =UTF-8
sonar.projectName=test-sonar
#源码位置(必填项,相对于jenkins的workspace路径,例如,我此时的绝对路径为~/.jenkins/workspace/Test/test-webapp/src/main/java)
sonar.sources=src/main/java
#编译后的class位置(必填项,旧版本此项可不填,建议还是填入,相对路径同上)
sonar.java.binaries=target/classes
然后保存项目,构建一次。
在构建界面中,可以看到一些不一样的东东。
左侧的SonarQube点击之后可以直接跳转到这个项目对应的sonar中的结果。
#5,查看结果。
来到sonar界面当中,刷新一下,首先映入眼帘的,就是我们刚刚定义的一个test-sonar的项目展示。