如何在CentOS7上设置Jenkins以进行持续开发集成
介绍
合并代码。 协调发布。 确定构建状态。 维护更新。 如果你对这些过程的挫败感有足够的了解,以至于这些词本身就让人头疼,你可能想研究一下 Jenkins CI。
维护任何项目,尤其是由多个团队成员同时开发的项目,以及可能包含许多功能、组件、语言和环境的项目,在最好的情况下都是一场斗争——在最坏的情况下,需要超人的壮举才能维持下去。
詹金斯是来帮忙的。 从根本上说是持续集成的解决方案——即 将所有代码不断合并到一个中央构建中的做法——Jenkins 充当项目运营的总部。 它可以从各个方面监控、规范、比较、合并和维护您的项目。
Jenkins 的核心是做两件事:自动集成和外部构建监控。 这意味着它可以极大地简化保持代码可维护性的过程,并密切关注构建的质量,确保当一些开发人员在准备好之前合并他们的代码时,你不会遇到令人讨厌的意外.
让我们深入了解 Jenkins 的外观以及如何使用它。
先决条件
要学习本教程,您将需要以下内容:
- CentOS 7 水滴
- 具有 sudo 权限的非 root 用户(如何在 Ubuntu 和 CentOS 上编辑 Sudoers 文件 解释了如何设置)。
本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudo
。
系统特定包与 WAR 文件
现在您知道了 Jenkins 是什么,您需要了解它是如何分布的。 Jenkins 在 Java 上运行,并以 WAR 文件的形式出现 — 包含 Web 应用程序并旨在在服务器上运行的相关内容的集合。 但是,Jenkins 的开发人员通过一些系统特定的软件包来扩展其易用性,这些软件包允许 Jenkins 作为受控服务运行。
Jenkins 软件包可用于 Red Hat 系列发行版,其中包括 CentOS 操作系统。 然而,CentOS 7 尤其是一个挑剔的品种,所以它需要不同的方法。 在其他基于 Red Hat 的操作系统(甚至其他 CentOS 版本)中运行的操作在 CentOS 7 中的运行方式往往不同,并且由此产生的潜在错误可能难以调试。 由于 Jenkins 软件包是通用的 Red Hat,而不是针对 CentOS 进行区分,因此遇到问题的可能性高于其他操作系统。 出于这个原因,我们不会通过这个包运行 Jenkins。 剩下的就是通过 Java 运行的 WAR 文件,这远不方便,需要我们通过 Java 手动启动和停止它。
幸运的是,有一种方法可以解决这个问题,即使没有软件包,我们也可以与 CentOS 合作,让它将 Jenkins 视为一种服务。
第 1 步 — 安装 Jenkins
在 CentOS 上安装 Jenkins 有两种基本方法:通过存储库或 repo,以及通过 WAR 文件。 从 repo 安装是首选方法,这是我们将首先概述的方法。
您需要 Java 来运行 Jenkins(任何一种方法),因此如果您的服务器还没有 Java,请使用以下命令安装它:
sudo yum -y install java
一般来说,如果你需要一个服务或工具,但你不确定是哪个包提供的,你总是可以通过运行来检查:
yum whatprovides service
其中 service
是您需要的服务或工具的名称。
从仓库安装
现在,运行以下命令从 Red Hat 存储库下载 Jenkins:
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
wget
工具将文件下载到“O”标志之后指定的文件名(这是大写的“O”,而不是零)。
然后,使用包管理器 RPM 导入验证密钥:
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
最后,通过运行安装 Jenkins:
sudo yum install jenkins
就是这样! 您现在应该能够将 Jenkins 作为服务启动:
sudo systemctl start jenkins.service
服务启动后,您可以检查其状态:
sudo systemctl status jenkins.service
这将为您提供相当长的读数,其中包含有关该过程如何启动以及它正在做什么的大量信息,但如果一切顺利,您应该会看到类似于以下内容的两行:
Loaded: loaded (/etc/systemd/system/jenkins.service; disabled) Active: active (running) since Tue 2015-12-29 00:00:16 EST; 17s ago
这意味着 Jenkins 服务已完成启动并正在运行。 您可以像以前一样访问 Web 界面,在 http://ip-of-your-machine:8080
处确认这一点。
同样,您可以停止服务:
sudo systemctl stop jenkins.service
或重新启动它:
sudo systemctl restart jenkins.service
有关使用 systemctl 管理服务的更多信息,请参阅 如何使用 Systemctl 管理 Systemd 服务和单元 文章。
从 WAR 文件安装
如果您出于某种原因选择不通过 repo 安装 Jenkins,您可以使用 WAR 文件完成相同的结果,但这需要更多的工作。
让我们首先将 Jenkins WAR 文件下载到服务器并毫不费力地运行它,以确保基础工作正常且没有任何麻烦。
在任何给定时间,最新版本的 Jenkins 都可以在 Jenkin's mirror 上找到。 您可以使用任何您喜欢的工具来下载此文件。 以下方法使用名为 wget
的命令行工具:
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
准备好后,通过 Java 启动 Jenkins:
java -jar jenkins.war
您应该会在控制台中看到指示 Jenkins 已开始运行的输出:
... INFO: Jenkins is fully up and running ...
您现在可以通过浏览器 (http://ip-of-your-machine:8080
) 访问界面。
确认 Jenkins 成功运行后,结束该过程,以便您可以对其进行更改以使其作为服务运行,如下一步所述。 要结束正在运行的前台进程,请按 CTRL-C
。
第 2 步 — 将 Jenkins 作为服务运行
如果在上一节中您选择不通过 repo 安装 Jenkins,而是使用 WAR 文件,您将无法像标准服务一样使用 Jenkins。 如果您确实使用了 repo,请跳过此步骤。
当我们按照以下方式配置 Jenkins 时,它仍然会通过 Java 运行,但您将能够将其视为服务,启动和停止它并轻松地让它在后台运行。 该服务本质上将作为一个包装器工作。
首先,确保您下载的 WAR 文件位于便于长期存储和使用的位置:
sudo cp jenkins.war /usr/local/bin/jenkins.war
然后,转到您的 /etc/systemd/system/
目录,并创建一个名为 jenkins.service
的新文件。 下面的演示使用 nano 编辑器,但自然你可以使用任何你想要的编辑工具。
cd /etc/systemd/system/ sudo nano jenkins.service
现在,将以下行添加到新的 jenkins.service
文件中。 稍后,我们将详细介绍这些行的作用。
/usr/local/bin/jenkins.war
[Unit] Description=Jenkins Service After=network.target [Service] Type=simple User=root ExecStart=/usr/bin/java -jar /usr/local/bin/jenkins.war Restart=on-abort [Install] WantedBy=multi-user.target
如果您以前看过配置文件(INI 文件或类似文件),您会认出这里使用的结构。 括号内的文字表示章节标题。 这意味着,例如,[Service]
声明了一个名为“Service”的节,并且它下面的所有分配都包含相关信息,然后系统将知道如何找到并与节头相关联。
包含此文件的配置文件通常是一个文本文件——这意味着它对计算机没有内在意义。 相反,文本文件将由某个进程解析,并且该进程将使用标题和其他信息来找到它的方法。 出于这个原因,给定配置文件的布局在技术上是无关紧要的——只要读取它的程序能够理解所有内容的含义。
第一部分 Unit
仅包含两个配置指令。 第一个只是一个名字。 它可以是您喜欢的任何名称,但理想情况下,它应该是唯一标识新流程的名称。 第二个指令说明了启动当前服务所需的服务(如果有的话)。
在下一节中,Type
指令允许您选择此服务将使用的启动类型。 值 simple
表示后面的指令 ExecStart
中提到的进程将是正在创建的服务的主要进程。 实际上,type
是不必要的,因为在未指定类型时假定 simple
,但为了清楚起见,我们将其保留。
User
指定哪个用户可以控制这个进程,Restart
用于表示,在这种情况下,如果进程终止但退出代码暗示错误,则将重新启动服务。 这对于在发生意外崩溃时保持服务的连续性很有用。
如前所述,ExecStart
是指示哪个进程将成为服务的主要操作的指令。 该指令代表 Jenkins 的主要包装器——该服务将通过 Java 运行 WAR,而不是将其视为前台进程。
最后,在 Install
部分,multi-user.target
表示一个目标,在 CentOS 7 之前称为运行级别。 它使系统了解提供该服务的资源以及用户需要的强度。
创建并保存文件后,您应该能够启动新的 Jenkins 服务!
准备好后,运行:
sudo systemctl daemon-reload
这会应用您对此单元所做的更改(实际上,它将更改应用于已更改的任何和所有单元)。
您现在应该能够将 Jenkins 作为服务启动:
sudo systemctl start jenkins.service
服务启动后,您可以检查其状态:
sudo systemctl status jenkins.service
这将为您提供相当长的读数,其中包含有关该过程如何启动以及它正在做什么的大量信息,但如果一切顺利,您应该会看到类似于以下内容的两行:
Loaded: loaded (/etc/systemd/system/jenkins.service; disabled) Active: active (running) since Tue 2015-12-29 00:00:16 EST; 17s ago
这意味着 Jenkins 服务已完成启动并正在运行。 您可以像以前一样访问 Web 界面,在 http://ip-of-your-machine:8080
处确认这一点。
同样,您可以停止服务:
sudo systemctl stop jenkins.service
或重新启动它:
sudo systemctl restart jenkins.service
有关使用 systemctl 管理服务的更多信息,请参阅 如何使用 Systemctl 管理 Systemd 服务和单元 文章。
第三步——创建用户
一旦 Jenkins 顺利运行,下一步就是建立良好的安全性。 从现在开始,您的具体行动将在很大程度上取决于您对 Jenkins 的目的。 但是,以下是有关如何最好地设置和使用 Jenkins 的一般指南,以及一些铺平道路的示例。
Jenkins 提供了安全和角色管理设置,对于控制访问和定义用户操作很有用。 我们将简要介绍这些概念。 要访问这些设置,请在服务运行后通过浏览器返回 Jenkins 界面 (http://ip-of-your-machine:8080
)。 您将在左侧看到一个菜单——从中选择 Manage Jenkins。 这将带您进入一个包含许多自定义选项的页面。 您可能还会注意到顶部的警报: 不安全的 Jenkins 允许网络上的任何人代表您启动进程。 至少考虑启用身份验证以阻止滥用。 这是 Jenkins 的指令,旨在让您在系统中引入一些安全元素。
第一步是转到 Configure Global Security,靠近管理 Jenkins 页面上链接列表的顶部。 选中 Enable security 的选项框以为此目的显示一组选项。 有多种方法可以在 Jenkins 上配置安全性 - 您可以阅读 使用 Jenkins 文档的 标准安全设置 部分中的深入解释。
这些选项中最直接的一种,也是我们今天要介绍的一种,让 Jenkins 使用自己的数据库来存储用户配置。 在我们标记复选框时出现的访问控制部分下,选择Jenkins自己的用户数据库。 简而言之,其他选项是将 Jenkins 链接到现有的 Unix 用户和组,使用组织范围的登录(LDAP 选项),或允许 Java servlet 管理访问。 其他选项可以通过插件添加(我们稍后会讨论插件)。
您是否应该允许新用户注册很大程度上取决于您自己的需求。 然而,一般来说,限制访问是值得的,并且允许用户随意注册可以允许一定程度的开放性,这可能是危险的。 要限制这一点,请取消选中标记为 允许用户注册 的复选框。 关闭此设置后,只有管理员可以创建新帐户。 稍后,您将为您将创建的用户提供管理权限,我们还将详细介绍如何添加新用户。
在 Authorization 下,选择 Matrix-based security 选项。 这允许在不诉诸复杂设置的情况下对控件进行一些微调。 您会看到一个名为 Anonymous 的用户已经存在。 匿名用户是来自任何地方的任何人,即使他们没有登录,这就是默认情况下匿名用户没有能力的原因。 由于这是 Jenkins 实例的初始设置,因此您必须授予此用户完全权限:现在除了匿名之外没有其他用户,并且您没有登录,因此关闭匿名权限将有效地阻止您访问 Jenkins一点也不。
使用 Anonymous 行右侧的小按钮选择所有权限。 接下来,使用 用户/组添加 输入字段来指定要为其添加权限的新用户。 请注意,这实际上并没有创建用户,而是为您将很快创建的用户指定权限。
通常,您将首先创建一个新用户,然后在表单的这一部分中为他们指定权限。 由于尚不存在用户,因此您将设置权限,然后创建用户。
输入用户名并按 Add。 由于 已知错误 ,建议您保持用户名小写。 以与匿名用户相同的方式授予新用户所有权限。 这实际上设置了一个新的管理员。
完成后,按 Apply,然后按 Save。
您将被自动带到一个注册页面,您可以从中创建一个新帐户。 您创建的帐户的用户名应与您之前为其指定权限的用户名相对应:
完成后,您应该会发现自己已自动登录。
返回安全页面(Manage Jenkins -> Configure Global Security)并向下滚动到安全矩阵。 现在您已经创建了一个管理用户,您可以限制匿名用户的权限。 取消选择匿名行中的所有权限,然后单击应用和保存。 您的新用户现在将是唯一有权访问 Jenkins 的用户。
如果您之前关闭了自动注册,您可能需要手动创建其他新用户。 就是这样:
返回管理Jenkins页面,向下滚动到底部附近,点击管理用户。 在左侧,您会看到一个带有链接的侧边栏; 单击创建用户。 以与创建第一个用户相同的方式输入新用户的信息,然后单击注册。 您将被重定向到用户列表,其中现在将包括新用户。 此用户将没有权限,因此您需要重复权限过程,转到 配置全局安全 ,使用 用户/组添加 字段向矩阵添加一行,指定权限,然后单击应用和保存。 为简单起见,如果您要创建多个用户,请先创建所有用户,然后再继续添加权限。
创建新用户时,请记住限制性可能是一项主要的安全资产。 您可以在 Use Jenkins 文档的 Matrix-based Security 部分了解更多关于基于矩阵的安全性的具体细节。
通常,下一步是为您的用户分配角色,控制他们的确切能力。 我们不会在本文中详细介绍,但是这是一篇关于主题的好文章。 请务必在分配角色后保存更改。
第 4 步 — 安装插件
一旦 Jenkins 安装完毕、配置最少并得到合理保护,就该让它满足您的需求了。 正如第一次安装时发现的那样,Jenkins 的能力相对较少。 事实上,Jenkins 代表了许多软件开发人员的信条:做一件事,并且把它做好。 Jenkins 通过充当您的软件项目的中间人来“做一件事”,并通过提供插件“做得很好”。
插件是允许 Jenkins 与各种外部软件交互或扩展其先天能力的附加组件。 与 Jenkins 设置的许多领域一样,您安装的确切插件将在很大程度上取决于您的项目。
在 Jenkins 的左侧主菜单中,单击 Manage Jenkins -> Manage Plugins。 您登陆的页面显示已安装但需要更新的插件 - 您可以轻松执行此操作通过选择要更新的插件并单击底部的按钮。
如果您从该页面单击 Available,您将进入可用插件的庞大列表。 显然,您不想安装所有可能的插件,所以下一个问题是如何选择您需要的插件。
如前所述,您在这件事上的选择将取决于您的需求和目标。 幸运的是,Jenkins wiki 按主题提供了一个很好的插件概要。
这个列表绝对值得细读,但无论你的项目是什么,都有一些插件几乎肯定应该包括在内。 这里有一些——一些通用的,一些具体的:
- 源代码控制 Git、SVN 和 Team Foundation Server 是一些更常见的源代码控制系统。 所有这三个在 Jenkins 列表中都有插件,其他的也存在于不太常见的系统中。 如果您不知道源代码控制是什么,您应该真正 了解它 并开始将其整合到您的项目中。 请务必为您的源代码控制系统安装插件,以便 Jenkins 可以通过它运行构建并控制测试。
- Copy Artifact 这个插件允许您在项目之间复制组件,如果您缺乏真正的依赖管理器,可以减轻设置类似项目的痛苦。
- Throttle Concurrent Builds 如果您有多个构建运行可能会引入冲突(由于共享资源等),这将很容易让您缓解这种担忧。
- 依赖关系图查看器 一个漂亮的插件,提供项目依赖关系的图形表示。
- Jenkins 磁盘使用 Jenkins 可能是相当轻量级的,但对于它所集成的项目而言,情况并非总是如此。 此插件可让您确定您的任何工作正在消耗多少计算资源。
- 构建工具 如果您的项目很大,您可能会使用构建管理器,例如 Maven 或 Ant。 Jenkins 为其中许多提供了插件,既可以链接它们的基本功能,也可以为单个构建步骤、投影配置和构建的许多其他方面添加控制。
- Reporting 虽然 Jenkins 提供了自己的报告,但您可以将此功能扩展到许多报告工具。
- 附加身份验证 如果默认的 Jenkins 安全功能不适合您,有很多插件可以扩展此功能 - 从 Google 登录到活动目录,再到对现有安全性的简单修改。
一般来说,如果您的项目需要某种工具,请在 wiki 上的插件列表页面中搜索它的名称或关于其功能的关键字——很可能存在这样的插件,这是一种找到它的有效方法。
在 可用 选项卡上选择要安装的那些插件后,单击标记为 立即下载并在重新启动后安装 的按钮。
现在 Jenkins 已按您希望的方式启动并运行,您可以开始使用它来支持您的项目集成。 Jenkins 的能力在其领域内几乎是无穷无尽的,但下面的示例应该用来展示 Jenkins 可以做的范围以及如何开始 Jenkins 工作。
第 5 步——创建一个简单的项目
您可以从 Jenkins 中获得很多有趣的用途,甚至玩弄这些设置也可以提供丰富的信息。 不过,要开始使用,了解如何设置基本任务会有所帮助。 按照本节中的示例了解如何建立和运行简单的作业。
在 Jenkins 界面主页中,选择 New Item。 输入名称并选择 Freestyle 项目。
下一页是您指定作业配置的地方。 您很快就会发现,当您创建一个新项目时,有许多可用的设置。 通常,更重要的控制之一是连接到源存储库。 出于此介绍性示例的目的,我们将跳过该步骤。
在此配置页面上,您还可以选择添加构建步骤以执行额外的操作,例如运行脚本。
这将为您提供一个文本框,您可以在其中添加您需要的任何命令。 使用它来运行各种任务,如服务器维护、版本控制、读取系统设置等。
我们将使用本节来运行脚本。 同样,出于演示目的,我们将保持非常简单。
如果需要,您也可以添加后续构建步骤。 请记住,如果任何段或单个脚本失败,则整个构建将失败。
您还可以选择要运行的构建后操作,例如将结果通过电子邮件发送给自己。
保存项目,您将被带到其项目概述页面。 在这里,您可以看到有关该项目的信息,包括其建造历史,但目前不会有任何信息,因为这是一个全新的项目。
点击左侧的Build Now开始构建。 您将立即看到构建历史记录更改以表明它正在运行。 完成后,状态图标将再次更改,以简洁的形式向您显示结果。
要查看更多信息,请单击构建历史记录区域中的该构建,然后您将被带到一个包含构建信息概述的页面:
此页面上的 Console Output 链接对于详细检查作业结果特别有用 - 它提供有关构建期间所采取的操作的信息并显示所有控制台输出。 特别是在构建失败之后,这可能是一个有用的地方。
如果你回到 Jenkins 主页,你会看到所有项目及其信息的概览,包括状态(在这种情况下只有一个):
状态有两种表示方式,一个是天气图标(在主页仪表板上,见上图)和一个彩色球(在单个项目页面上,见下图)。 天气图标特别有用,因为它在一张图像中显示了多个构建的记录。
在上图中,您会看到云,表示最近的一些构建成功,而一些失败。 如果他们都成功了,你会看到太阳的图像。 如果最近所有构建都失败了,则会出现一个糟糕的天气图标。
这些状态具有相应的工具提示和悬停说明,并与图表中的其他信息相结合,涵盖了您在概览中所需的大部分内容。
您还可以通过单击 (Build Now) 从此处重建项目。
当然,实施全面的项目设置将涉及更多步骤和一些微调,但很明显,无需太多努力,您就可以为您的项目设置一些非常有用、非常实用的监视器和控件。 探索 Jenkins,您会很快发现它是一个非常宝贵的工具。
结论
寻找其他教程、文章和视频是非常值得的——那里有很多,而且丰富的信息使设置与 Jenkins 的项目集成变得轻而易举。 Jenkins团队主持的教程值得一看。
特别是,弥合基础项目和成熟项目之间的差距是提高 Jenkins 技能的好方法。 尝试遵循 这些示例 作为一种简化过渡的方法。
此外,还有许多用于常见项目类型的模板,例如 PHP 应用程序 和 Drupal,因此很有可能您甚至不需要从头开始设置所有内容。 因此,走出去,了解有关 Jenkins 的所有内容,让您的生活变得更轻松!