-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
通常企业都会将持续集成和持续交付的过程标准化一个单独的生态系统,将涉及的特定工具标准化。
- 与代码库集成后,每当检测到代码库变更,自动触发针对新提交代码集成测试
- 频繁持续地提交会尽早发现隐藏的问题
- 部署服务器将成功的制品部署到应用服务器
Jenkins是用Java编写的开源的构建服务器,用来触发构建的,调用Maven、Gradle等工具,按依赖顺序构建,将构建流程标准化。
常用应用场景
- 创建一个项目, 手动可以构建, 完成一些简单任务, 比如下载代码后进行编译
- 编译失败邮件通知客户
- 用户可以选择不同参数进行构建
- 代码改动后自动触发某个构建,或者定时触发某个项目构建
- 一个项目构建完成后可以自动调用另一个项目的构建,完成一连串的任务
- 并发构建
主要Job类型
- Freestyle project 自由风格项目,Jenkins最主要的项目类型
- Maven Project Maven项目专用,类似Freestyle,更简单
- Multi-configuration project 多配置项目,适合需要大量不同配置(环境,平台等)构建
- Pipeline 流水线项目,适合使用pipeline(workflow)插件功能构建流水线任务,或者使用Freestyle project 不容易实现的复杂任务
- Multibranch Pipeline 多分支流水线项目,根据SCM仓库中的分支创建多个Pipeline项目
架构图
Jenkins 系统架构图
Jenkins 分布式架构图
主要的编译工具
- Maven:pom文件描述所需的构建依赖
- Gradle
- NPM、NG
- FPM:直接从命令行生成适合构建的源代码RPM包
- 。。。。。。
构建从机
构建本身应该尽可能健壮,并且可以在任何构建主机上重复执行。
- 可以通过增加构建从机,来减少构建队列,提高并行构建效率
- 增加构建从机的方式:SSH和Java JNLP方式
- 基于Linux操作系统的主机最为合适,因为大多数构建工具可安装
触发器
除了通过hook方式与代码库关联外,Jenkins本身也提供了触发机制
- 轮询构建
- 夜间定时构建
- 上游任务触发
pipeline
- 可以通过配置文件来配置
- 使用Groovy DSL来描述任务,相比在web页面设置,易于管理
- 支持在web页面可视化构建顺序
Jenkins文件系统
了解构建如何最终反映到文件系统中有利于更好地使用。
- 每一个任务都有自己的目录,包含任务描述XML文件和工作区(worksapce)目录
- 任务XML文件可以备份到另一台服务器上,便于发生灾难性故障后重建Jenkins服务器,或者只用专用的备份插件。
- 运行构建任务会消耗大量的存储空间,可以通过配置管理工具在必要时清理,或者配置保留一定构建数量的空间。
质量标准
- Jenkins可以用来校检软件质量指标,例如在任务中执行并可视化Java的单元测试。
- 更常见的方案是使用Sonar,在构建阶段运行并传送到Sonar服务器上,存储结果并可视化。
- 适当设置代码质量指标,产品问题优先。
- 现有产品问题被完全解决之前,不要在损坏的代码上提交新代码。
构建状态可视化
让每个人都能查看到自身参与的流程与结果,是达成共识的最简方法。
- 利用插件生成简化的任务状态概览,可以在web页面显示
- 在显著位置的公共显示器radar上显示这个web页面,,便于团队立刻觉察构建状态
1 - Jenkins简介
Jenkins是一个开源项目,其前身为Hudson,旨在提供一个开放易用的持续集成工具,用于监控持续重复的工作。
主要用于自动而持续地构建/测试软件项目;监控外部调用执行的工作。
Jenkins是驱动整个持续交付和DevOps的核心组件,能够实现项目的自动构建、打包、测试、发布等。
- 易于安装、易于配置、插件众多、具有分布式主从结构
- 提供了不同类型、不同规模的项目的CI/CD解决方案
- 版本迭代和维护速度快
- 作为易用的CI系统,有助于开发者从繁杂的集成中解脱出来,专注更为重要的业务逻辑实现
- 监控集成中存在的错误,提供详细的日志文件和提醒功能
- 以图表的形式形象地展示项目构建的趋势和稳定性
1.1 Jenkins的用途
总的说来,使用Jenkins的流水线处理可以定义各种各样的操作(比如构建、测试等),并将这些操作像管道(pipe)一样自由地组合,从而自动、流畅地执行一系列处理。
不仅可以轻松地管理或执行构建、测试等单个工作,还能将这些工作连接起来批量执行,确保操作的安全性和准确性,减少操作负担,提高操作效率。
- 可以将操作以项目(project)为单位整合到一起运行,更加简单地进行命令操作。
- 消除了手工操作,是操作变得更加安全、可靠。
- 可以将项目的运行记录和结果保存下来,以供整个团队查看。
具体说来,就是完成了如下操作:
- 流水线列表 :显示每个流水线的总体状态
- 构建项目:自动化打包,避免本地配置出错而导致打包失败等异常情况
- 跑测试用例检测bug:自动化测试,例如:只要代码发生改动,就运行回归测试的所有用例
- 静态代码检测:检测基本的代码问题,比如潜在的内存泄露等
- 部署:随时部署,可以设定在打包完成之后的操作
- GUI:支持在GUI上对命令的参数进行修改,并在改写后运行
1.2 与任务和配置管理工具的区别
如果服务规模不大,可以将流水线工具同时当成任务和配置管理工具来使用。
但在大规模服务情况下,Jenkins并不具备执行处理的节点从整体上进行管理的功能,无法对支持服务运行的所有节点进行集中管理。
流水线工具不擅长执行节点管理等批处理任务,应当将此类操作从构建流水线工具中分离出来。
1.3 Jenkins的部署
单节点(Master)部署
这种部署适用于大多数项目,其构建任务较轻,数量较少,单个节点就足以满足日常开发所需。
多节点(Master-Slave)部署
通常规模较大,代码提交频繁(意味着构建频繁),自动化测试压力较大的项目都会采取这种部署结构。
在这种部署结构下,Master通常只充当管理者的角色,负责任务的调度,slave节点的管理,任务状态的收集等工作,而具体的构建任务则会分配给slave节点。
一个Master节点理论上可以管理的slave节点数是没有上限的,但通常随着数量的增加,其性能以及稳定性就会有不同程度的下降,具体的影响则因Master硬件性能的高低而不同。
多节点(Master-Slave)部署通常以“Jenkins + Docker”的方式来部署,可以避免当测试用例变得海量以后可能会造成的一些问题。
1.4 Jenkins的插件
插件是为了适应组织或用户的需求,增强Jenkins环境的功能的主要手段。
有 上千的插件可以安装在Jenkins主机上,来集成不同的构建工具, 云提供程序, 分析工具等。
插件以及它们的依赖能够自动地从更新中心下载。
更新中心 是一个由Jenkins项目运营的服务,提供了一个开源插件的清单,这些插件是由Jenkins社区的成员共同开发和维护的。
Jenkins 提供了几个不同的的方法在主机上安装插件:
- 在web UI使用 "插件管理器"。
- 使用Jenkins CLI install-plugin 命令。
最普遍的方式是 通过 Manage Jenkins > Manage Plugins (系统管理->管理插件)视图,选中相应插件,然后安装。
参考信息:https://jenkins.io/zh/doc/book/managing/plugins/
2 - 官网信息
2.1 英文官网
- HomePage:https://jenkins.io/
- Documentation:https://jenkins.io/doc/
- Developer:https://www.jenkins.io/doc/developer/
- Tutorials:https://jenkins.io/doc/tutorials/
- getting-started:https://jenkins.io/doc/pipeline/tour/getting-started/
- Wiki:https://wiki.jenkins.io/
2.2 中文官网
- 中文主页:https://jenkins.io/zh/
- 用户文档:https://jenkins.io/zh/doc/
- 入门指南:https://jenkins.io/zh/doc/pipeline/tour/getting-started/
- 教程:https://jenkins.io/zh/doc/tutorials/
- 用户手册:https://jenkins.io/zh/doc/book/
2.3 下载、镜像与包
- Download:https://jenkins.io/download/
- Mirrors:http://mirrors.jenkins.io/
- Package:https://pkg.jenkins.io/
- Plugins:https://plugins.jenkins.io/
Jenkins下载包的发布版本
- Weekly:每周发布,包含最新问题的修正和最新功能
- Long-term Support(LTS):从最近12周的发布版中选出的比较稳定的版本,适合保守的客户,提供更加稳定的功能
3 - 参考信息
- Jenkins中文网:http://www.jenkins.org.cn/
Jenkins2权威指南
- http://www.broadview.com.cn/book/5270
- https://resources.oreilly.com/examples/0636920064602
------------------------------------------------------------------------Jenkins - 【转】高效插件推荐 -----------------------------------------------------------------------------------------------------
开源版本的Jenkins具有三大能力:
- Master-Slave的分布式构建调度能力
- Pipeline编排能力
- 强大的开源生态(插件)能力
2017年4月,Jenkins创始人KK(Kohsuke Kawaguchi )来到中国,交流中他也明确表示Jenkins的成功主要取决于其开源生态系统,Jenkins有1400多个插件可供使用。
因为有开源的插件生态系统的存在,Jenkins要用得好,插件一定是不能少的,需要我们充分发现和使用插件来实现我们的需求,而不是重复造轮子,自己去实现。
但是面对林林总总的插件,到底该怎么选?
我的常用需求有哪些插件可以满足,笔者根据以往在企业中管理Jenkins的经验推荐如下常用的插件列表,希望大家基于Jenkins及其插件生态实现自己的持续交付与DevOps平台。
1 - 用户及权限
Jenkins 用户权限管理是Jenkins Administration中非常很重要的环节,由于大部分企业都会有自己的域控管理,所以和LDAP集成并基于用户组实现权限模型设计与管理是企业级Jenkins实践的重要内容。
LDAP
https://plugins.jenkins.io/ldap
允许使用LDAP对用户进行认证,LDAP 服务器可以为Active Directory 或者 OpenLDAP。Active Directory
https://plugins.jenkins.io/active-directory,
允许使用Active Directory对用户进行认证,同时结合诸如Matrix Authorization Strategy插件,可以识别用户所在的所有用户组,对用户授权进行灵活配置。
基于Windows Active Directory进行域管理的企业,推荐采用Active Directory。GitHub Authentication
https://plugins.jenkins.io/github-oauth
这个插件提供了使用GitHub进行用户认证和授权的方案。Matrix Authorization Strategy
https://plugins.jenkins.io/matrix-auth
提供了基于矩阵的授权策略,支持全局和项目级别的配置。Role-based Authorization Strategy
https://plugins.jenkins.io/role-strategy,
提供了一种基于角色(Role)的用户权限管理策略,支持创建global角色、Project角色、Slave角色,以及给用户分配这些角色。
是最常用的Jenkins权限策略和管理插件。
2 - 代码管理
Jenkins 项目中配置Source Code Management 去下载代码进行构建任务,是非常普遍的应用场景。
Jenkins插件支持很多SCM的系统,使用最常见的是Git 和SVN。
Git
https://plugins.jenkins.io/git
支持使用Github、GitLab、Gerrit等系统管理代码仓库。Subversion
https://plugins.jenkins.io/subversion
支持Subversion系统管理源代码,功能包括监视 Subversion 仓库变更来触发新的构建、自动更新执行机工作目录等。Maven
https://plugins.jenkins.io/maven-plugin
对 Maven 工程提供了更丰富的功能,包括:自动配置报告插件(如 JUnit、Findbugs 等),增量构建,并行构建等。
3 - 项目及视图
Jenkins中对Project 和 view的管理,是用户日常工作中使用很多的功能。
Folder
https://plugins.jenkins.io/cloudbees-folder,
支持用户使用目录管理项目,目录支持嵌套,并且支持目录中创建视图。List view
Jenkins 默认支持List类型的视图,用户可以创建List视图过滤所关心的项目。Sectioned View
https://plugins.jenkins.io/sectioned-view,
支持一种新的视图,视图可以分为多个部分,每部分可以单独配置显示所选择的项目信息。Nested View
https://plugins.jenkins.io/nested-view,
支持一种新的视图,以目录图标显示所包含的子视图,每个子视图显示所选项目信息。Build Pipeline
https://plugins.jenkins.io/build-pipeline-plugin
提供了一种Build Pipeline 视图,用于显示上、下游项目构建的关系。Performance Plugin
https://plugins.jenkins.io/performance
可以读取和解析测试框架输出的报告,并且在 Jenkins 上绘制性能和稳定性相关的图表。
4 - 构建触发
Jenkins支持多种Build 触发方式,尤其一些自动化触发方式非常有用
Build periodically
Jenkins 内置功能,可以设置类似crontab时间,周期性地自动触发构建。Poll SCM
Jenkins 内置功能,支持周期性地在后台检查所配置的SCM有没有更新,只有当有代码更新时才会触发构建。Trigger builds remotely (e.g., from scripts)
Jenkins 内置功能,远程触发构建,通过设置token可以支持远程脚本中触发Jenkins构建。Gerrit Trigger
https://plugins.jenkins.io/gerrit-trigger
将Jenkins集成到Gerrit code review中,支持Jenkins配置Gerrit服务器等信息,实现Gerrit event 触发Jenkins 构建。GitLab
https://plugins.jenkins.io/gitlab-plugin
将Jenkins 集成到GitLab web hook中,支持Gitlab 分支及Merge Request等相关事件触发Jenkins构建。GitHub Integration
https://plugins.jenkins.io/github-pullrequest
将Jenkins集成到GitHub中,支持Gitgub分支及Pull requests 触发Jenkins 构建。JIRA Trigger
https://plugins.jenkins.io/jira-trigger
将Jenkins集成到Jira WebHooks中,支持Jira issue的状态等变化时触发Jenkins构建。
5 - 构建参数
Jenkins除了支持普通的参数类型(布尔型、字符串型、多行文本型、选择型和文件型 )外,还有一些插件支持更加丰富实用的参数类型,比如参数间动态关联、多层级参数、隐藏参数等 。
nodelabelparameter
https://plugins.jenkins.io/nodelabelparameter
增加了一个新的参数类型,Node 和 Label,从而使用户通过参数可以选择项目构建运行的节点。其他插件
- https://plugins.jenkins.io/hidden-parameter
- https://plugins.jenkins.io/extended-choice-parameter
- https://plugins.jenkins.io/validating-string-parameter
- https://plugins.jenkins.io/extensible-choice-parameter
- https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin
6 - 构建任务及环境
围绕构建任务的一些实用功能。
Timestamper
在Jenkins控制台增加时间输出,可以方便定位。Publish Over SSH
将构建产物或者指定命令下发到指定主机。Workspace Cleanup
https://plugins.jenkins.io/ws-cleanup
支持在构建前后 删除或者部分删除workspacedescription setter
https://plugins.jenkins.io/description-setter
支持正则表达式匹配构建log输出,设置构建的描述build-name-setter
https://plugins.jenkins.io/build-name-setter
支持设置构建的显示名字,而不是默认的为#1,#2,……,#buildnumEnvironment Injector
https://plugins.jenkins.io/envinject
支持在构建任务的不同阶段插入环境变量,并且在构建结束导出所有的环境变量等功能。Build Pipeline plugin
https://github.com/jenkinsci/build-pipeline-plugin
可以让整个持续集成流程变得非常直观:项目管理员针对系统持续集成步骤设置一系列关联的任务,任务之间可以设置不同的触发条件,以确认何时需要人工介入。JIRA
https://plugins.jenkins.io/jira
可以让 Jenkins 任务和 JIRA 集成起来,项目管理者可以通过 JIRA 了解项目进度,开发者也可以通过该插件直接更改 JIRA 上的 issue 状态。
7 - 构建通知
把构建状态及时地通知用户。Jenkins支持多种主动和被动的通知方式。
Mailer
https://plugins.jenkins.io/mailer
支持基本的邮件通知功能,比如构建失败和构建恢复成功可以发送邮件通知给相关人员。Email Extension
https://plugins.jenkins.io/email-ext
支持定制邮件内容,触发条件以及邮件接收者,功能比基本邮件通知要灵活强大的多。Slack Notification
https://plugins.jenkins.io/slack
支持把构建结果推送到Slack channel。
8 - 容器化
Jenkins的Master-Slave架构实现了分布式构建,可以充分的横向扩展Slave来提升构建能力,将Slave容器化是目前主流的构建环境标准化、集群化和弹性化的方式。
docker-plugin
https://plugins.jenkins.io/docker-plugin
可以配置docker host ,从而动态的提供Jenkins Agent(Slave),运行构建后再销毁这个slave。kubernetes
https://plugins.jenkins.io/kubernetes
Jenkins 对执行机的管理一直比较弱,无法做到快速的扩容和缩容。
Kubernetes Plugin 通过引入 Kubernetes 的容器编排能力,让 Jenkins 执行机运行在 Kubernetes 环境中。
支持利用Kubernetes cluster 动态的提供Jenkins Agent(Slave),利用Kubernetes 调度机制来优化Jenkins 负载等。
9 - Admin相关插件
Configuration Slicing
https://plugins.jenkins.io/configurationslicing
支持批量修改项目配置SCM Sync Configuration Plugin
https://plugins.jenkins.io/scm-sync-configuration
可以自动将 Jenkins 任务配置同步到版本管理系统中。
还可以跟踪配置的变更情况,让项目管理人员能够清晰的了解任务的修改情况。Mask Passwords
https://plugins.jenkins.io/mask-passwords
支持遮挡构建log输出的password等敏感信息Backup
https://plugins.jenkins.io/backup
添加备份功能到Jenkins management
-----------------------------------------------------------------------Jenkins - 用户及权限------------------------------------------------------------------------------------------------------
LDAP 认证集成
Jenkins的系统用户来源支持多种方式,在大规模用户场景下,通过LDAP认证实现用户统一登录是常见的方式。
LDAP 简介
LDAP (lightweight directory access protocol,轻量级目录访问协议)是一种成熟、灵活且支持良好的、基于标准的与目录服务器交互的机制。
通常用于身份验证和存储有关用户、组和应用程序的信息,采用 LDAP 系统管理组织中的所有用户是常用的方式。
获取LDAP信息
需要的信息:LDAP服务器地址、用户组织信息、具有查询权限的用户
LDAP 插件
Jenkins 可以通过插件LDAP Plugin
与 LDAP 系统集成,实现用户登入。
更改全局配置
Dashboard --》Manage Jenkins --》Security --》Authentication --》Security Realm,选择 LDAP
根据提示填写信息
- Server、root DN、User search base、User search filter、Group search base、Group search filter等
- Manager DN、Manager Password、Display Name LDAP attribute、displayname、Email Address LDAP attribute等
重启
配置完成后重启Jenkins Server使LDAP生效,然后使用LDAP用户登录。
权限管理
- Jenkins可以为每个项目组配置权限,减少错误触发的情况
- 项目的规范标准是进行高效权限管理的基础:命名规则、群组划分等
- Jenkins提供多个类别的权限管理方式
- Jenkins可以通过集成Role-based Authorization Strategy 插件进行权限管理
Role-based Authorization Strategy 插件
更改全局安全配置
Dashboard --》Manage Jenkins --》Security --》Authorization
管理和分配角色
Dashboard --》Manage Jenkins --》Manage and Assign Roles
依次在Manage Roles页面和Assign Roles页面创建和授权 Global roles 和 Item roles
Note: Item roles 匹配的是项目名称。
凭据管理
Jenkins与其他系统集成和交互需要用到凭据(credentials)
Credentials 插件
使用Credentials Plugin
插件管理账号密码信息可以实现加密存储,而且不会在日志中输出
配置凭据
Credentials Plugin
安装完成后,可以进入到Credentials页面
Dashboard --》Manage Jenkins --》Credentials
默认存在global域,点击"global"可以查看到当前域的所有凭据信息
点击Add Credentials
可以创建凭据,根据需要和提示来选择和填写相关信息
创建完成后,可以在Dashboard --》Manage Jenkins --》Credentials页面查看到创建完成的凭据。
新建Item:创建新项目
---》Freestyle project:通用的项目创建方法
---》在新建项目页面(添加构建步骤)
---》构建
---》查看任务的构建历史(Build History)
在已有项目页面点击“配置”,或者在新建项目过程中选择“构建触发器”
---》配置界面的“构建触发器”标签
---》勾选“定时构建”
---》在“日程表”中,根据语法规则输入定时设置,并保存。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------