使用Blue Ocean生成Pipeline

该教程展示如何使用Jenkins的 Blue Ocean 特性生成一个流水线,该流水线将协调构建一个简单的应用程序。

在学习本教程前, 建议您先从Tutorials overview 页面至少浏览一组入门教程来熟悉CI/CD 概念 (与你 最熟悉的技术栈有) 以及这些概念是如何在Jenkins中实现的。 Jenkins.

本教程使用与Build a Node.js and React app with npm 教程相同的应用程序 . 因此, 你这次将完全通过Blue Ocean构建相同的应用程序。 自从 Blue Ocean 提供了简化的 Git处理经验, 你将直接与 GitHub上的仓库进行交互 (相对于该存储库的本地clone)。

Duration: 本教程需花费 20-40 分钟 (假设你已经 完成下述的 配置要求 )。 确切的时间取决于你的机器的运行速度 和是否你已经在另一个教程run Jenkins in Docker

你可以随时停止本教程,并且从你离开的地方继续 。

如果你已经完成 另一个教程, 你可以跳过下面的 配置要求Run Jenkins in Docker部分并继续 fork示例仓库。如果你需要重启Jenkins,只需遵循停止和重启 Jenkins中的重启指示然后继续。

配置要求

对于本教程,您将需要:

  • 安装有macOS,Linux或Windows操作系统的机器,并拥有以下配置:

    • 最小256MB内存, 推荐512MB以上。

    • 10GB硬盘空间, 用于安装Jenkins,您的Docker镜像和容器。

  • 安装有以下软件:

    • Docker - 在安装Jenkins页面的安装Docker章节阅读更多信息。
      注意: 如果您使用Linux,本教程假定您没有以root用户的身份运行Docker命令,而是使用单个用户帐户访问本教程中使用的其他工具。

在 Docker中运行Jenkins

在本教程中, 将Jenkins作为 Docker 容器并从 jenkinsci/blueocean Docker 镜像中运行。

要在 Docker中运行Jenkins, 请遵循下面的macOS 和 LinuxWindows相关文档说明进行操作。 .

你可以在 DockerInstalling Jenkins 页面的 Downloading and running Jenkins in Docker部分阅读更多有关Docker容器和镜像概念的信息。

在 macOS 和 Linux 系统上

  1. 打开终端窗口

  2. 使用下面的 docker run 命令运行 jenkinsci/blueocean 镜像作为Docker中的一个容器(记住,如果本地没有镜像,这个命令会自动下载):

    1. docker run \
    2. --rm \
    3. -u root \
    4. -p 8080:8080 \
    5. -v jenkins-data:/var/jenkins_home \ (1)
    6. -v /var/run/docker.sock:/var/run/docker.sock \
    7. -v "$HOME":/home \ (2)
    8. jenkinsci/blueocean
    1将容器中的 /var/jenkins_home 目录映射到 Docker volume ,并将其命名为 jenkins-data。如果该卷不存在, 那么 docker run 命令会自动为你创建卷。
    2将主机上的$HOME 目录 (即你的本地)映射到 (通常是 /Users/<your-username> 目录) 到容器的 /home 目录。

    Note: 如果复制或粘贴上面的命令片段不起作用, 尝试复制和粘贴这个没有注释的版本:

    1. docker run \
    2. --rm \
    3. -u root \
    4. -p 8080:8080 \
    5. -v jenkins-data:/var/jenkins_home \
    6. -v /var/run/docker.sock:/var/run/docker.sock \
    7. -v "$HOME":/home \
    8. jenkinsci/blueocean
  3. 继续 安装向导

在 Windows 系统

  1. 打开命令提示窗口。

  2. 使用下面的 docker run 命令运行 jenkinsci/blueocean 镜像作为Docker中的一个容器(记住,如果本地没有镜像,这个命令会自动下载):

    1. docker run ^
    2. --rm ^
    3. -u root ^
    4. -p 8080:8080 ^
    5. -v jenkins-data:/var/jenkins_home ^
    6. -v /var/run/docker.sock:/var/run/docker.sock ^
    7. -v "%HOMEPATH%":/home ^
    8. jenkinsci/blueocean

    对这些选项的解释, 请参考上面的 macOS 和 Linux 说明。

  3. 继续安装向导

访问 Jenkins/Blue Ocean Docker 容器

如果你有一些使用 Docker 的经验,希望或需要使用 docker exec 命令通过一个终端/命令提示符来访问 Jenkins/Blue Ocean Docker 容器, 你可以添加如 --name jenkins-tutorials 选项(与上面的 docker run ), 这将会给Jenkins/Blue Ocean Docker容器一个名字 “jenkins-tutorials”。

这意味着你可以通过 docker exec 命令访问Jenkins/Blue Ocean 容器(通过一个单独的终端 /命令提示窗口) ,例如:

docker exec -it jenkins-tutorials bash

安装向导

在你访问 Jenkins之前, 你需要执行一些快速的 “一次性” 步骤。

解锁 Jenkins

当你第一次访问一个新的 Jenkins 实例时, 要求你使用自动生成的密码对其进行解锁。

  1. 当在终端/命令提示窗口出现两组星号时, 浏览 http://localhost:8080 并等待 Unlock Jenkins 页面出现。

    Unlock Jenkins page

  2. 再次从终端/命令提示窗口, 复制自动生成的字母数字密码(在两组星号之间)。 Copying initial admin password

  3. Unlock Jenkins 页面, 粘贴该密码到 Administrator password 字段并点击 Continue

使用插件自定义 Jenkins

解锁 Jenkins后, Customize Jenkins 页面出现。

在该页面,点击 Install suggested plugins

安装向导显示了正在配置的Jenkins的进程,以及建议安装的插件。这个过程肯需要几分钟。

创建第一个管理员用户

最后, Jenkins 要求创建你的第一个管理员用户。

  1. Create First Admin User 页面出现, 在相应的字段中指定你的详细消息并点击 Save and Finish

  2. Jenkins is ready 页面出现, 点击 Start using Jenkins
    Notes:

    • 该页面可能表明 Jenkins is almost ready! 如果相反, 点击 Restart.

    • 如果该页面在一分钟后没有自动刷新, 使用你的web浏览器手动刷新。

  3. 如果需要,登录 Jenkins , 你就可以开始使用 Jenkins了!

停止和重启 Jenkins

在本教程的其余部分, 你可以通过在终端/命令提示窗口输入 Ctrl-C`停止 Jenkins/Blue Ocean Docker 容器,你可以从中运行<<run-jenkins-in-docker,上面>>的 `docker run ... 命令。

要重启Jenkins/Blue Ocean Docker 容器:

  1. 在上面的 macOS,LinuxWindows上运行相同的 docker run ... 命令 。
    Note: 如果有更新的话,该进程会更新 jenkinsci/blueocean Docker 镜像。

  2. 浏览`http://localhost:8080\`。

  3. 等待直到登录页面出现并登陆。

Fork GitHub上的示例仓库

Fork GitHub上的示例 “Welcome to React” Node.js 和 React 应用到你自己的 GitHub 账户 。

  1. 确保你有 GitHub 账户。 如果没有, 在 GitHub 网站注册一个免费账号。

  2. 在GitHub Fork creating-a-pipeline-in-blue-ocean 到本地的 GitHub 账号。 在这个过程中如果需要帮助, 请参考GitHub网站的 Fork A Repo 文档 了解更多信息。
    Note: 这是不同于使用npm构建 Node.js 和 React 应用程序 教程的另一个仓库。 尽管这些仓库包含相同的应用程序代码, 但请确保在继续之前正确的fork 和使用 。

在Blue Ocean创建你的流水线项目

  1. 回到Jenkins并进入Blue Ocean 界面。要做到这一点, 你应该:

  2. 在Blue Ocean界面中心的 Welcome to Jenkins , 点击 Create a new Pipeline 来启动流水线创建向导。
    Note: 如果你没有看到这个框, 点击右上方的 New Pipeline

  3. Where do you store your code?, 点击 GitHub

  4. Connect to GitHub, 点击 Create an access key here。这将在一个新的浏览器选项卡中打开 GitHub。
    Note: 如果你之前配置了 Blue Ocean,使用个人的访问令牌连接到GitHub, then Blue Ocean 将直接带你到 below的第9步。

  5. 在新的选项卡中, 登录到 GitHub 账户 (如果需要) 并进入 GitHub的 New Personal Access Token 页面, 为你的 GitHub 访问令牌 (e.g. Blue Ocean)指定一个简短的 Token description
    Note: 访问令牌通常是一个字母数字的字符串 ,它代表你的 GitHub 账户具有访问各种 GitHub 特性 和区域的特权。该访问令牌将具有预选的适当权限, 该权限为Blue Ocean 需要访问你的GitHub账号并与其交互。

  6. 向下滚动到页面的底部 (保留所有的 Select scopes 选项 的默认设置) 并点击 Generate token

  7. 在生成的*Personal access tokens* 页面上, 复制新生成的访问令牌。

  8. 回到Blue Ocean, 粘贴访问令牌到 Your GitHub access token 域并点击 Connect。 +

    Connecting to GitHub
    Jenkins现在在访问你的 GitHub 账户 (由你的访问令牌提供).

  9. Which organization does the repository belong to?, 点击你的 GitHub 账号 (你abovefork仓库的地方 ).

  10. Choose a repository, 点击fork的仓库的 creating-a-pipeline-in-blue-ocean

  11. 点击 Create Pipeline.
    Blue Ocean 检测到在存储库的`master` 主分支的根级别上没有 Jenkinsfile 文件 然后就帮你创建一个。 (因此, 你要点击在页面的尾部另一个 Create Pipeline 来继续。)
    Note: 在, 通过Blue Ocean创建的流水线项目实际上是 “多分支流水线”。 因此, Jenkins 在你的存储库的任何分支上至少找到一个Jenkinsfile文件。

创建你的初始流水线

  1. 在创建流水线项目之后 (above), 在流水线编辑器中, 从右边的 Pipeline Settings*面板中的*Agent*下拉框中选择 *docker。 +

    Initial to GitHub

  2. 在出现的 ImageArgs 域中, 分别指定`node:6-alpine` 和 -p 3000:3000

    Configuring the agent
    Note: 对这些值的解释, 请参考“Create your initial Pipeline…​” section of the Build a Node.js and React app 教程的声明式流水线的注释 12

  3. 在主流水线编辑器中, 点击 + 图标, 它会打开右侧的新阶段面板。
    Add <em>Build</em> stage

  4. 在该面板中, 在 Name your stage*域中输入 Build,然后点击下面的 *Add Step 按钮, 它会打开 Choose step type 面板。

    Adding the Build stage

  5. 在这个面板中,点击列表顶部附近的 Shell Script (选择该步骤类型), 它打开 Build / Shell Script 面板, 在这儿你可以输入该步骤的值。 Choosing a step type
    Tip: 最常用的步骤类型出现在最靠近列表顶部的地方。要想在这个列表中找到其他的步骤, 你可以使用 Find steps by name 选项筛选这个列表。

  6. Build / Shell Script 面板, 指定 npm install

    Specifying a shell step value
    Note: 对该步骤的解释, 请参考 “Create your initial Pipeline…​” section of the Build a Node.js and React app 教程的声明式流水线的注解 4

  7. ( Optional ) 点击左上的箭头图标 Return from step icon 回到主流水线编辑器。

  8. 点击右上方的 Save 按钮 开始保存你的带有”Build” 阶段的新流水线 。

  9. Save Pipeline 对话框, 在 Description 域输入命令信息 (比如 Add initial Pipeline (Jenkinsfile))。

    Save Pipeline dialog box

  10. 保留所有其他选项, 点击 Save & run ,Jenkins 就会继续构建你的流水线。

  11. 当出现Blue Ocean 的主界面时, 点击该行来查看 Jenkins 构建你的流水线项目。+ Note: 你可能需要几分钟来完成第一次的运行。 在此期间, Jenkins 进行了如下动作:

    1. 将你的流水线作为 Jenkinsfile 提交到仓库的唯一分支 (也就是 master)。

    2. 最初让项目在代理上排队构建。

    3. 下载 Node Docker 镜像并在Docker的一个容器上运行。

    4. 在Node容器中执行 Build 阶段 (定义在 Jenkinsfile)。(在此期间, npm 下载了一些需要的依赖来运行你的Node.js 和 React 应用程序, 他最终被保存在 本地的Jenkins主目录的 node_modules 目录中).

      Downloading <em>npm</em> dependencies

    如果Jenkins成功构建了你的应用程序,Blue Ocean 界面会变成绿色。

    Initial Pipeline runs successfully

  12. 点击右上方的 X 回到 Blue Ocean 的主界面。

    Main Blue Ocean interface
    Note: 再继续之前, 你可以检查到Jenkins已为你在你fork的GitHub仓库创建了 Jenkinsfile (在仓库的唯一的 master 分支)。

给你的流水线添加测试阶段

  1. 在Blue Ocean 界面, 点击右上方的 Branches 访问你的仓库的分支页面, 在这儿你可以访问 master 分支。+

    Repository branches page

  2. 点击 master 分支的 “Edit Pipeline” 图标 Edit Pipeline on branch 打开该分支的流水线编辑器。

  3. 在主流水线编辑器中, 点击在above创建的*Build*阶段的右侧的 + 图标,打开右侧的新阶段面板。
    Add <em>Test</em> stage

  4. 在这个面板中, 在 Name your stage*域输入 Test ,点击下面的 *Add Step 按钮来打开 Choose step type 面板。

  5. 在这个面板中, 点击列表顶部附近的 Shell Script

  6. 在生成的 Test / Shell Script 面板, 指定 ./jenkins/scripts/test.sh ,然后点击左上方的箭头图标 Return from step icon 返回到流水线阶段编辑器。

  7. 在面板的右下方, 点击 Settings 以显示面板的这一部分。

  8. 点击*Environment* 标题右边的 + 图标 (你将配置一个环境变量)。

  9. 在出现的 NameValue 域中, 分别指定 CI and true。+ Environment directive
    Note: 对该指令以及它的步骤的解释, 请参考“Add a test stage…​” section of the Build a Node.js and React app 教程的生命是流水线的注解 13

  10. ( Optional ) 点击左上方的箭头图标 Return from step icon 回到主流水线编辑器 。

  11. 点击右上方的 Save 按钮开始保存你的带有新得”Test”阶段的流水线。

  12. Save Pipeline 对话框的*Description*域, 输入提交信息(比如 Add 'Test' stage)。

  13. 保留所有其它选项, 点击 Save & run , Jenkins 就会构建你改进后的流水线。

  14. 当Blue Ocean的主界面出现时, 点击 top 行来查看Jenkins 构建你的流水线项目。
    Note: 你会注意到在这次运行中Jenkins 不再需要下载 Node Docker 镜像。 Jenkins 只是需要从之前下载过的Node镜像中运行一个新的容器。因此, 在接下来的时间运行你的流水线会更快些。
    如果你改进后的流水巷运行成功, Blue Ocean界面应如下图所示。注意另外的”Test” 阶段。你可以点击之前的 “Build” 阶段来循环的访问这些阶段的输出。

    Test stage runs successfully (with output)

  15. 点击右上方的 X 回到 Blue Ocean 的主界面。

给你的流水线添加最终交付阶段

  1. 在 Blue Ocean 的主界面, 点击右上方的 Branches 以访问你仓库的 master 分支。

  2. 点击 master 分支的 “编辑流水线” 图标 Edit Pipeline on branch 为该分支打开流水线编辑器。

  3. 在主流水线编辑器中, 点击在above创建的*Test*阶段右侧的 + 图标来打开新阶段面板。
    Add <em>Deliver</em> stage

  4. 在这个面板中的 Name your stage 域, 输入 Deliver 并点击下面的 Add Step 按钮打开 Choose step type 面板。

  5. 在该面板中, 点击列表顶部附近的 Shell Script

  6. 在生成的 Deliver / Shell Script 面板, 指定 ./jenkins/scripts/deliver.sh ,然后点击左上的箭头图标 Return from step icon 回到流水线阶段编辑器。

    Add next step
    Note: 对该步骤的解释, 请参考`deliver.sh`文件,它位于你在GitHub fork的仓库的 jenkins/scripts 中。

  7. 再次点击 Add Step 按钮。

  8. Choose step type 面板的 Find steps by name 域输入 input

    Choosing the input step type

  9. 点击过滤后的 Wait for interactive input 步骤类型。

  10. 在生成的 Deliver / Wait for interactive input 面板,在 Message 域指定 Finished using the web site? (Click "Proceed" to continue),然后点击左上方的箭头图标 Return from step icon 回到流水线阶段编辑器。

    Specifying input step message value
    Note: 对该步骤的解释, 请参考“Add a final deliver stage…​” section of the Build a Node.js and React app 教程的声明式流水线的注释 4

  11. 点击 Add Step 按钮 (最后一次)。

  12. 点击列表顶部附近的 Shell Script

  13. 在生成的 Deliver / Shell Script 面板, 指定 ./jenkins/scripts/kill.sh.
    Note: 对该步骤的解释,请参考 kill.sh 文件,它 位于你在GitHub上fork的仓库的 jenkins/scripts 中。

  14. ( Optional ) 点击左上方的图标按钮 Return from step icon回到主流水线编辑器。

  15. 点击右上方的 Save 按钮开始保存你的带有新”Deliver” 阶段的流水线。

  16. Save Pipeline 对话框的 Description 域填写提交信息 (比如 Add 'Deliver' stage)。

  17. 保留所有其它选项, 点击 Save & run ,Jenkins 就会对你改进后的流水线进行构建。

  18. 当Blue Ocean主界面出现时, 点击 _top_行来查看Jenkins 构建你的流水线项目。+ 如果你改进后的流水巷线运行成功, Blue Ocean 界面应如下图所示。注意另外的 “Deliver” 阶段。 点击之前的”Test” 和 “Build” 阶段循环的访问这些阶段的输出。

    Deliver stage pauses for user input

  19. 确保你正在查看 “Deliver” 阶段 (如果必要的话点击它), 探后点击绿色的 ./jenkins/scripts/deliver.sh 步骤来扩展它的内容并向下滚动直到你看到 http://localhost:3000 链接。 Deliver stage output only

  20. 点击 http://localhost:3000 链接查看你的 Node.js 和 React 应用程序在一个新的web浏览器选项卡中运行 (在开发模式下)。 你将会看到一个标题为*Welcome to React*的网页/站点。

  21. 当你查看完该网页/站点时, 点击 Proceed 按钮以完成流水线的执行。

    Deliver stage runs successfully

  22. 点击右上方的 X 回到Blue Ocean 的主界面, 它以时间顺序的反序的方式列出了你的流水线运行的历史记录。

    Main Blue Ocean interface with all previous runs displayed

跟踪 (可选)

如果你检查在你fork的`creating-a-pipeline-in-blue-ocean` 仓库的根目录下的Blue Ocean生成的 Jenkinsfile 的内容 , 注意 environment 指令的位置。 该指令在”Test” 阶段的位置意味着环境变量 CI (它的值为`true`) 只是在”Test”阶段的范围内可用的变量。

你可以在Blue Ocean中设置该指令以便于它的环境变量在整个流水线中都是可用的(和 使用npm构建Node.js 和 React 应用程序 教程中一样)。要做到这一点:

  1. 从Blue Ocean的主界面, 点击右上方的 *Branches*来访问仓库的 master 分支。

  2. 点击 master 分支的”编辑流水线” 图标 Edit Pipeline on branch为该分支打开流水线编辑器。

  3. 在主流水线编辑器中, 点击 你在 above创建的*Test* 阶段 开始编辑它。

  4. 在右侧的阶段面板中, 点击 Settings 来显示面板的这一部分。

  5. 点击 `CI`环境变量(你之前创建的)右边的减 (-) 图标来删除它。

  6. 点击左上的箭头图标 Return from step icon 返回主流水线编辑器。

  7. Pipeline Settings 面板,点击*Environment*标题右边的 + 图标 (你将为此配置一个 global 环境指令)。

  8. 在出现的 NameValue 域中, 分别指定 CItrue

  9. 点击右上的*Save* 按钮开始保存你的迁移了环境指令的流水线。

  10. 在*Save Pipeline* 对话框的*Description*域指定提交消息(比如 Make environment directive global)。

  11. 保留所有的其他设置, 点击 Save & run ,Jenkins 继续去构建你的改进后的流水线。

  12. 当出现Blue Ocean 的主界面时, 点击 top 行来查看Jenkins 构建你的流水线项目。
    你应该看到与当你添加最终交付阶段(above)完成后相同的构建工程。 然而, 当你再次检查 Jenkinsfile , 你会注意到 environment 指令是 agent 部分的兄弟。

结束语

做得好!您刚刚使用Jenkins的Blue Ocean特性以及npm构建了一个简单的Node.js 和React应用程序!

您在上面创建的 “Build”, “Test” 和 “Deliver” 阶段是在Jenkins中使用技术栈构建其他应用程序的基础,包括更复杂的应用程序以及将多个技术栈组合在一起的应用程序。

由于Jenkins具有极高的可扩展性,因此可以对其进行修改和配置,以处理构建协调和自动化的几乎任何方面。

要详细了解Jenkins可以做什么,请查看: