持续集成和交付实用手册-二-

343 阅读34分钟

持续集成和交付实用手册(二)

原文:zh.annas-archive.org/md5/D4B1782DB08166E400DEF5DF3D2E1241

译者:飞龙

协议:CC BY-NC-SA 4.0

第六章:编写自由样式脚本

本章将详细介绍如何添加新的构建项目、配置构建作业、全局添加环境变量和项目级环境变量。您还将学习如何调试自由样式作业的问题。

本章将涵盖以下主题:

  • 创建一个简单的自由样式脚本

  • 配置自由样式作业

  • 添加环境变量

  • 调试自由样式作业的问题

技术要求

本章介绍了如何使用 Jenkins 创建简单的自由样式脚本。您应该对 Unix、Bash 有基本的了解,以及环境变量的含义。

创建一个简单的自由样式脚本

我们在本章中在 Jenkins 中创建了一个简单的自由样式脚本,但我们将快速回顾一下设置自由样式脚本项目所需做的事情。

Jenkins 仪表板导航

如果您按照第五章中的说明进行操作,Jenkins 的安装和基础知识,那么您应该已经在本地计算机上安装和/或运行了 Jenkins 服务。如果 Jenkins 没有在本地运行,请重新查看第五章,Jenkins 的安装和基础知识,并阅读与您的操作系统相对应的部分。

Jenkins 登录屏幕

如果 Jenkins 正在本地运行,您应该会看到一个登录屏幕。

输入您的用户名和密码信息,然后点击登录按钮。

Jenkins 仪表板

一旦您登录,您应该会被路由到 Jenkins 仪表板,它看起来像这样:

添加新的构建作业项目

在 Jenkins 仪表板中,有一个名为“新项目”的链接;确保单击它以添加新项目:

单击新项目后,您将被带到以下屏幕:

现在,根据您安装的 Jenkins 插件数量,您将在构建项目方面在屏幕上看到更多或更少的内容。我们将在本章中为目的输入一个名为Freestyle Scripting的名称,但您可以为构建作业选择任何名称。输入名称后,请确保点击 Freestyle Project 按钮,然后点击 OK 按钮。

构建配置选项

每当在 Jenkins 下创建新项目时,您将看到以下屏幕:

根据您已安装的 Jenkins 插件,您可能会看到更多选项卡或构建配置中的项目。

配置自由样式作业

请注意,构建作业配置有多个选项卡。您可以滚动到选项卡中的每个部分,也可以单击选项卡本身。每个选项卡都有不同的功能,您可以在 Jenkins 构建作业中配置它们。

一般

一般选项卡包含有关您正在创建的 Jenkins 构建的基本信息,例如描述和其他一般构建信息。查看一般选项卡信息:

通常由您决定要切换哪些选项;您可以单击问号符号获取信息。让我们看看“安静期”选项的含义:

要删除详细信息,只需再次单击问号符号。

源代码管理

源代码管理选项卡是您指定正在使用的版本控制管理系统类型的地方,例如 Git、SVN 和 Mercurial。为了构建作业的目的,我们将点击 Git 单选按钮并指定 GitHub 存储库 URL:

请注意,分支指定器默认为*/master 分支,但您可以通过点击“添加分支”按钮指定任意数量的分支。我们不会添加凭据,因为我们在本地工作,但如果您点击带有钥匙的“添加”按钮,您将看到以下叠加屏幕:

您可以通过点击“种类”输入框选择不同类型的凭据:

您还可以点击源代码管理选项卡底部的“添加”按钮,您将看到可以添加的其他行为:

还有许多高级配置选项,比如子模块,您可以进行配置。

构建触发器

构建触发器选项卡配置部分涉及配置构建作业触发的时间。这可能包括配置 GitHub 挂钩触发器,每当您将提交推送到 GitHub 的主分支时触发,触发另一个项目构建时触发,定期构建时触发,或者轮询您的版本控制系统以获取更改时触发:

我们勾选了“轮询 SCM”选项,这在我们的情况下是 GitHub,并且使用了一个在特定时间和日期运行 Jenkins 作业的 cron 语法。在我们的情况下,我们将触发轮询作业每 15 分钟运行一次。您可以点击问号符号了解更多语法信息。

稍后,我们将讨论如何使用 GitHub 和 Bitbucket 在您将代码推送到远程存储库时触发 Jenkins 作业,这比轮询更好。

构建环境

此部分将根据您安装的 Jenkins 插件的多少而有更多或更少的环境选项可供使用。在我的情况下,我安装了 Golang 和 Node.js 插件,但您可以安装任意数量的环境,比如 Clojure 和 Ruby:

由于我们正在构建一个 Golang 微库,我们在此配置部分中勾选了“设置 Go 编程语言工具”复选框。

构建

构建部分是您指定如何构建项目的地方:

如果您点击“添加构建步骤”按钮,您将看到以下选项:

我们将点击“执行 shell”选项,这将为我们提供一个 Unix shell 脚本环境来使用。

请注意,现在我们有一个文本区域可用,我们可以在其中添加 Unix 脚本命令:

我们将在此 shell 脚本中添加以下命令:go test

后置构建操作

在此构建部分,您可以指定成功构建后要运行的任何操作,比如运行代码覆盖和生成 JUnit 报告:

如果您点击“添加后置构建操作”按钮,您将看到以下选项:

根据您安装的具体 Jenkins 插件,您将看到更多或更少的选项。

一旦您对构建配置满意,点击“应用”按钮,这将保存您当前的配置选项,或者点击“保存”按钮,这将保存您的选项并将您导航到一个新配置的构建项目:

后置构建操作部分非常有价值,因为您可以在成功构建时调用其他服务,比如报告和收集指标。

添加环境变量

您可以以多种不同的方式在 Jenkins 中添加环境变量。

全局环境变量配置

从 Jenkins 仪表板,点击“管理 Jenkins”按钮:

一旦您点击“管理 Jenkins”按钮,您将需要点击“配置系统”按钮:

然后您将被导航到“配置系统”部分,然后可以使用全局属性部分添加环境变量:

请注意,我在这里添加了一个名称为SAMPLE_VALUE的值为Hello Book Readers的内容。现在,这个全局属性在 shell 环境变量中作为一个环境变量可用。您可以在这个部分添加尽可能多的环境变量。请注意,这个全局属性现在将对每个作业都可用。

EnvInject 插件

您还可以为每个特定的构建项选择更细粒度的环境变量设置。

通过执行以下步骤安装 EnvInject 插件(wiki.jenkins.io/display/JENKINS/EnvInject+Plugin)。点击 Jenkins 主仪表板链接:

请确保点击 Jenkins 链接,您将被路由到 Jenkins 仪表板。然后点击“管理 Jenkins”按钮,就像您添加全局属性时所做的那样。

接下来点击“管理插件”按钮,它看起来像这样:

您现在将被带到以下屏幕:

请注意,我们点击了“可用”选项卡,然后将EnvInject放入筛选框中。确保点击您想要的 Jenkins 插件,然后点击“无需重启安装”或“立即下载并在重启后安装”按钮。

请注意,我们现在在构建配置区的“构建环境”部分有了一些新的构建选项:

如果您点击“将环境变量注入到构建过程中”,您可以添加您的新环境变量,就像这样:

确保保存您的更改。需要注意的一点是,这个环境变量只适用于这个特定的构建项;它不像我们之前设置的全局属性那样是一个全局属性。

调试自由样式作业的问题

每当您在 Jenkins 中为一个构建项运行构建时,您可以通过点击您想要查看的特定构建作业来查看构建的所有细节。

构建项目视图

这是您需要关注的构建历史:

现在,如果您点击一个实际的构建,您将进入以下屏幕:

如果您点击“控制台输出”链接,您将看到一个详细的 CI 构建日志,显示 CI 服务器执行的所有步骤。请记住,我们编写了一个自由样式的 shell 脚本。我将添加 shell 脚本的内容供您查看:

echo "$SAMPLE_VALUE"
echo "$ANOTHER_SAMPLE_NAME"
go test

请注意,我在这里添加了我们之前定义的两个不同的环境变量,并且我只是将它们发送到标准输出。

现在,如果您查看构建作业的输出,您将看到以下输出:

请注意,Jenkins 通过当前登录的用户来启动作业。接下来,EnvInject 插件运行并注入我们在项目中指定的任何环境变量。然后 Jenkins 从 GitHub 仓库获取最新的更改。然后 EnvInject 插件再次运行并注入任何必要的环境变量。

最后一个操作是实际执行 shell 脚本。在前面的屏幕截图中要注意的一件事是,因为在 Jenkins 中启用了执行跟踪,所以 shell 脚本中的每个命令都会被打印到标准输出。请记住,执行跟踪只是意味着在 shell 脚本中运行的每个命令以及命令本身的输出都将显示出来。例如,echo "$ANOTHER_SAMPLE_NAME"命令的值为echo "Hello Book Readers",将被打印到标准输出,然后打印出消息Hello Book Readers。最后要注意的是,构建显示了文本PASS,并以SUCCESS完成。

调试自由风格脚本的问题

请注意我们如何记录具有简单信息的环境变量。有时候值在 CI 环境中没有被设置,这是您所期望的,这就是将值记录到标准输出中非常有帮助的地方。使用 EnvInject 插件的一个好处是,它将掩盖您注入到构建作业中的密码,以便您不会意外记录机密或保密信息:

请注意,在前面的屏幕截图中,我们已经检查了将密码注入到构建作业中作为环境变量,并为环境变量指定了名称和密码。如果您在构建作业中意外执行echo $SecretName,它将掩盖$SecretName的值,以便您不会在构建中泄露机密信息。

总结

在本章中,您学习了更多关于 Jenkins 仪表板的知识。您学习了如何添加构建作业项以及配置自由风格构建作业的所有部分,如何将环境变量添加到 Jenkins 作业中,以及如何调试自由风格作业中的问题。

下一章将介绍如何构建 Jenkins 插件,并具体介绍构建过程,包括编写 Java 代码和使用 Maven 构建工具。

问题

  1. 为什么在构建配置中点击问号符号很有用?

  2. 如果您想在构建触发器部分轮询您的版本控制系统,您应该写什么类型的语法?

  3. 在构建环境中可以使用多种编程语言吗?

  4. 自由风格脚本操作在什么类型的环境中——是 Unix 环境吗?

  5. 全局属性和项目级环境变量之间有什么区别?

  6. 您认为 Jenkins 为什么在控制台输出中使用执行跟踪?

  7. 在构建配置的后构建操作部分的价值是什么?

进一步阅读

请查看使用 Jenkins 进行持续集成学习-第二版www.amazon.com/dp/1788479351),来自 Packt Publishing。

第七章:开发插件

本章将详细介绍 Jenkins 中的插件,我们将首先看如何在 Windows、Linux 和 macOS 中设置 Maven。然后我们将通过为 Jenkins 创建一个Hello World插件来了解插件开发,然后我们将简要介绍 Jenkins 插件站点以及如何浏览和使用它来找到各种插件。

本章将涵盖以下主题:

  • Jenkins 插件解释

  • 构建一个简单的 Jenkins 插件

  • Jenkins 插件开发

  • Jenkins 插件生态系统

技术要求

本章是关于在 Jenkins 中构建插件的,您需要对 Java 编程语言有基本的了解,并了解 Maven 等构建工具的用途。

Jenkins 插件解释

Jenkins CI 已经提供了某些功能,包括构建、部署和自动化软件项目。您通常可以通过 Jenkins 中大量的插件生态系统获得您想要的任何额外行为。

插件有什么用?

软件中插件/扩展的目的是为软件组件添加特定功能。诸如 Chrome 的网络浏览器有扩展程序来扩展浏览器的功能,Firefox 有附加组件来实现与 Chrome 中扩展程序相同的目的。其他软件系统中也存在插件,但我们将专门关注 Jenkins 中的插件。

Jenkins 插件文档

转到插件索引以找到您需要的任何插件,我们将在本章的后面部分讨论这个问题。如果您访问 Jenkins 维基中的插件教程,您将获得创建 Jenkins 插件的完整说明。还有一些 Jenkins 维基之外的教程可以使用。您可以转到 Jenkins 原型库查看Hello World插件示例。

在 Jenkins 中安装插件

您需要转到 Jenkins 仪表板中的“管理 Jenkins”链接:

点击“管理 Jenkins”链接后,您将被重定向到以manage结尾的 URL 路径,例如http://localhost:8080/manage,或者根据您是否在本地运行 Jenkins 而有其他域。您需要点击“管理插件”链接,然后确保点击“已安装”选项卡和/或筛选您希望安装的任何插件。我们之前已经介绍过这个,但我们将通过安装我们自己的 Jenkins 插件来安装它,就像安装任何其他 Jenkins 插件一样。

构建一个简单的 Jenkins 插件

创建 Jenkins 插件有一些先决条件。您需要安装 Java,如果您一直在跟进,那么应该已经安装了。您还需要安装 Maven 软件项目管理工具(maven.apache.org/)。

Java 安装

您需要确保已安装 Java 1.6 或更高版本,我建议您安装 Java 1.9。要安装 Java,请转到 Java 下载页面(www.oracle.com/technetwork/java/javase/downloads/index.html):

确保点击“接受许可协议”单选按钮,然后点击 Windows。下载并确保选择正确的架构,即 32 位或 64 位操作系统。

安装 Java 后,只需使用以下命令验证安装:

java -version

这应该返回已安装的 Java 的当前版本。

Maven 安装说明

要安装 Maven,请转到 Maven 安装页面(maven.apache.org/install.html)并确保按照给定操作系统的说明进行操作。

Windows 安装

您可以在 Windows 上以几种不同的方式安装 Maven,但请确保您至少安装了 Windows 7 操作系统和 Java 软件开发工具包SDK)1.7 或更高版本。如果您在第五章中跟随了Jenkins 的安装和基础知识,那么您应该已经安装了 Java。

通过 Chocolatey 软件包管理器安装 Maven

如果您已经安装了 Chocolatey 软件包管理器(chocolatey.org/install),那么您可以简单地运行以下命令:

choco install maven

您还可以从 Maven 安装页面(maven.apache.org/install.html)下载 Maven 二进制可执行文件,并且您还需要额外找到 Java 环境变量的值。您可以通过在命令提示符中运行以下命令来找到:

echo %JAVA_HOME%

然后,您需要通过以下方式将此 Maven 二进制可执行文件添加到 Windows 路径中:

  1. 右键单击我的电脑

  2. 点击属性

  3. 点击高级系统设置

  4. 点击环境变量

  5. 点击新用户变量,添加 Maven_Home,值为C:\apache-maven-3.5.3

  6. 将其添加到路径变量中,使用%Maven_Home%\bin

  7. 在命令提示符中打开,并在桌面上询问mvn -version

通过 Maven 源代码安装 Maven

首先确保您已安装 Java SDK,您可以在命令提示符中确认:

echo %JAVA_HOME%

这应该打印出您已安装的 Java 当前版本。接下来,从 Maven 源代码库(gitbox.apache.org/repos/asf?p=maven-sources.git)下载 Maven 源代码,然后在 Windows 操作系统中的合适位置解压 Maven 源代码。

C:\Program Files\Apache\maven是一个可能的位置,你可以使用。

为 Windows 操作系统设置环境变量

您需要使用系统属性将M2_HOMEMAVEN_HOME变量都添加到 Windows 环境中,并且您需要将环境变量指向您的 Maven 文件夹。

通过附加 Maven bin文件夹%M2_HOME%\bin来更新 PATH 变量,这样您就可以在系统中的任何位置运行 Maven 可执行文件。

要验证 Maven 是否正确运行,请在命令提示符中运行以下命令:

mvn --version

该命令应显示当前的 Maven 版本、Java 版本和操作系统信息。

macOS 安装

您需要确保 macOS 操作系统中已安装 Java SDK。如果您在第五章中跟随了Jenkins 的安装和基础知识,那么您应该已经安装了 Java。

通过 Homebrew 软件包管理器安装 Maven

首先确保 Java 已安装,通过在 Mac 终端应用程序中运行以下命令:

java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

您需要在系统上安装 Java 1.7 或更高版本。

接下来,如果您已经安装了 Homebrew 软件包管理器(brew.sh/),那么您可以通过在 Mac 终端应用程序中发出以下命令来轻松安装 Maven:

brew install maven

确保在您的.bashrc.zshrc文件中设置以下环境变量:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

确保 Maven 已经正确安装,通过在 Mac 终端中运行以下命令:

mvn --version
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T14:49:05-05:00)
Maven home: /usr/local/Cellar/maven/3.5.3/libexec
Java version: 1.8.0_162, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.4", arch: "x86_64", family: "mac"

请注意,mvn二进制可执行文件打印出了已安装的 Maven 版本、Java 版本和特定于操作系统的信息。

Unix 安装

我们将在 Ubuntu 16.04 Digital Ocean Droplet 上安装 Maven,但您应该能够在其他 Linux 发行版上运行类似的命令。请按照说明在您特定的 Linux 发行版上安装 Maven。

通过 apt-get 软件包管理器安装 Maven

确保 Java 已安装在您的 Linux 发行版中,您可以通过在终端 shell 中运行以下命令来检查:

java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)

如果尚未安装 Java,则运行以下命令:

sudo apt-get update && sudo apt install openjdk-9-jre

接下来,在终端应用程序中运行以下命令安装 Maven:

sudo apt-get install maven

接下来,您需要确保您的JAVA_HOME环境变量已设置。由于我们在 Ubuntu Linux 操作系统中安装了 Java 1.9,我们将运行以下命令:

export JAVA_HOME=/usr/lib/jvm/java-1.9.0-openjdk-amd64/

您使用的目录可能不同,但如果您未设置此环境变量,则 Maven 将报告此警告。

通过在终端应用程序中运行以下命令来检查 Maven 是否已正确安装:

mvn --version
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 9-internal, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-9-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-127-generic", arch: "amd64", family: "unix"

请注意,Maven 二进制可执行文件打印出当前安装的 Maven 版本、当前安装的 Java 版本和特定于操作系统的信息,就像 Windows 和 Mac 操作系统一样。

Jenkins 插件开发

有几个步骤是必要的,以便设置、运行和安装 Jenkins 插件。

Maven 设置文件

根据您当前的操作系统,您需要创建/编辑.m2/settings.xml文件。

通过在命令提示符中发出以下命令,Windows 用户将找到settings.xml文件:

echo %USERPROFILE%\.m2\settings.xml

Mac 操作系统用户可以在~/.m2/settings.xml中编辑/创建settings.xml文件。

settings.xml文件中的settings元素包含用于以各种方式配置 Maven 执行的值的元素,例如pom.xml,但不应捆绑到任何特定项目或分发给受众。这些值包括本地存储库位置、替代远程存储库服务器和身份验证信息。

将以下内容放入settings.xml文件中:

请注意,我们输入了与 Jenkins 插件相关的特定信息。

强烈建议您将您的settings.xml文件设置为正确运行您的 Jenkins 插件!

HelloWorld Jenkins 插件

要创建 Jenkins 插件,您需要使用 Maven 原型,您可以在这里阅读有关它的信息(maven.apache.org/guides/introduction/introduction-to-archetypes.html)。

我们将发出以下命令以生成 Jenkins 的Hello World插件:

mvn archetype:generate -Dfilter=io.jenkins.archetypes:hello-world

以下是我创建插件的示例运行会话:

请注意,我为原型输入了1,然后选择了插件版本4,并定义了jenkins-helloworld-example-plugin的值,然后按Enter获取默认值:

如果一切顺利,您应该在命令提示符中获得BUILD SUCCESS的输出。

您需要确保能够构建您的 Jenkins 插件,因此请确保在命令提示符中运行以下命令:

// First go into the newly created directory
cd jenkins-helloworld-example-plugin
// Then run the maven build command
mvn package

mvn package命令将创建一个target目录,并运行您在该目录中创建的任何测试:

请注意,Jenkins 原型实际上为我们的Hello World Jenkins 插件示例创建了一些测试。

文件夹布局说明

以下是新创建的jenkins-helloworld-example-plugin目录的屏幕截图:

src目录包含 Jenkins 插件的源文件以及插件的测试。

目标目录是通过mvn包生成的。还有一个pom.xml文件,当我们运行原型子命令时 Maven 创建了它。

项目对象模型POM)是 Maven 中的基本工作单元。它是一个包含有关项目和 Maven 用于构建项目的配置详细信息的 XML 文件。它包含大多数项目的默认值。其中包括构建目录,即target,源目录,即src/main/java,以及测试源目录,即src/test/java

Jenkins 插件源代码解释

正如我们之前提到的,src目录包含了 Jenkins 插件的源文件。为了在 Jenkins 中构建插件,您需要使用 Java 编程语言进行编写。教授 Java 编程语言超出了本书的范围,但我们将简要讨论 Maven 为我们创建的一些文件。

请注意,Maven 创建了一个相当长的目录结构,这是常见的,因此helloworld插件的目录结构为./src/main/java/io/jenkins/plugins/sample/HelloWorldBuilder.java。测试文件本身位于./src/test/java/io/jenkins/plugins/sample/HelloWorldBuilderTest.java

我在这里包含了HelloWorldBuild.java类的源代码:

package io.jenkins.plugins.sample;   import hudson.Launcher; /* More Import Statements Here */

public class HelloWorldBuilder extends Builder implements SimpleBuildStep {

    /* Rest of methods in Github Source */

    @Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
        if (useFrench) {
            listener.getLogger().println("Bonjour, " + name + "!");
        } else {
            listener.getLogger().println("Hello, " + name + "!");
        }
    }

    @Symbol("greet")
    @Extension
    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {

        /* Rest of the source in Github */
}

请注意,HelloWorldBuilder类扩展了Builder类,这是 Jenkins 核心类;还请注意,我们正在使用一个名为BuildStepDescriptor的类,这也是一个 Jenkins 类。此文件的源代码可以在我的 GitHub 存储库中的jenkins-plugin-example中的HelloWorldBuilder.javagithub.com/jbelmont/jenkins-plugin-example/blob/master/src/main/java/io/jenkins/plugins/sample/HelloWorldBuilder.java)文件中看到。

对于HelloWorldBuilderTest.java中的测试用例,我们使用了 Java 编程语言的流行单元测试库 JUnit。

package io.jenkins.plugins.sample;   import hudson.model.FreeStyleBuild; /* More Import Statements Here */   public class HelloWorldBuilderTest {

    @Rule
  public JenkinsRule jenkins = new JenkinsRule();   final String name = "Bobby";    @Test
  public void testConfigRoundtrip() throws Exception {
        FreeStyleProject project = jenkins.createFreeStyleProject();
  project.getBuildersList().add(new HelloWorldBuilder(name));
  project = jenkins.configRoundtrip(project);
  jenkins.assertEqualDataBoundBeans(new HelloWorldBuilder(name), project.getBuildersList().get(0));
  }

    /* More test Cases in this file. */

}

上述的 Java 测试文件具有诸如@Rule@Override@Test@DataBoundSetter等注解,这些注解是一种元数据,提供关于程序的数据,而不是程序本身的一部分。注解对其注释的代码的操作没有直接影响。此文件的源代码可以在我的 GitHub 存储库中的jenkins-plugin-example中的HelloWorldBuilderTest.java文件中看到(github.com/jbelmont/jenkins-plugin-example/blob/master/src/test/java/io/jenkins/plugins/sample/HelloWorldBuilderTest.java)。

构建 Jenkins 插件

为了构建 Jenkins 插件,您需要在插件目录中运行mvn install命令。

mvn install命令将构建和测试 Jenkins 插件,并且更重要的是,创建一个名为pluginname.hpi的文件;或者在我们的情况下,它将在target目录中创建一个名为jenkins-helloworld-example-plugin.hpi的文件,我们可以用它来部署到 Jenkins。

我已经在以下屏幕截图中附上了一个示例安装运行:

请注意,此运行通过将我们的 Jenkins 插件安装到多个位置来完成,我们将使用这些位置来安装我们的 Jenkins 插件。

安装 Jenkins 插件

现在,为了安装新构建和安装的HelloWorld示例插件,我们需要转到 Jenkins 仪表板|管理 Jenkins|管理插件视图,然后点击高级选项卡。如果需要更多细节,请参阅第六章,编写自由脚本EnvInject 插件部分。您还可以直接转到插件部分,方法是转到scheme://domain/pluginManager;或者,如果您正在本地运行 Jenkins,只需转到http://localhost:8080/pluginManager/

然后确保点击高级选项卡或转到http://localhost:8080/pluginManager/advanced

然后您需要转到上传插件部分:

点击选择文件,然后找到我们新创建的Helloworld Jenkins 插件,它应该在目录中:

jenkins-helloworld-example-plugin/target/jenkins-helloworld-example-plugin.hpi

然后确保点击上传按钮。

以下是新安装的Helloworld示例插件的屏幕截图:

Jenkins 插件生态系统

Jenkins 有大量可用的插件,您可以在 Jenkins 插件网站(plugins.jenkins.io/)上找到完整的列表。

可用插件列表

以下截图显示了与 Jenkins 中 JSON 相关的插件搜索:

请注意,Jenkins 插件网站除了默认视图之外,还有多个视图可供您使用:

请注意,我点击了中间的图标,但您也可以点击最右边的图标以获得一个小纲要视图。搜索默认为相关搜索项,但您可以选择不同的搜索条件,例如最常安装、趋势和发布日期。

摘要

在本章中,您了解了 Java 的 Maven 构建工具以及如何在 Windows、Linux 和 macOS 上安装它。您还学习了如何使用 Maven 构建工具创建 Jenkins 插件,我们简要讨论了一些 Java 语法以及如何使用 Jenkins 仪表板中的管理插件 UI 中的高级选项来安装 Jenkins 插件。我们还研究了 Jenkins 插件生态系统。

问题

  1. 我们用来创建 Jenkins 插件的构建工具是什么?

  2. 我们在 Windows 操作系统中使用了哪个软件包管理器来安装 Maven?

  3. 我们在 macOS 操作系统中使用了哪个软件包管理器来安装 Maven?

  4. 我们在HelloWorld插件中简要讨论的配置文件的名称是什么?

  5. 我们可以直接导航到哪个 URL 来管理 Jenkins 中的插件?

  6. 我们用来在 Maven 中构建和安装 Jenkins 插件的命令是什么?

  7. Maven 为我们创建了哪种类型的文件,以便我们可以安装 Jenkins 插件?

进一步阅读

请查看 Packt Publishing 出版的书籍扩展 Jenkinswww.amazon.com/dp/B015CYBP2A/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)了解更多关于 Jenkins 插件的信息。

第八章:使用 Jenkins 构建管道

本章将详细介绍如何使用现有的 Jenkins 实例设置 Jenkins 蓝海以及如何使用 Docker 进行设置。我们将详细了解蓝海用户界面(UI),并讨论 Jenkins 经典视图和蓝海视图之间的区别。我们还将详细讨论 Pipeline Syntax,并简要讨论其用途,并解释两种不同类型的 Pipeline Syntax。

本章将涵盖以下主题:

  • Jenkins 2.0

  • Jenkins 管道

  • 在 Jenkins 蓝海中导航

  • Pipeline Syntax

技术要求

本章需要基本了解如何与 Unix Shell 环境交互。我们还将简要讨论 Pipeline Syntax,因此如果您具有一些基本的编程技能,就能理解编程语言中关键字的用途。

Jenkins 2.0

Jenkins 2.0 的设计方法和流程与 Jenkins 1.0 相比有所不同。不再使用自由风格的作业,而是使用了一种新的“领域特定语言”(DSL),这是 Groovy 编程语言的缩写形式。

管道视图在 Jenkins 1.0 中的功能也有所不同。管道阶段视图还帮助我们可视化管道中的各个阶段。

为什么要转移到 Jenkins 2.0?

那么,首先,为什么要转移到 Jenkins 2.0,而不是继续使用 Jenkins 1.0?Jenkins 经典视图被认为是混乱的,并且没有考虑到易用性。Jenkins 2.0 在更直观的方式上使用 Docker 镜像上做出了很大的推动。此外,新的 UI 包括了 Jenkins 管道编辑器,并通过引入管道视图改变了您查找构建的方式。新 UI 的目标是减少混乱,增加对使用 Jenkins 的团队中每个成员的清晰度。新 UI 还具有 GitHub 和 Bitbucket 集成以及 Git 集成。Jenkins 2.0 UI 本质上是您安装的一组插件,称为蓝海。

在现有实例上安装蓝海插件

如果在大多数平台上安装 Jenkins,您将不会默认安装所有相关插件的蓝海插件。您需要确保您正在运行 Jenkins 版本 2.7.x 或更高版本才能安装蓝海插件。

为了在 Jenkins 实例上安装插件,您必须具有通过基于矩阵的安全设置的管理员权限,任何 Jenkins 管理员也可以配置系统中其他用户的权限。

安装蓝海插件的步骤如下:

  1. 确保您以具有管理员权限的用户登录

  2. 从 Jenkins 主页或 Jenkins 经典版的仪表板上,点击仪表板左侧的“管理 Jenkins”

  3. 接下来,在“管理 Jenkins”页面的中心,点击“管理插件”

  4. 点击“可用”选项卡,并在过滤文本框中输入“蓝海”,以过滤插件列表,只显示名称和/或描述中包含“蓝海”的插件

请阅读第七章,开发插件,特别是安装 Jenkins 插件部分,以获取更多信息。

通过 Jenkins Docker 镜像安装蓝海插件

您需要确保已安装 Docker 才能获取 Jenkins CI Docker 镜像。

Docker 先决条件

由于 Docker 利用操作系统的虚拟化技术,因此 Docker 的安装要求是特定的。

OS X 的要求是:

  • 2010 年或更新型号的 Mac,带有英特尔的 MMU 虚拟化

  • OS X El Capitan 10.11 或更新版本

Windows 的要求是:

  • 64 位 Windows

  • Windows 10 专业版、企业版或教育版(不是家庭版,也不是 Windows 7 或 8)来安装 Hyper-V

  • Windows 10 周年更新版或更高版本

  • 访问您机器的 BIOS 以打开虚拟化

在您的操作系统上安装 Docker,请访问 Docker 商店(store.docker.com/search?type=edition&offering=community)网站,并点击适合您的操作系统或云服务的 Docker 社区版框。按照他们网站上的安装说明进行安装。

通过使用 Windows 命令提示符或 OS X/Linux 终端应用程序检查 Docker 版本来确保 Docker 已安装。在命令行中运行以下命令:

注意这里我安装了 Docker 版本 18。

安装 Docker 镜像

要获取 Docker 镜像,您需要确保在 Docker Hub(hub.docker.com/)上有一个帐户。一旦您在 Docker Hub 上有了帐户并且安装了 Docker,获取最新的 Jenkins CI Docker 镜像就很简单。

在 Windows 命令提示符或终端中运行以下命令:

请注意,我已经拉取了jenkinsci/blueocean Docker 镜像,因此该命令没有从 Docker Hub 中拉取,而是打印出了一个 SHA 哈希校验和。这表明我已经拥有了jenkinsci/blueocean的最新 Docker 镜像。

接下来,您需要让 Jenkins Docker 容器运行起来,并且您需要在终端或命令提示符中运行以下命令:

您可以通过简单地创建一个为您执行此操作的 shell 脚本或创建一个别名来简化此过程。

以下是我在文本编辑器中创建的一个 shell 脚本:

我有一个个人的bin目录,我在~/bin中存储所有个人脚本,然后我确保将其添加到PATH变量中。脚本文件名为run-jenkinsci-blueocean。我们需要确保该脚本是可执行的,通过发出以下命令:

 chmod +x run-jenkinsci-blueocean

然后我只需要运行~/bin/run-jenkinsci-blueocean命令。

您也可以在 Unix 中创建类似的别名:

# inside ~/.zshrc

alias runJenkinsDockerImage='docker run -u root jenkins-blueocean --rm -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean'

请注意,我在我的.zshrc文件中添加了这个 shell 别名,但您也可以将其添加到.bashrc文件中。

Windows 用户可以创建一个批处理文件或找到其他方法来使运行 Docker 命令更容易。

为了停止 Docker 容器,您可以运行以下命令:

docker ps -a

此命令将显示系统中所有正在运行的容器;您需要查看Container IDNAMES列,并复制与 Docker 镜像jenkinsci/blueocean对应的 ID。最后,要停止容器,您需要运行以下命令:

docker stop jenkins-blueocean

请注意,因为我们在 shell 脚本中的docker run命令中使用了--name jenkins-blueocean选项,Docker 创建了一个名为jenkins-blueocean的容器;如果我们没有这样做,那么 Docker 将为我们创建一个容器的名称。当您在终端或命令提示符中发出docker ps -a命令时,您可以使用容器 ID 和名称来停止容器。

一旦 Jenkins 运行起来,您可以在这里访问:http://localhost:8080,您需要提供为管理员生成的默认密码来解锁 Jenkins。在第五章中,Jenkins 的安装和基础知识,我们跳过了安装建议插件的入门步骤,但这次我建议您在入门屏幕上安装建议的插件:

通过点击安装建议插件按钮,您将获得所有建议的插件和依赖插件,这将帮助您在新的 Jenkins 2.0 流程中使用流水线等功能。

访问 Blue Ocean Jenkins 视图

您需要确保点击打开 Blue Ocean 按钮,看起来类似于这样:

点击“打开蓝色海洋”按钮后,您将被重定向到此 URL:http://localhost:8080/blue/organizations/jenkins/pipelines。Jenkins UI 将看起来非常不同,并且行为也不同。

这是您将看到的初始屏幕,因为我们还没有创建任何流水线:

我们将在接下来的部分中探索流水线语法以及如何在 Jenkins 2.0 UI 中进行导航。

Jenkins 流水线

我们将使用 Jenkins 2.0 UI 创建我们的第一个流水线,并且还将使用内置到新 Jenkins 2.0 UI 中的流水线编辑器创建一个 Jenkinsfile。

创建 Jenkins 流水线

我们要做的第一步是点击“创建新流水线”按钮。您将被重定向到以下屏幕:

对于本章的目的,我们将使用我创建的现有 GitHub 存储库,但您也可以轻松使用 Bitbucket 和您自己托管在 GitHub 或 Bitbucket 上的代码。为了使其工作,您需要确保在 GitHub 上有一个帐户,如果没有,请确保注册 GitHub(github.com/)。

为 GitHub 提供个人访问令牌

如果您在 GitHub 上还没有个人访问令牌,您将需要创建一个。请注意,在以下截图中,有一个名为“在此处创建访问密钥”的链接:

点击“在此处创建访问密钥”链接后,您将被重定向到以下 GitHub 页面:

您可以保持默认选项勾选,然后点击标题为“生成令牌”的绿色按钮。确保将此个人访问令牌保存在安全的地方,因为它只会显示一次;复制它,因为我们将需要它。您需要将访问令牌粘贴到“连接到 Github”输入框中,然后点击蓝色的“连接”按钮:

选择您的 GitHub 组织

您需要选择您所属的 GitHub 组织。在接下来的截图中,我选择了 GitHub 用户名组织jbelmont

选择 GitHub 存储库

您需要做的最后一步是实际选择要创建 Jenkins 流水线的 GitHub 存储库。在这里的截图中,我输入了cucumber-examples并选择了下拉菜单。然后蓝色的“创建流水线”按钮被启用:

使用流水线编辑器创建流水线

在我们选择的 GitHub 存储库中,没有现有的 Jenkinsfile,因此我们被重定向到流水线编辑器屏幕,我们可以在其中创建我们的第一个 Jenkinsfile:

我们需要为 Node.js 和代理添加一个 Docker 镜像,看起来类似于这样:

请注意,我们使用-v选项为 Docker 挂载数据卷提供了一个图像和参数。

接下来,我们点击灰色的加号按钮,然后我们将看到以下更改:

接下来,在为阶段命名后,我们点击蓝色的“添加步骤”按钮。对于这个演示,我们将选择“构建”:

接下来,我们需要选择一个步骤选项。我们将选择标题为“Shell 脚本”的选项,这将安装我们所有的 Node.js 依赖项:

接下来,我们输入一些要在我们的 Shell 脚本中运行的命令:

接下来,我们将再次点击灰色的加号按钮,以向我们的流水线添加一个阶段,现在看起来类似于这样:

接下来,我们将为此阶段输入一个名称,并且在本章中,我们将选择Cucumber Tests

接下来,我们为此阶段添加一个步骤,并且我们将再次选择 Shell 脚本作为选项:

最后,我们将点击保存按钮并提供提交消息,以便将此更改推送到我们的 GitHub 存储库:

点击蓝色的“保存并运行”按钮后,Jenkinsfile 将合并到主分支中,并且管道将运行。

在 Jenkins Blue Ocean 中导航

在 Jenkins Blue Ocean 中,您习惯使用的一些视图在 Jenkins Blue Ocean 中不可用。Jenkins Blue Ocean 背后的主要概念是使 Jenkins 内部导航更加便捷,并通过更好的图标和页面导航改进 Jenkins UI。新 Jenkins UI 的许多灵感来自强调世界已经从功能性开发人员工具转向开发人员体验的《蓝海战略》一书,并且新 UI 致力于改善 Jenkins 的开发人员体验。

管道视图

以下屏幕截图描述了 Jenkins Blue Ocean 的管道视图。请注意,我们为两个不同的 GitHub 存储库创建了两个不同的管道。通过单击“新管道”按钮并添加个人 base64 (github.com/jbelmont/decode-jwt) Golang 库来解码 JSON Web 令牌通过命令行工具创建了第二个管道:

此列表将根据您在 Jenkins 实例中添加的管道数量而有所不同。请注意,您可以标记一个管道,并且有标有名称、健康、分支和 PR 的列。

管道详细视图

如果您点击实际管道,那么您将进入一个管道详细信息页面,其中包含有关特定管道中运行的所有阶段的所有详细信息。接下来的屏幕截图是 base64 管道:

管道构建视图

您可以单击管道视图中的每个节点,并查看该阶段完成的所有工作。在第一个屏幕截图中,我们点击“构建信息”节点,以查看在该特定阶段运行的命令,其中包括拉取 GitHub 存储库的最新副本并运行go versiongo fmt命令:

请注意,第二个节点标记为“运行测试”,当我们点击该特定节点时,我们只看到go test命令,该命令在 Golang 中运行我们的单元测试用例:

管道视图的一大优点是,您可以更清晰地查看持续集成构建中每个阶段的更好布局的可视化效果。

管道阶段视图

如果您点击管道中的实际阶段,由>符号表示,它将向您显示一个下拉视图,其中包含该特定阶段的详细信息:

请注意,这里我们点击了“运行测试”阶段,以查看报告,报告显示我们用 Golang 编写的单元测试用例已通过。

Jenkins 管道中的其他视图

还有其他视图可供使用,例如拉取请求视图,它会显示所有打开的拉取请求以及分支视图:

Jenkins Blue Ocean 视图仍在进行中,因此任何管理任务,例如添加插件和添加安全信息,仍然在 Jenkins 经典视图中完成。

管道语法

管道语法有两种形式(jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline):

  • 声明性管道

  • 脚本管道

两种形式之间的区别在于,声明性管道语法旨在比脚本管道更简单。脚本管道语法是 DSL,遵循 Groovy 编程语言的语义。

管道编辑器

cucumber-examples存储库中,我们使用管道编辑器创建了一个 Jenkinsfile。您实际上可以在不使用管道编辑器的情况下编写 Jenkinsfile,尽管我建议在调试管道脚本时使用它,因为编辑器具有一些很好的功能。

Jenkinsfile

这里有管道编辑器为我们创建的实际管道语法。它使用了声明性管道语法,这个语法有几个要讨论的项目:

pipeline {
  agent {
    docker {
      args '-v /Users/jean-marcelbelmont/jenkins_data'
      image 'node:10-alpine'
    }

  }
  stages {
    stage('Build') {
      steps {
        sh '''node --version

npm install'''
      }
    }
    stage('Cucumber Tests') {
      steps {
        sh 'npm run acceptance:tests'
      }
    }
  }
}

管道关键字

所有有效的声明性管道必须被包含在管道块中,正如您在前面的 Jenkinsfile 中所看到的。

代理关键字

代理部分指定整个管道或特定阶段将在 Jenkins 环境中执行的位置,取决于代理部分的放置位置。该部分必须在管道块的顶层内定义,但阶段级别的使用是可选的。

阶段关键字

stages 关键字包含一个或多个阶段指令的序列;stages 部分是管道描述的大部分工作将被放置的地方。

管道语法文档

如果您有兴趣了解更多关于管道语法的信息,请查看文档(jenkins.io/doc/book/pipeline/syntax/)。

总结

本章讨论了如何在现有的 Jenkins 实例中使用 Jenkins Blue Ocean 视图以及如何使用 Docker 设置 Blue Ocean 视图。我们看了许多不同的 Jenkins Blue Ocean 视图,并讨论了它们与 Jenkins 经典视图之间的一些区别。我们还讨论了管道语法和 Jenkinsfile。下一章将介绍 Travis CI 的安装和基本用法。

问题

  1. 如果您通过 Docker 安装 Jenkins,您可以使用 Blue Ocean 视图吗?

  2. 在 Blue Ocean 视图中使用管道编辑器有什么用?

  3. Jenkins 经典视图和 Blue Ocean 视图之间有哪些区别?

  4. 您能详细查看管道的每个阶段吗?

  5. Blue Ocean 视图能处理 Jenkins 中的管理任务吗?

  6. 阶段语法是用来做什么的?

  7. 声明性管道语法需要包装在管道块中吗?

进一步阅读

请查看Packt Publishing的书籍扩展 Jenkins(www.amazon.com/dp/B015CYBP2A),以了解更多关于 Jenkins 插件的信息。

第九章:Travis CI 的安装和基础知识

本章将帮助您设置 Travis 持续集成CI)。我们将解释托管解决方案(如 Travis CI)的应用嵌入式配置的概念。我们还将解释什么是 YAML 配置以及如何使用它。我们将研究使用 Travis CI 的基础知识,并花一些时间探索 Travis CI 和 Jenkins 之间的一些区别,以及 Travis CI 的概念。我们将介绍 Travis CI 的不同部分,包括语法和构建生命周期,并查看一些实际示例。

本章将涵盖以下主题:

  • Travis CI 介绍

  • Travis CI 先决条件

  • 添加一个简单的 Travis CI YAML 配置脚本

  • Travis CI 脚本解析

技术要求

本章将需要一些基本的编程技能,并且我们在前几章讨论过的许多 CI 概念将在本章中得到应用。如果您尝试创建一个 GitHub 账户和 Travis CI 账户将会很有帮助。您可以按照Travis CI 先决条件部分中的步骤进行操作。一些示例使用了 Docker,这是一种容器技术,因此如果您对容器和 Docker 有一些了解将会很有帮助。您将在本章学习有关 YAML 语法的知识。本章中有一些命令使用了命令行应用程序,因此熟悉命令行应用程序或 CLI 将会很有帮助。

Travis CI 介绍

Travis CI 是一个托管和自动化的 CI 构建解决方案。Travis CI 使用一个应用内配置文件,使用了 YAML(yaml.org/spec/1.2/spec.html)语法,我们将在本章后面更详细地讨论。由于 Travis CI 托管在云端,因此它具有可以快速在其他环境和不同操作系统中使用的优势,而无需担心设置和安装。这意味着 Travis CI 的设置比 Jenkins 要快得多。

比较 Travis CI 和 Jenkins

Jenkins 是一个自包含的开源自动化服务器,可以在组织级别进行定制和配置。请记住,在 Jenkins CI 章节中,我们花了一些时间在 Windows、Linux 和 macOS 上安装 Jenkins。我们还有能力按照自己的意愿配置 Jenkins。虽然这对于在运营、DevOps 等方面有专门团队的软件公司来说非常好,但对于经常是孤独开发者为个人项目设置环境的开源项目来说就不那么好了。

Travis CI 是围绕开源开发原则和易用性而设计的。在 GitHub 中创建项目后,可以在几分钟内设置好 Travis CI。尽管在这方面 Travis CI 不像 Jenkins CI 那样可定制,但它具有快速设置和使用的明显优势。Travis CI 使用一个应用内配置文件来实现这一点,但目前必须与 GitHub(github.com/)开发平台一起使用,尽管也许将来可能会扩展到其他平台,如 Bitbucket(bitbucket.org/dashboard/overview),但这仍然是一个开放的讨论。

Travis CI 先决条件

要开始使用 Travis CI,您需要创建一个 GitHub 账户,您可以在 GitHub(github.com/)上进行操作。

创建 GitHub 账户

看一下截图——您所需要做的就是提供用户名、电子邮件和密码,然后点击“注册 GitHub”按钮:

为了本章的目的,我们将创建一个名为packtci的 GitHub 用户名。一旦您点击了“注册 GitHub”按钮,您将被带到以下页面:

请注意,您可以在 GitHub 中免费创建无限数量的公共存储库,而私有存储库需要支付月度订阅费。一旦单击“继续”按钮,您将被重定向到以下页面:

如果您愿意,您可以通过滚动到页面底部并单击“跳过此步骤”按钮来跳过所有这些选项。一旦单击“提交”按钮或“跳过此步骤”按钮,您将被带到这个页面:

您应该收到来自 GitHub 的一封电子邮件;请查看以下截图:

您需要单击该链接以验证您在 GitHub 中的帐户,然后您应该已经设置好了您的 GitHub 帐户。

创建 Travis CI 帐户

您需要创建一个 Travis CI 帐户才能开始使用 Travis CI。您需要使用您的 GitHub 登录凭据登录。在这里的截图中,请注意您可以单击“注册”按钮或“使用 GitHub 登录”按钮:

在本章中,我单击了“使用 GitHub 登录”按钮,然后输入了我在 GitHub 上创建的用户名为packtci的 GitHub 帐户的登录凭据。一旦输入您的 GitHub 凭据,您将被重定向到以下页面:

您需要单击“授权 travis-ci”按钮以完成 Travis CI 设置。一旦单击“授权 travis-ci”按钮,Travis CI 完成最终设置步骤后,您将被重定向到以下页面:

请注意,我们在 Travis CI 中有一个 API 令牌,我们将在以后使用。在这个新帐户中我们没有任何 GitHub 项目,所以没有显示。在本章中,我将创建一个运行一些基本测试的 GitHub 项目。

向您的新 GitHub 帐户添加 SSH 密钥

为了创建一个新的 GitHub 存储库,您需要将您的 SSH 密钥添加到您的用户帐户中。如果您的系统中没有任何 SSH 密钥,可以使用以下命令创建:

请注意,我提供了一个电子邮件地址并指定了一种 RSA 类型的加密算法。一旦运行此命令,它将在您的系统上创建一个公钥和私钥。

一旦您创建了 SSH 密钥,您只需要将公钥上传到 GitHub。您需要复制文件的内容;如果您使用 macOS,您可以运行以下命令将其复制到系统剪贴板:

ssh-keygen -t rsa -b 4096 -C "myemail@someemailaddress.com"
# This command generates a file in the path that you pick in the interactive prompt which in this case is ~/.ssh/id_rsa_example.pub

pbcopy < ~/.ssh/id_rsa_example.pub

您需要进入 GitHub 的设置页面:

然后您需要在设置页面中单击以下按钮:

接下来,您需要单击“新 SSH 密钥”按钮,然后提供一个名称并粘贴您的 SSH 密钥的内容。在下面的截图中,我提供了一个名为示例 SSH 密钥的名称,然后粘贴了我的公钥的内容:

您只需要单击“添加 SSH 密钥”按钮,然后您就可以准备好向您在 GitHub 中拥有的任何存储库提交更改。

添加一个简单的 Travis CI YAML 配置脚本

我创建了一个示例 GitHub 存储库,您可以在 Github 上的 functional summer 中看到(github.com/packtci/functional-summer)。该存储库是一个 Node.js 项目,其中有一个package.json脚本,一个名为summer.js的文件和一个名为summer_test.js的测试文件。我们将在存储库的根目录中的名为.travis.yml的文件中为 Travis CI 添加配置。此配置脚本将执行几件事。首先,它将通知 Travis CI 我们正在运行一个 Node.js 项目,然后它将安装项目的依赖项,最后将运行 CI 构建中指定的测试。

Travis CI YML 脚本内容

我们首先在存储库的根目录创建一个名为.travis.yml的文件,然后将以下内容复制到此文件中:

language: node_js node_js: - "6.14.1" install: - npm install script: npm test

我们将更详细地讨论 YML 脚本的每个条目,但基本上我们对 Travis CI 说的是这是一个 Node.js 项目,我们希望 Travis CI 在 CI 构建中使用 node 版本 6.14.1,然后使用 npm 软件包管理器安装项目所需的所有依赖项,最后使用npm test命令运行所有测试。我将提交此更改到functional-summer存储库,然后我们将看到如何为该项目切换 Travis CI。

将 GitHub 存储库添加到 Travis CI 帐户

第一步是您必须转到travis-ci.org/,然后提供 GitHub 帐户的登录凭据。然后点击屏幕右上角的头像,转到您的个人资料页面,看起来像这样:

接下来,我添加了一张截图,详细说明了将新存储库添加到 Travis CI 的步骤:

请注意,在截图中,我添加了一个文本块,说第一步是点击“同步帐户”按钮,这是必要的,这样 Travis CI 才能看到您已添加到 GitHub 帐户中的任何新存储库。一旦 Travis CI 同步了您的帐户,您就应该能够在您的帐户中看到您的存储库。根据您已经拥有多少项目,您可能需要按存储库名称筛选以找到您的项目。下一步是切换带有您的存储库名称的滑块,就像截图中所示的那样。

在下面的截图中,我们已经在 Travis UI 上切换了functional-summer存储库,现在我们只需点击行即可进入这个新添加的 Travis CI 构建作业:

一旦您点击行,您将被重定向到 Travis CI 中的以下页面:

我们还没有触发任何构建,但 Travis CI 有一些默认设置。如果您将更改提交到任何推送的分支,或者在 GitHub 上打开拉取请求,Travis CI 将启动构建。让我们对functional-summer存储库进行一些微小的更改,这将触发 Travis CI 中的构建。如果您点击“构建历史”选项卡,您会注意到已创建了一个带有 Git 提交更改的构建:

Travis CI 作业日志

您可以单击 Travis CI 屏幕左侧的构建作业项目,看起来像这样:

或者,您可以单击“当前”选项卡,以查看已配置存储库的当前执行作业。为了查看作业日志,您需要滚动到“作业日志”选项卡,并查看 Travis CI 构建中的运行命令,对于functional-summer存储库,看起来像这样:

请记住,在我们添加到 GitHub 的.travis.yml脚本中,我们指定了四件事:

  1. .yml脚本的顶部,我们指定了 Node.js 的语言

  2. 我们指定了 Node.js 的版本 6.14.1

  3. 我们运行了npm install命令来安装项目的所有依赖项

  4. 最后,我们运行了npm test命令

您可以在作业日志中确认这些步骤是否已运行。请注意,在上一张截图中,有右箭头链接,展开以获取 CI 构建中每个命令的更多详细信息。

Travis CI 脚本分解

现在我们已经了解了 YAML 语法,我们可以更详细地解释 Travis CI 脚本的各个部分。

选择一种编程语言

language: go

.travis.yml脚本的这一部分中,我们添加了我们将在持续集成构建中使用的编程语言。这通常是您添加到.travis.yml脚本中的第一个条目。

Travis CI 支持许多编程语言,例如:

  • C

  • C++

  • 使用 Node.js 的 JavaScript

  • Elixir

  • Go

  • Haskell

  • Ruby

您可以查看 Travis CI 文档中的语言(docs.travis-ci.com/user/languages),以获取支持的编程语言的完整列表。

选择基础设施

您可以通过在 YML 脚本中使用sudodist字段来设置 Travis CI 中更自定义的环境。

具有 Ubuntu Precise (12.04)基础设施的虚拟镜像

您可以在 Travis YML 脚本中使用以下条目来使用 Ubuntu Precise 基础设施:

sudo: enabled
dist: precise

默认基础设施

您可以通过添加此条目来显式设置默认基础设施,即基于容器的 Ubuntu 14.04 环境:

sudo: false

这并非必须,因为您可以只设置语言,默认基础设施将为您完成。

具有 Ubuntu Trusty (14.04)基础设施的虚拟镜像

您可以在 Travis YML 脚本中使用以下条目来使用 Ubuntu Trusty 基础设施:

sudo: enabled
dist: trusty

基于容器的基础设施

您可以在 Travis YML 脚本中使用以下条目来使用基于容器的基础设施:

sudo: false
dist: trusty

请注意,我们在此处明确将 sudo 权限设置为 false,并使用 Ubuntu Trusty。

macOS 基础设施

您可以在 Travis YML 脚本中使用以下条目来使用 macOS 基础设施:

os: osx

构建自定义

在 Travis CI 中,您可以以各种方式自定义构建,我们将从解释构建生命周期开始。

构建生命周期

Travis CI 中的构建由两个步骤组成:

  • 安装:安装所需的任何依赖项。我们在 YML 脚本的安装块中看到了这一步骤。

  • Script:运行构建脚本。这可以是一系列要运行的脚本。

before_install 步骤

这一步骤正式称为before_install步骤,您可以在此步骤中安装 CI 构建中的任何其他依赖项,并启动自定义服务。

install 步骤

我们已经在install步骤中看到了这一步骤,您可以在此步骤中安装 CI 构建所需的任何依赖项。

before_script 步骤

before_script步骤中,您可以指定在执行脚本块之前需要执行的任何命令。例如,您可能有一个 PostgreSQL (www.postgresql.org/) 数据库,并且需要在运行任何测试之前对数据库进行填充。

脚本步骤

script步骤中,您可以执行对健康代码库至关重要的任何命令。例如,通常会运行代码库中的任何测试,对代码库进行 lint。 一个 linter 或 lint 工具是分析代码库以查找任何与编程相关的错误、软件错误、样式错误或可能具有代码异味的代码的工具。

after_script 步骤

after_script步骤中,您可以执行任何有用的命令,例如报告和分析。您可能需要发布代码覆盖率报告或在代码库中创建指标报告。

构建生命周期列表

以下是 Travis CI 的完整生命周期:

  • 可选安装:apt 插件

  • 可选安装:缓存组件

  • before_install

  • install

  • before_script

  • script

  • 可选:before_cache

  • after_successafter_failure

  • before_deploy

  • deploy

  • after_deploy

  • after_script

构建失败行为

如果在 before_install、install 或 before_script 生命周期事件中发生错误,则 CI 构建将立即出错,CI 构建将停止。

如果在脚本生命周期事件中发生错误,则构建将失败,但 CI 构建将继续运行。

如果在 after_success、after_failure、after_script 和 after_deploy 生命周期事件中发生错误,则构建将不会标记为失败,但如果其中任何生命周期事件导致超时,则构建将标记为失败。

为 CI 构建安装第二种编程语言

您可以通过在before_install生命周期事件中添加条目来轻松安装另一种编程语言。最好指定您的主要语言,然后是次要语言。

带有多种语言的示例 Travis CI YML 脚本

在 Travis CI YML 脚本中,我们将 Go 版本 1.10 指定为主要编程语言,然后将 Node.js 指定为次要语言。我们在 before_install 生命周期事件中安装 Node.js 依赖项,然后运行 Golang 测试,然后是 Node.js 测试:

language: go go: - "1.10" env: - NODE_VERSION="6" before_install:
 - nvm install $NODE_VERSION install: - npm install script: - go test
 - npm test

如果您想进一步探索此示例,请查看multiple-languages存储库(github.com/packtci/multiple-languages)。

Travis CI 中的 Docker

Docker 可以在 Travis CI 中使用,启用 Docker 的唯一步骤是将以下条目添加到您的 Travis CI YML 脚本中:

sudo: required

services:
 - docker

请注意,我们在services块中添加了一个条目,并添加了 Docker 的列表条目。

带有 Dockerfile 的示例 Travis CI YML 脚本

在 Travis YML 脚本中,我们指定了sudo权限,Golang 编程语言,然后指定了 Docker 服务,下载了自定义 Docker 镜像jbelmont/print-average:1.0,然后运行 Docker 容器并将其删除:

sudo: required

language: go

services:
  - docker

before_install:
  - docker pull jbelmont/print-average:1.0

script:
  - docker run --rm jbelmont/print-average:1.0

我已经添加了 Travis CI 构建的截图供您参考:

请注意,Docker 正在 CI 构建中运行,因为我们在 Travis CI 中指定了 Docker 作为要运行的服务。当我们运行 Docker 容器时,它会打印出在docker-travis-ci-example存储库中的main.go中计算的平均值(github.com/packtci/docker-travis-ci-example)。您可以在 Docker Hub 上查看我的 Docker 镜像(hub.docker.com/r/jbelmont/print-average/)。

Travis CI 中的 GUI 和无头浏览器

您可以以几种方式在 Travis CI 中运行无头浏览器。您可以利用 X 虚拟帧缓冲,或简称为 XVFB,您可以在 XVFB 文档中了解更多信息(www.x.org/archive/X11R7.6/doc/man/man1/Xvfb.1.xhtml)。我们将使用 Puppeteer(pptr.dev/)来使用无头 Chrome,这是由 Google 开发的库,提供了一个高级 API 来使用无头 Chrome。

带有无头 Chrome、Puppeteer 和 Jest 测试库的 Travis yml 脚本示例

在 Travis YML 脚本中,我们在 Travis CI 构建中设置了许多不同的操作。首先,我们将语言设置为node_js,然后将node_js的版本设置为8.11,然后设置了一个名为dist: trusty的新属性,该属性将 Travis CI 环境设置为 Ubuntu 14.04,称为Trusty。然后我们使用 add-ons 块添加了最新的稳定版本的 Chrome。然后我们在 CI 构建上的端口9222上运行了稳定版本的 Google Chrome,然后我们使用cache块,以便在每次 CI 构建运行时缓存node_modules。然后我们安装我们的 Node.js 依赖项,最后我们使用 Jest 库运行 Node.js 测试:

language: node_js

node_js:
 - "8.11"

dist: trusty

sudo: false

addons:
 chrome: stable

before_install:
 - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &

cache:
 directories:
 - node_modules

install:
 - npm install

script:
 - npm test

在第一张截图中,请注意我们在 Travis CI 构建中以headless模式运行google-chrome的部分,然后安装依赖项:

在第二个截图中,我们使用 Google Chrome Puppeteer 库运行测试。请注意,构建以0的退出状态运行,并成功完成:

您可以在travis-ci.org/packtci/puppeteer-headless-chrome-travis-yml-script/jobs/395882388#L70找到此 Travis CI 构建,并且您可以在github.com/packtci/puppeteer-headless-chrome-travis-yml-script和 GitHub 上找到此存储库的源代码。

摘要

在本章中,我们已经讨论了 Travis CI 的许多方面,包括 Travis CI 和 Jenkins 之间的区别。我们介绍了一些先决条件操作,以便设置 Travis CI 并学会将 SSH 密钥添加到您的 GitHub 帐户。然后我们详细解释了 Travis CI 构建作业,并详细介绍了 YAML 语法。然后我们探讨了许多 Travis YML 脚本的真实示例,并解释了 Travis CI 中的构建生命周期,并介绍了不同方面,例如启动 Docker 等服务及其在 Travis CI 中的用途。

在下一章中,我们将介绍所有 Travis CLI 命令,解释如何在 Linux、macOS 和 Windows 上安装 Travis CLI,并介绍如何使用 Travis CLI 命令自动化任务,如加密凭据。

问题

  1. Jenkins 和 Travis CI 之间的主要区别是什么?

  2. Travis CI 可以在 Bitbucket 中工作吗?

  3. 如何将新存储库添加到 Travis CI 中?

  4. YAML 中的标量变量是什么?

  5. YAML 中的列表是什么?

  6. YAML 中锚点的作用是什么?

  7. 在 Travis CI 构建中是否可以使用辅助编程语言?

  8. 如何在 Travis CI 构建中使用 docker?

进一步阅读

您可以通过查看 Travis CI 网站上的用户文档(docs.travis-ci.com/)来进一步探索 Travis CI 中的概念。

第十章:Travis CI CLI 命令和自动化

在上一章中,我们向您展示了如何在软件项目中配置 Travis CI,并解释了如何使用 Travis CI 的基础知识。本章将帮助您在操作系统上安装 Travis CLI,并且我们将介绍 Travis CI 中所有不同类型的命令,例如一般 API 命令,存储库命令等。我们将介绍 CLI 命令可以使用的不同选项,并且我们还将详细介绍每个命令的含义。我们还将通过使用我们的访问令牌和 curl REST 客户端直接查看使用 Travis API。我们将简要介绍 Travis Pro 和 Enterprise 版本。

本章将涵盖以下主题:

  • Travis CLI 安装

  • Travis CLI 命令

技术要求

本章将需要一些基本的 Unix 编程技能和关于使用命令行终端应用程序的知识。如果您使用的是 Windows 操作系统,则考虑使用命令提示符或 PowerShell 应用程序。如果您使用的是 macOS 操作系统,则使用默认安装的终端应用程序。如果您使用的是 Linux,则应该已经安装或可用终端。

Travis CLI 安装

安装 Travis CLI 的第一个先决条件是在您的操作系统上安装 Ruby(www.ruby-lang.org/en/documentation/installation/),并确保它是 1.9.3 或更高版本。

您可以通过在命令行或终端中运行以下命令来检查是否已安装 Ruby:

Windows 安装

Travis CLI 用户文档在github.com/travis-ci/travis.rb#windows上建议您使用 RubyInstaller (rubyinstaller.org/)在 Windows 操作系统上安装最新版本的 Ruby。

我们需要在 RubyInstaller 下载站点上选择 Ruby Devkit 版本 2.5.1,然后确保接受许可协议,然后选择适当的安装选项。确保安装开发工具链。

当安装程序窗口关闭时,将打开一个命令提示符,您需要选择一个选项;您可以只需按 Enter 键在系统上安装所有三个选项。安装过程可能需要一段时间才能完成。我的安装大约花了 20 分钟来更新 GPG 密钥并安装 Ruby 编程语言所需的其他依赖项:

在这里,我们已经在系统上安装了 Ruby 版本 2.5.1,正如我们所期望的那样:

在这一步中,我们在 Windows 命令提示符中安装 Travis RubyGems:

在最后一步中,我们验证 Travis CLI RubyGem 是否已安装在我们的系统上;它报告版本1.8.8

Linux 安装

Linux 操作系统有多个不同的软件包管理器,因此如何在系统上安装 Ruby 取决于您的特定 Linux 操作系统。我们将在 DigitalOcean 服务器上的 Ubuntu 14.04 上安装 Ruby 和 Travis CLI:

  1. 在 Ubuntu 上安装 Ruby,请运行以下命令:
sudo apt-get install python-software-properties
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.1 ruby-switch
sudo ruby-switch --set ruby2.1
  1. 接下来,通过运行以下命令确认 Ruby 已安装:

  1. 接下来,我们需要使用以下命令安装 Travis CLI RubyGem:
gem install travis -v 1.8.8 --no-rdoc --no-ri
  1. 最后一步是使用以下命令检查 Travis CLI 是否已安装:
travis version
1.8.8

macOS 安装

您需要安装 Xcode 命令行工具,可以使用以下命令来执行:

xcode-select --install

如果您已经安装了 Xcode 命令行工具,则在终端中会显示以下信息:

Ruby 已预安装在当前的 macOS 操作系统上,因此您只需要运行以下命令来安装 Travis CLI:

这里我使用了sudo,因为我需要提升的管理员权限来安装 RubyGem。

如果您在终端中看到此消息,您将知道 Travis CLI 已安装:

这里我使用的是 Travis CLI 版本1.8.8,但您的特定版本可能不同。

Travis CLI 命令

Travis CLI 功能齐全,与 GitHub 中的 Travis API(github.com/travis-ci/travis-api)一起使用,并且具有以下三种不同形式的 CLI 命令:

Travis CLI 库是用 Ruby 编程语言编写的,如果您想直接与其交互,请准备在 GitHub 的Ruby Library部分阅读更多内容(github.com/travis-ci/travis.rb#ruby-library)。

我们将使用我们在第九章中创建的packtci GitHub(github.com/packtci)用户,在创建 GitHub 帐户部分创建的packtci Travis CI 帐户。

非 API 命令

非 API Travis CLI 命令包括helpversion命令。这些命令不直接命中 Travis API,而是打印有关 Travis CLI 的有用信息。

打印帮助信息

help命令将显示特定命令接受的参数和选项。

在下面的截图中,我们在命令行终端中运行travis help命令:

如果您想获取特定命令的帮助,只需使用travis help COMMAND

以下是有关 Travis 中whoami命令的更多信息的截图:

打印版本信息

version命令显示安装在系统上的当前 Travis CLI 客户端。以下截图显示了 Travis CLI 的当前客户端版本为1.8.8

API 命令

API 命令直接命中 Travis API,有些需要您拥有适当的访问令牌,您可以使用travis login命令获取。

登录到 Travis CI

login命令通常是您需要使用的第一个命令,以便与 Travis API 一起工作,因为它会对您进行身份验证。

login命令将要求您输入 GitHub 用户名和密码,但不会将这些凭据发送到 Travis CI。相反,它使用您的用户名和密码创建一个 GitHub API 令牌,然后将令牌显示给 Travis API,然后运行一系列检查以确保您是您所说的人。然后它会给您一个 Travis API 的访问令牌,并最终 Travis 客户端将再次删除 GitHub 令牌。只要您成功运行travis login命令,所有这些步骤都会在幕后发生。

以下截图显示我们尝试运行travis accounts命令,并通知我们需要登录:

在下面的截图中,我们运行travis login命令并提供 GitHub 用户名和密码:

现在我们已成功登录到 Travis CI 系统,并且 Travis CI 已经为我们发放了一个访问令牌。

显示当前访问令牌

token命令用于显示当前访问令牌。截图中的访问令牌已经被隐藏,以确保安全:

注销 Travis CI

logout命令将注销您在 Travis CI 中的登录并删除您的访问令牌。

请注意,在下面的截图中,我们发出travis logout命令后,travis token命令显示我们需要重新登录:

我们需要重新登录到 Travis CI 以再次获取令牌。在下面的截图中,我们重新登录到 Travis,然后获取另一个访问令牌,以便我们可以向 Travis API 发出命令:

显示帐户信息

accounts命令用于列出您可以为其设置存储库的所有帐户。请记住,当我们之前运行此命令时,Travis 通知我们需要登录到 Travis 才能执行此命令。在下面的截图中,Travis 通知我们我们已经订阅了 Travis 中的四个不同存储库:

显示 Travis 命令的帮助信息

请记住,我们可以通过运行以下命令在 Travis 中找到特定命令的所有选项:

travis help

在下面的截图中,我们为accounts命令运行help命令:

有一个名为--debug的选项,我们将使用它来调试发送到 Travis API 的 HTTP 请求。在下面的截图中,我们获得了有关发送到 Travis 的请求的其他信息,例如命中的端点是GET "accounts/" {:all=>true}以及其他信息:

交互式控制台会话

console命令将您放入一个交互式的 Ruby 会话中,其中所有实体都被导入到全局命名空间中,并确保您已经通过 Travis 进行了身份验证,如果您正在设置正确。在下面的截图中,我按下了Tab并在控制台会话中获得了自动完成:

还要注意,当前登录的用户是packtci

打印 API 端点信息

endpoint命令打印出我们正在使用的 API 端点。请注意,在截图中,我们正在使用 Travis API 的免费开源版本:

Travis 的 PRO 版本使用以下端点:api.travis-ci.com/

进行实时监控,查看当前正在运行的所有 CI 构建

travis monitor命令将对已登录帐户中的所有 CI 构建进行实时监控。在下面的截图中,Travis CI 目前没有任何活动:

让我们为puppeteer-headless-chrome-travis-yml-script仓库(github.com/packtci/puppeteer-headless-chrome-travis-yml-script)添加一个单元测试用例,然后将此更改推送到 GitHub 版本控制系统。在以下截图中,我们将更改推送到存储库中:

现在,如果我们回到 Travis 监视器正在运行的终端会话中,我们将看到已启动构建,然后它被传递:

我们有一个2.1的构建作业;在.travis.yml文件中,我们没有指定任何其他构建作业,因此 Travis CI 将所有构建作业捆绑到一个构建作业中。

您可以在此网址阅读有关 Travis CI 构建阶段的更多信息:docs.travis-ci.com/user/build-stages/

发起 Travis CI API 调用

您可以通过使用travis raw RESOURCE命令直接对 Travis API 进行 API 调用。请记住,我们始终可以使用travis help COMMAND来查找如何在 Travis CLI 中使用特定命令。在以下截图中,我们对raw命令运行help命令:

现在我们知道如何运行raw命令,让我们向 Travis API 的此端点发出请求:

GET /config

如果您想查看 Travis API 的开发人员文档,则需要转到以下网址:developer.travis-ci.com/

确保登录并授权 Travis CI 作为 GitHub 的第三方应用程序。在以下截图中,我们为packtci GitHub 用户授权 Travis CI:

然后,您可以在以下网址查看 Travis CI 的 API 文档:developer.travis-ci.com/。在以下截图中,我们对/config端点进行 GET 请求,并在raw命令中使用以下两个不同的选项:

  • --json

  • --debug

在不久的将来,Travis API 计划废弃 V2 API,只有 V3 API 将得到官方支持。您可以使用 API 资源浏览器对 V3 API 进行 REST 调用:

GET /owner/{owner.login}

在以下截图中,我们使用API 资源浏览器对以下端点进行 REST 调用:

您可以转到此网址的 API 资源浏览器:developer.travis-ci.com/explore/。然后在输入框中输入资源,看起来像这样:

使用 curl 进行 API V3 REST 调用

我们将发出travis token命令,以便我们可以将访问令牌复制到系统剪贴板:

travis token

接下来,我们将运行travis endpoint命令并复制 URL:

travis endpoint
API endpoint: https://api.travis-ci.org/

我们将以以下方式发出curl请求:

curl -X GET \
 -H "Content-Type: application/json" \
 -H "Travis-API-Version: 3" \
 -H "Authorization: token $(travis token)" \
https://api.travis-ci.org/repos

请注意,在此 curl 请求中,我们使用了travis tokencli 命令,该命令将返回此特定 HTTP 标头的有效令牌。此 HTTP 请求将返回一个 JSON 响应有效负载,我们将使用它来复制特定的存储库 ID,以便进行以下 REST 调用以查找functional-summer存储库的所有环境变量(github.com/packtci/functional-summer):

curl -X GET \
 -H "Content-Type: application/json" \
 -H "Travis-API-Version: 3" \
 -H "Authorization: token $(travis token)" \
https://api.travis-ci.org/repo/19721247/env_vars

在此GET请求中,我们从functional-summer存储库获取所有环境变量,并收到以下 JSON 响应:

{
  "@type": "env_vars",
  "@href": "/repo/19721247/env_vars",
  "@representation": "standard",
  "env_vars": [

  ]
}

让我们发出POST请求,向functional-summer存储库添加一个环境变量:

curl -X POST \
  -H "Content-Type: application/json" \
  -H "Travis-API-Version: 3" \
  -H "Authorization: token $(travis token)" \
  -d '{ "env_var.name": "MOVIE", "env_var.value": "ROCKY", "env_var.public": false }' \
  https://api.travis-ci.org/repo/19721247/env_vars

现在,当我们对环境变量进行GET请求时,我们看到已设置名为MOVIE的环境变量:

curl -X GET \
 -H "Content-Type: application/json" \
 -H "Travis-API-Version: 3" \
 -H "Authorization: token $(travis token)" \
https://api.travis-ci.org/repo/19721247/env_vars
{
 "@type": "env_vars",
 "@href": "/repo/19721247/env_vars",
 "@representation": "standard",
 "env_vars": [
 {
 "@type": "env_var",
 "@href": "/repo/19721247/env_var/1f64fa82-2cad-4270-abdc-13d70fa8faeb",
 "@representation": "standard",
 "@permissions": {
 "read": true,
 "write": true
 },
 "id": "1f64fa82-2cad-4270-abdc-13d70fa8faeb",
 "name": "MOVIE",
 "public": false
 }
 ]
}

打印重要的系统配置信息

report命令打印出重要的系统配置信息,如下截图所示:

列出当前登录用户有权限访问的所有存储库

repos命令将列出存储库,无论它们是活动的还是不活动的,并且有各种可以使用的选项。在下面的截图中,我们使用了-m选项来匹配packtci GitHub 用户的所有存储库:

在 GitHub 中为任何新的或过时的存储库与 Travis CI 进行同步

sync命令帮助您更新 GitHub 用户的信息以及任何新的或修改的存储库。让我们在 GitHub 中添加另一个存储库,名为functional-patternsgithub.com/packtci/functional-patterns)。在下面的截图中,我们使用sync命令,以便 Travis CI 意识到新存储库,然后使用repos命令确认它显示在我们可以访问的存储库列表中:

sync命令可以替换我们在第九章中所采取的步骤,即单击同步帐户按钮以同步我们帐户中的所有存储库信息。

lint - 一个 Travis YML 脚本

lint命令非常有用,因为它检查您的 Travis YML 脚本中是否有正确的语法。让我们在functional-patterns存储库(github.com/packtci/functional-patterns)中创建一个 Travis YML 脚本。我们将为.travis.yml脚本添加以下条目:

language: blah node_js: 8.11

现在让我们运行lint命令来检查语法。在下面的截图中,Travis 通知我们正在使用blah的非法值,并且它将默认为ruby作为语言:

让我们修复语言条目以使用 Node.js,然后再次运行lint命令:

lint命令报告我们现在在.travis.yml脚本中有有效的语法。

获取组织或用户的当前构建信息

whatsup命令让您查看最近在 Travis 中发生的活动。当我们运行这个whatsup命令时,它给了我们 Travis CI 中最近的活动:

packtci Travis 帐户中,只有一个用户,但是您可以在 Travis CI 帐户中拥有许多用户,因此只查看您的存储库可能更有用。记住,我们可以使用help命令查找特定命令的更多选项。作为练习,使用help命令查找仅显示您自己的存储库的选项。

查找当前登录用户信息

whoami命令对于查找 Travis CI 帐户当前登录的用户非常有用:

whoami命令报告packtci,正如我们所期望的那样。

存储库命令

存储库命令具有 API 命令的所有选项,此外,您还可以使用--repo owner/name选项指定要使用的特定存储库。

显示 Git 版本控制中每个分支的最新构建信息

branches命令显示版本控制中每个分支的最新构建信息:

当您运行此命令时,可能会显示更多的分支。

列出所有存储库的缓存信息

cache命令可以列出存储库中的所有缓存:

删除给定存储库的缓存信息

cache命令还可以删除存储库中的缓存,如果您使用-d--delete选项:

我们收到了一条红色的警告消息,要求我们确认删除缓存。

在 Travis CI 中启用存储库

enable命令将在您的 GitHub 存储库中激活 Travis CI:

enable命令有助于替换我们在第九章中所采取的手动步骤,即激活 Travis CI 中的存储库,在那里我们在 Travis web 客户端中点击滑块按钮以激活存储库。

在 Travis CI 中禁用存储库

disable命令将使您的 GitHub 存储库中的 Travis CI 处于非活动状态:

取消 Travis CI 中的最新构建

让我们使用以下命令启用functional-patterns存储库:

travis enable

现在让我们使用以下命令向存储库推送提交:

git commit --amend --no-edit

先前的git命令允许您重用之前使用的git commit命令,但您需要发出以下命令:

git push -f

让我们查看 Travis CI 中存储库的当前状态;构建在 Travis CI 中正式创建可能需要一段时间:

在上一张屏幕截图中,我们发出了whatsup命令来查看构建的当前状态,并注意到packtci/functional-patterns开始了作业编号1。然后我们发出了travis cancel命令,并提供了一个参数1。这并不完全必要,因为这是当前的构建,所以我们可以只发出travis cancel命令。当我们运行travis whatsup命令时,构建被取消。

加密环境变量或部署密钥

encrypt命令允许您加密存储在环境变量和/或部署密钥中的秘密值,这些值您不希望公开显示:

在 Travis CI 中添加环境变量

我们将在我们的.travis.yml脚本的env块中添加这个条目。您可以在docs.travis-ci.com/user/environment-variables的文档中阅读有关在 Travis CI 中使用环境变量的更多信息。一般来说,您可以通过在您的.travis.yml脚本中添加一个名为env的块来添加环境变量。

我在.travis.yml脚本中添加了一个示例片段:

env:
    DB_URL=http://localhost:8078
    global:
        secure: "DeeYuU76cFvBIZTDTTE+o+lApUl5lY9JZ97pGOixyJ7MCCVQD26m+3iGLCcos0TbvjfAjE+IKTKZ96CLJkf6DNTeetl3+/VDp91Oa2891meWSgL6ZoDLwG8pCvLxaIg2tAkC26hIT64YKmzEim6ORQhLdUVUC1oz9BV8ygrcwtTo4Y9C0h7hMuYnrpcSlKsG9B8GfDdi7OSda4Ypn4aFOZ4/N3mQh/bMY7h6ai+tcAGzdCAzeoc1i0dw+xwIJ0P2Fg2KOy/d1CqoVBimWyHDxDoaXgmaaBeGIBTXM6birP09MHUs2REpEB9b8Z1Q+DzcA+u5EucLrqsm8BYHmyuPhAnUMqYdD4eHPQApQybY+kJP18qf/9/tFTyD5mH3Slk60ykc/bFaNCi7i4yAe7O8TI/Qyq3LPkHd1XEFDrHasmWwp/4k3m2p5ydDqsyyteJBHMO/wMDR7gb6T6jVVVmDn0bmurb4CTmiSuzslBS9N5C9QRd5k4XFUbpqTAHm+GtNYOOzRFTTyVH3wSKBj8xhjPLGZzCXeUxuW72deJ+ofxpTgKs7DM9pcfUShk+Ngykgy6VGhPcuMSTNXQv2w7Hw5/ZOZJt36ndUNXT0Mc9othq4bCVZBhRiDGoZuz9FSfXIK/kDKm2TjuVhmqZ7T//Y4AfNyQ/spaf8gjFZvW2u1Cg="

我们添加了一个名为DB_URL的公共环境变量,并使用global块添加了一个全局变量,然后将条目粘贴到其中。

如果您愿意,您可以使用--add选项自动添加条目,尽管您在.travis.yml脚本中的任何注释都将消失,间距也将消失,因此在运行--add选项时要注意这一点。

加密文件

encrypt-file命令将使用对称(AES-256)加密加密整个文件,并将秘密存储在文件中。让我们创建一个名为secret.txt的文件,并将以下条目添加到其中:

SECRET_VALUE=ABCDE12345
CLIENT_ID=rocky123
CLIENT_SECRET=abc222222!

现在让我们加密我们的秘密文件:

因此,现在我们将把这个条目添加到我们的.travis.yml脚本中:

before_install: - openssl aes-256-cbc -K $encrypted_74945c17fbe2_key -iv $encrypted_74945c17fbe2_iv -in secret.txt.enc -out secret.txt -d

然后它可以为我们解密秘密文本文件中的值。

列出环境信息

env命令可以列出为存储库设置的所有环境变量:

我们没有为此存储库设置任何环境变量。

设置环境变量

env命令还可以从存储库中设置环境变量:

我们设置了一个名为API_URL的环境变量,并且它现在显示为多语言存储库的环境变量。

删除环境变量

env命令还可以从存储库中删除环境变量:

travis env列表命令现在报告我们没有为多语言存储库设置任何环境变量,这是我们所期望的。

清除所有环境变量

env命令可用于清除存储库中设置的所有环境变量:

列出最近构建的历史信息

history命令显示存储库的构建历史:

history命令默认只显示最后 10 个构建,但您可以使用--limit选项来限制或扩展构建的数量。

在项目上初始化 Travis CLI

init命令将帮助您通过为您生成一个.travis.yml脚本来在项目中设置 Travis CI。我们在 GitHub 中设置了一个名为travis-init-command的新项目(github.com/packtci/travis-init-command)。我们将使用init命令在此存储库中设置 Golang:

该过程的步骤如下:

  1. 第一步是使用sync命令,以便 Travis CI 知道这个新存储库

  2. 接下来,我们将在 Travis CI 中启用这个新存储库。

  3. 接下来,我们将尝试使用 Golang 创建一个.travis.yml脚本,但请注意它没有被识别,因此我们再次尝试使用 Go,这次成功了

  4. 最后,我们打印出新文件的内容,并注意它将语言设置为 Go,并使用了两个不同版本的 Go

打印 CI 构建日志信息

logs命令将打印出存储库的 Travis CI 日志的内容,默认情况下它将打印出最新构建的第一个作业。在这里,我们在最近创建的存储库中运行logs命令;但是,它不会通过 CI 构建,因为存储库中还没有任何可构建的 Go 文件:

travis logs

displaying logs for packtci/travis-init-command#1.1
Worker information
hostname: fb102913-2cd8-41fb-b69b-7e8488a0aa0a@1.production-1-worker-org-03-packet
version: v3.8.2 https://github.com/travis-ci/worker/tree/c370f713bb4195cce20cdc6ce3e62f26b8cf3961
instance: 22589e2 travisci/ci-garnet:packer-1512502276-986baf0 (via amqp)
startup: 1.083854718s
Build system information
Build language: go
Build group: stable
Build dist: trusty
Build id: 399102978
Job id: 399102980
Runtime kernel version: 4.4.0-112-generic
...
The command "go get -v ./..." failed and exited with 1 during .

Your build has been stopped.

请注意,正如我们之前注意到的那样,build失败了,因为没有任何 Go 文件可以构建。 logs命令也可以给出一个特定的构建编号来运行,您还可以给它们一个特定的分支来运行。运行travis help logs命令以获取更多选项。

打开项目的 Travis web 界面

open命令将在 Travis CI web 客户端中打开存储库:

travis open

travis-init-command存储库(github.com/packtci/travis-init-command)中运行travis open将带我们转到以下 URL travis-ci.org/packtci/travis-init-command

您可以使用--print选项来打印出 URL,而不是默认情况下打开到特定项目视图。运行travis help open命令以获取更多选项。

打印存储库的公钥信息

pubkey命令将打印出存储库的公共 SSH 密钥:

出于安全原因,我删除了公钥信息。您还可以以不同格式显示密钥。例如,如果您使用--pem选项,您的密钥将显示如下:

运行travis help pubkey命令以显示此命令的更多选项:

在 Travis CI 中重新启动最新的 CI 构建

restart命令将重新启动最新的构建:

打印 Travis CI 中当前的构建请求

requests命令将列出 Travis CI 收到的任何构建请求。我们将在刚刚为travis-init-command存储库触发的构建上运行travis requests命令:

由于其中还没有任何可构建的 Go 文件,构建仍然失败。

打印特定存储库设置

settings命令将显示存储库的设置:

请注意,减号(-)表示已禁用,而加号(+)表示已启用。

travis settings命令也可用于启用、禁用和设置设置:

配置 Travis CI 附加功能

setup命令可帮助您配置 Travis 附加功能:

您可以在 Travis CLI 用户文档中查看更多可用的 Travis 附加功能(github.com/travis-ci/travis.rb#setup)。

显示当前 CI 构建的一般信息

show命令默认显示有关最近 CI 构建的一般信息:

第一个命令travis show显示了最近的构建,在下一次运行中,我们提供了一个特定的构建编号。

在 Travis CI 中列出 SSH 密钥

sshkey命令将检查是否设置了自定义 SSH 密钥:

travis sshkey

此命令仅适用于 Travis 的 Pro 版本,如果没有 SSH 密钥,它将报告未安装自定义 SSH 密钥。

您可以在用户文档中阅读有关此命令的更多选项(github.com/travis-ci/travis.rb#sshkey)。

显示当前构建的状态信息

status命令将输出有关项目最后构建的一行消息:

Travis CI 的 Pro 版本和企业版本选项

默认情况下,一般 API 命令会访问api.travis-ci.org端点。Travis Pro 版本具有一些常规 Travis 帐户没有的附加功能和选项,例如使用sshkey命令等。您可以在用户文档中阅读有关选项的更多信息(github.com/travis-ci/travis.rb#pro-and-enterprise)。

显示 Pro 版本的信息选项

如果您在一般 API 命令中使用--pro选项,则将访问 Travis Pro 端点https://api.travis-ci.com/。例如,如果我们使用--pro选项进行以下请求,我们将访问 Travis Pro API:

请注意,主机是travis-ci.com,这是 Travis PRO。

显示企业版本的信息选项

如果您已设置 Travis Enterprise,则可以使用--enterprise选项,以便访问您的企业域所在的位置:

我们没有设置 Travis Enterprise,但如果您设置了,则可以在此处输入您的域。

摘要

在本章中,我们已经介绍了如何在 Windows 操作系统、macOS 操作系统和 Linux 操作系统上安装 Ruby 和 Travis CLI RubyGem。我们详细介绍了每个 Travis CLI 命令,并讨论了使用每个命令的各种方式以及每个命令所接受的一些选项。我们还向您展示了如何使用 curl REST 客户端直接调用 Travis API。最后,我们还介绍了 Travis Pro 和 Enterprise 版本中的一些功能。

在下一章中,我们将介绍一些更高级的技术,以记录值并使用 Travis CI 进行调试。

问题

  1. 根据 Travis 文档,安装 Ruby 在 Windows 操作系统上的推荐方式是什么?

  2. 您应该使用哪个命令来打印已安装的 Travis 的当前版本?

  3. 您在 Travis CLI 中使用哪个命令来打印有用的信息?

  4. 如何获取访问令牌以便在 Travis CLI 中使用一般 API 命令?

  5. 您需要使用哪个 HTTP 标头来使用 Travis API 版本 3?

  6. 如何打印系统配置信息?

  7. 哪个命令检查您的 Travis YML 脚本的语法?

  8. 哪个命令可以帮助您在项目中设置 Travis?

进一步阅读

您可以在用户文档中进一步探索 Travis CLI 选项(github.com/travis-ci/travis.rb),您可以在 API 文档中阅读有关使用 Travis API 的更多信息(developer.travis-ci.com/)。