蚊章汇 - Jenkins
type: channel
link: https://linuxcn.bwsl.wang/tag/Jenkins/
items: 如何使 Jenkins 日志更可读
items: 用 Jenkins 构建 CI/CD 流水线
items: 完全指南：在容器中运行 Jenkins 构建
items: 如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器

如何使 Jenkins 日志更可读
type: item
date: 2021-05-15T17:30:25+08:00
description: Jenkins 的默认日志难以阅读，但日志本不必如此。Jenkins 是一个自由开源的自动化服务器，用于构建、测试和部署代码。它是 持续集成 Continuous Integration （CI）、 持续交付 Continuous Delivery （CD）的基础，可以为开发人员每天节约几小时，并保护他们免受失败的代码上线的影响。一旦代码失效或开发人员需要查看测试输出时，Jenkins 提供了日志文件以供检查。默认的 Jenkins 管道 Pipeline 日志可能难以阅读。这篇关于 Jenkins 日志的基础知识的总结文章提供了一些技巧（和代码），说明了如何提升它们的可读性。你获得什么Jenkins 管道分为 几个阶段。Jenkins 自动记录每个阶段的开始，记录内容如下：[Pipeline] // stage [Pipeline] stage (hide) [Pipeline] { (Apply all openshift resources) [Pipeline] dir 上文显示的内容没有太大区分度，重要的内容（如阶段的开始）未突出显示。在多达数百行的管道日志中，要找到一个阶段的起始和另外一个阶段的终止位置可能会很艰巨。当随意浏览日志寻找一个特定的阶段的时候，这种艰巨尤其明显。Jenkins 管道是由 Groovy 和 Shell 脚本混合编写的。在 Groovy 代码中，日志记录很少。很多时候，日志是由命令中的不起眼的文本组成，没有详细信息。在 Shell 脚本中，打开了调试模式（set -x），所以每条命令都会被完全 具现化 realized （变量被解除引用并打印出数值）并详细记录，输出也是如此。鉴于日志可能有很多内容，通读日志获取相关信息可能很繁琐。由于在管道中被处理，并跟着一个 Shell 脚本的 Groovy 日志可读性差，它们很多时候缺少上下文：[Pipeline] dir Running in /home/jenkins/agent/workspace/devop-master/devops-server-pipeline/my-repo-dir/src [Pipeline] { (hide) [Pipeline] findFiles [Pipeline] findFiles [Pipeline] readYaml [Pipeline] } 我可以知道我正在使用的目录，并且知道我正在使用 Jenkins 的步骤搜索文件、读取 YAML 文件。但是我在寻找什么？我找到并读取的内容是什么？能做什么？我很高兴你这么问，因为这里有一些简单的做法和一些小的代码片段可以提供帮助。首先，代码如下：def echoBanner(def ... msgs) { echo createBanner(msgs) } def errorBanner(def ... msgs) { error(createBanner(msgs)) } def createBanner(def ... msgs) { return """ =========================================== ${msgFlatten(null, msgs).join("\n ")} =========================================== """ } // flatten function hack included in case Jenkins security // is set to preclude calling Groovy flatten() static method // NOTE: works well on all nested collections except a Map def msgFlatten(def list, def msgs) { list = list ?: [] if (!(msgs instanceof String) && !(msgs instanceof GString)) { msgs.each { msg -> list = msgFlatten(list, msg) } } else { list += msgs } return list } 将这段代码添加到每个管道的末尾，也可以 加载一个 Groovy 文件 或者使其成为 Jenkins 共享库 的一部分，这样更有效。在每个阶段起始处（或者在阶段中的特定位置），只需调用 echoBanner：echoBanner("MY STAGE", ["DOING SOMETHING 1", "DOING SOMETHING 2"]) 你的 Jenkins 日志会展示如下： =========…

用 Jenkins 构建 CI/CD 流水线
type: item
date: 2019-11-07T08:07:00+08:00
description: 通过这份 Jenkins 分步教程，构建持续集成和持续交付（CI/CD）流水线。在我的文章《使用开源工具构建 DevOps 流水线的初学者指南》中，我分享了一个从头开始构建 DevOps 流水线的故事。推动该计划的核心技术是 Jenkins，这是一个用于建立持续集成和持续交付（CI/CD）流水线的开源工具。在花旗，有一个单独的团队为专用的 Jenkins 流水线提供稳定的主从节点环境，但是该环境仅用于质量保证（QA）、构建阶段和生产环境。开发环境仍然是非常手动的，我们的团队需要对其进行自动化以在加快开发工作的同时获得尽可能多的灵活性。这就是我们决定为 DevOps 建立 CI/CD 流水线的原因。Jenkins 的开源版本由于其灵活性、开放性、强大的插件功能和易用性而成为显而易见的选择。在本文中，我将分步演示如何使用 Jenkins 构建 CI/CD 流水线。什么是流水线？在进入本教程之前，了解有关 CI/CD 流水线 pipeline 的知识会很有帮助。首先，了解 Jenkins 本身并不是流水线这一点很有帮助。只是创建一个新的 Jenkins 作业并不能构建一条流水线。可以把 Jenkins 看做一个遥控器，在这里点击按钮即可。当你点击按钮时会发生什么取决于遥控器要控制的内容。Jenkins 为其他应用程序 API、软件库、构建工具等提供了一种插入 Jenkins 的方法，它可以执行并自动化任务。Jenkins 本身不执行任何功能，但是随着其它工具的插入而变得越来越强大。流水线是一个单独的概念，指的是按顺序连接在一起的事件或作业组：“ 流水线 pipeline ”是可以执行的一系列事件或作业。理解流水线的最简单方法是可视化一系列阶段，如下所示：在这里，你应该看到两个熟悉的概念： 阶段 Stage 和 步骤 Step 。阶段：一个包含一系列步骤的块。阶段块可以命名为任何名称；它用于可视化流水线过程。步骤：表明要做什么的任务。步骤定义在阶段块内。在上面的示例图中，阶段 1 可以命名为 “构建”、“收集信息”或其它名称，其它阶段块也可以采用类似的思路。“步骤”只是简单地说放上要执行的内容，它可以是简单的打印命令（例如，echo "Hello, World"）、程序执行命令（例如，java HelloWorld）、shell 执行命令（ 例如，chmod 755 Hello）或任何其他命令，只要通过 Jenkins 环境将其识别为可执行命令即可。Jenkins 流水线以编码脚本的形式提供，通常称为 “Jenkinsfile”，尽管可以用不同的文件名。下面这是一个简单的 Jenkins 流水线文件的示例：// Example of Jenkins pipeline script pipeline { stages { stage("Build") { steps { // Just print a Hello, Pipeline to the console echo "Hello, Pipeline!" // Compile a Java file. This requires JDKconfiguration from Jenkins javac HelloWorld.java // Execute the compiled Java binary called HelloWorld. This requires JDK configuration from Jenkins java HelloWorld // Executes the Apache Maven commands, clean then package. This requires Apache Maven configuration from Jenkins mvn clean package ./HelloPackage // List the files in current directory path by executing a default shell command sh "ls -ltr" } } // And next stages if you want to define further... } // End of stages } // End of pipeline从此示例脚本很容易看到 Jenkins 流水线的结构。请注意，默认情况下某些命令（如 java、javac和 mvn）不可用，需要通过 Jenkins 进行安装和配置。 因此：Jenkins 流水线是一种以定义的方式依次执行 Jenkins 作业的方法，方法是将其编码并在多个块中进行结构化，这些块可以包含多个任务的步骤。好。既然你已经了解了 Jenkins 流水线是什么…

完全指南：在容器中运行 Jenkins 构建
type: item
date: 2018-06-13T19:15:05+08:00
description: 容器应用程序平台能够动态地启动具有资源限制的独立容器，从而改变了运行 CI/CD 任务的方式。现今，由于 Docker 和 Kubernetes（K8S）提供了可扩展、可管理的应用平台，将应用运行在容器中的实践已经被企业广泛接受。近些年势头很猛的微服务架构也很适合用容器实现。容器应用平台可以动态启动指定资源配额、互相隔离的容器，这是其最主要的优势之一。让我们看看这会对我们运行 持续集成/持续部署 continuous integration/continuous development （CI/CD）任务的方式产生怎样的改变。构建并打包应用需要一定的环境，要求能够下载源代码、使用相关依赖及已经安装构建工具。作为构建的一部分，运行单元及组件测试可能会用到本地端口或需要运行第三方应用（如数据库及消息中间件等）。另外，我们一般定制化多台构建服务器，每台执行一种指定类型的构建任务。为方便测试，我们维护一些实例专门用于运行第三方应用（或者试图在构建服务器上启动这些第三方应用），避免并行运行构建任务导致结果互相干扰。为 CI/CD 环境定制化构建服务器是一项繁琐的工作，而且随着开发团队使用的开发平台或其版本变更，会需要大量的构建服务器用于不同的任务。一旦我们有了容器管理平台（自建或在云端），将资源密集型的 CI/CD 任务在动态生成的容器中执行是比较合理的。在这种方案中，每个构建任务运行在独立启动并配置的构建环境中。构建过程中，构建任务的测试环节可以任意使用隔离环境中的可用资源；此外，我们也可以在辅助容器中启动一个第三方应用，只在构建任务生命周期中为测试提供服务。听上去不错，让我们在现实环境中实践一下。注：本文基于现实中已有的解决方案，即一个在 Red Hat OpenShift v3.7 集群上运行的项目。OpenShift 是企业级的 Kubernetes 版本，故这些实践也适用于 K8S 集群。如果愿意尝试，可以下载 Red Hat CDK，运行 jenkins-ephemeral 或 jenkins-persistent 模板在 OpenShift 上创建定制化好的 Jenkins 管理节点。解决方案概述在 OpenShift 容器中执行 CI/CD 任务（构建和测试等） 的方案基于分布式 Jenkins 构建，具体如下：我们需要一个 Jenkins 主节点；可以运行在集群中，也可以是外部提供支持 Jenkins 特性和插件，以便已有项目仍可使用可以用 Jenkins GUI 配置、运行任务或查看任务输出如果你愿意编码，也可以使用 Jenkins Pipeline从技术角度来看，运行任务的动态容器是 Jenkins 代理节点。当构建启动时，首先是一个新节点启动，通过 Jenkins 主节点的 JNLP（5000 端口） 告知就绪状态。在代理节点启动并提取构建任务之前，构建任务处于排队状态。就像通常 Jenkins 代理服务器那样，构建输出会送达主节点；不同的是，构建完成后代理节点容器会自动关闭。不同类型的构建任务（例如 Java、 NodeJS、 Python等）对应不同的代理节点。这并不新奇，之前也是使用标签来限制哪些代理节点可以运行指定的构建任务。启动用于构建任务的 Jenkins 代理节点容器需要配置参数，具体如下：用于启动容器的 Docker 镜像资源限制环境变量挂载的卷这里用到的关键组件是 Jenkins Kubernetes 插件。该插件（通过使用一个服务账号） 与 K8S 集群交互，可以启动和关闭代理节点。在插件的配置管理中，多种代理节点类型表现为多种 Kubernetes pod 模板，它们通过项目标签对应。这些代理节点镜像以开箱即用的方式提供（也有 CentOS7 系统的版本）：jenkins-slave-base-rhel7：基础镜像，启动与 Jenkins 主节点连接的代理节点；其中 Java 堆大小根据容器内容设置jenkins-slave-maven-rhel7：用于 Maven 和 Gradle 构建的镜像（从基础镜像扩展）jenkins-slave-nodejs-rhel7：包含 NodeJS4 工具的镜像（从基础镜像扩展）注意：本解决方案与 OpenShift 中的 Source-to-Image（S2I） 构建无关，虽然后者也可以用于某些特定的 CI/CD 任务。入门学习资料有很多不错的博客和文档介绍了如何在 OpenShift 上执行 Jenkins 构建。不妨从下面这些开始：OpenShift Jenkins 镜像文档及 源代码网络播客：基于 OpenShift 的 CI/CD外部 Jenkins 集成 剧本阅读这些博客和文档有助于完整的理解本解决方案。在本文中，我们主要关注具体实践中遇到的各…

如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器
type: item
date: 2017-05-08T16:29:33+08:00
description: Jenkins 是从 Hudson 项目衍生出来的自动化服务器。Jenkins 是一个基于服务器的应用程序，运行在 Java servlet 容器中，它支持包括 Git、SVN 以及 Mercurial 在内的多种 SCM（ 源码控制工具 （ Source Control Management ） ）。Jenkins 提供了上百种插件帮助你的项目实现自动化。Jenkins 由 Kohsuke Kawaguchi 开发，在 2011 年使用 MIT 协议发布了第一个发行版，它是个自由软件。在这篇指南中，我会向你介绍如何在 Ubuntu 16.04 中安装最新版本的 Jenkins。我们会用自己的域名运行 Jenkins，在 apache web 服务器中安装和配置 Jenkins，而且支持反向代理。前提Ubuntu 16.04 服务器 - 64 位Root 权限第一步 - 安装 Java OpenJDK 7Jenkins 基于 Java，因此我们需要在服务器上安装 Java OpenJDK 7。在这里，我们会从一个 PPA 仓库安装 Java 7，首先我们需要添加这个仓库。默认情况下，Ubuntu 16.04 没有安装用于管理 PPA 仓库的 python-software-properties 软件包，因此我们首先需要安装这个软件。使用 apt 命令安装 python-software-properties。apt-get install python-software-properties 下一步，添加 Java PPA 仓库到服务器中。add-apt-repository ppa:openjdk-r/ppa 用 apt 命令更新 Ubuntu 仓库并安装 Java OpenJDK。apt-get update apt-get install openjdk-7-jdk 输入下面的命令验证安装：java -version 你会看到安装到服务器上的 Java 版本。第二步 - 安装 JenkinsJenkins 给软件安装包提供了一个 Ubuntu 仓库，我们会从这个仓库中安装 Jenkins。用下面的命令添加 Jenkins 密钥和仓库到系统中。wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - echo 'deb https://pkg.jenkins.io/debian-stable binary/' | tee -a /etc/apt/sources.list 更新仓库并安装 Jenkins。apt-get update apt-get install jenkins 安装完成后，用下面的命令启动 Jenkins。systemctl start jenkins 通过检查 Jenkins 默认使用的端口（端口 8080）验证 Jenkins 正在运行。我会像下面这样用 netstat 命令检测：netstat -plntu Jenkins 已经安装好了并运行在 8080 端口。第三步 - 为 Jenkins 安装和配置 Apache 作为反向代理在这篇指南中，我们会在一个 Apache web 服务器中运行 Jenkins，我们会为 Jenkins 配置 apache 作为反向代理。首先我会安装 apache 并启用一些需要的模块，然后我会为 Jenkins 用域名 my.jenkins.id 创建虚拟主机文件。请在这里使用你自己的域名并在所有配置文件中出现的地方替换。从 Ubuntu 仓库安装 apache2 web 服务器。apt-get install apache2 安装完成后，启用 proxy 和 proxy\_http 模块以便将 apache 配置为 Jenkins 的前端服务器/反向代理。a2enmod proxy a2enmod proxy_http 下一步，在 sites-available 目录创建新的虚拟主机文件。cd /etc/apache2/sites-available/ vim jenkins.conf 粘贴下面的虚拟主机配置。 ServerName my.jenkins.id ProxyRequests Off ProxyPreserveHost On AllowEncodedSlashes NoDecode Order deny,allow Allow from all ProxyPass / http://localhost:8080/ nocanon ProxyPassReverse / http://localhost:8080/ ProxyPassRevers…