如何在CentOS7上设置Jenkins以进行持续开发集成

来自菜鸟教程
跳转至:导航、​搜索

介绍

合并代码。 协调发布。 确定构建状态。 维护更新。 如果你对这些过程的挫败感有足够的了解,以至于这些词本身就让人头疼,你可能想研究一下 Jenkins CI。

维护任何项目,尤其是由多个团队成员同时开发的项目,以及可能包含许多功能、组件、语言和环境的项目,在最好的情况下都是一场斗争——在最坏的情况下,需要超人的壮举才能维持下去。

詹金斯是来帮忙的。 从根本上说是持续集成的解决方案——即 将所有代码不断合并到一个中央构建中的做法——Jenkins 充当项目运营的总部。 它可以从各个方面监控、规范、比较、合并和维护您的项目。

Jenkins 的核心是做两件事:自动集成和外部构建监控。 这意味着它可以极大地简化保持代码可维护性的过程,并密切关注构建的质量,确保当一些开发人员在准备好之前合并他们的代码时,你不会遇到令人讨厌的意外.

让我们深入了解 Jenkins 的外观以及如何使用它。

先决条件

要学习本教程,您将需要以下内容:

本教程中的所有命令都应以非 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 按主题提供了一个很好的插件概要。

这个列表绝对值得细读,但无论你的项目是什么,都有一些插件几乎肯定应该包括在内。 这里有一些——一些通用的,一些具体的:

  1. 源代码控制 Git、SVN 和 Team Foundation Server 是一些更常见的源代码控制系统。 所有这三个在 Jenkins 列表中都有插件,其他的也存在于不太常见的系统中。 如果您不知道源代码控制是什么,您应该真正 了解它 并开始将其整合到您的项目中。 请务必为您的源代码控制系统安装插件,以便 Jenkins 可以通过它运行构建并控制测试。
  2. Copy Artifact 这个插件允许您在项目之间复制组件,如果您缺乏真正的依赖管理器,可以减轻设置类似项目的痛苦。
  3. Throttle Concurrent Builds 如果您有多个构建运行可能会引入冲突(由于共享资源等),这将很容易让您缓解这种担忧。
  4. 依赖关系图查看器 一个漂亮的插件,提供项目依赖关系的图形表示。
  5. Jenkins 磁盘使用 Jenkins 可能是相当轻量级的,但对于它所集成的项目而言,情况并非总是如此。 此插件可让您确定您的任何工作正在消耗多少计算资源。
  6. 构建工具 如果您的项目很大,您可能会使用构建管理器,例如 Maven 或 Ant。 Jenkins 为其中许多提供了插件,既可以链接它们的基本功能,也可以为单个构建步骤、投影配置和构建的许多其他方面添加控制。
  7. Reporting 虽然 Jenkins 提供了自己的报告,但您可以将此功能扩展到许多报告工具。
  8. 附加身份验证 如果默认的 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 的所有内容,让您的生活变得更轻松!