<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jenkins</title>
    <link>https://llinux.cn/cicd/jenkins/</link>
    <description>阿征的运维笔记</description>
    <language>zh</language>
    <atom:link href="https://llinux.cn/cicd/jenkins/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Jenkins与GitLab</title>
      <link>https://llinux.cn/cicd/jenkins/jenkins%E4%B8%8Egitlab/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/jenkins%E4%B8%8Egitlab/</guid>
      <description>&lt;p&gt;在GitLab和Jenkins中配置自动触发构建的流程主要涉及两个方面：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitLab 配置 Webhook&lt;/strong&gt;：当代码发生变更（如Push、Merge等）时，GitLab通过Webhook通知Jenkins。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jenkins 配置 Job&lt;/strong&gt;：配置 Jenkins Job，使其能够接收来自GitLab的Webhook触发。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;下面是详细的配置步骤：&lt;/p&gt;&#xA;&lt;h2 id=&#34;流水线&#34;&gt;流水线&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%b5%81%e6%b0%b4%e7%ba%bf&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h2 id=&#34;自由风格的软件项目&#34;&gt;自由风格的软件项目&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%87%aa%e7%94%b1%e9%a3%8e%e6%a0%bc%e7%9a%84%e8%bd%af%e4%bb%b6%e9%a1%b9%e7%9b%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;步骤-1在jenkins中配置gitlab插件&#34;&gt;步骤 1：在Jenkins中配置GitLab插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-1%e5%9c%a8jenkins%e4%b8%ad%e9%85%8d%e7%bd%aegitlab%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;首先，确保Jenkins安装了以下插件：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitLab Plugin&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;可以在 &lt;code&gt;Jenkins &amp;gt; Manage Jenkins &amp;gt; Manage Plugins&lt;/code&gt; 中搜索并安装这些插件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤-2在gitlab中创建access-token&#34;&gt;步骤 2：在GitLab中创建Access Token&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-2%e5%9c%a8gitlab%e4%b8%ad%e5%88%9b%e5%bb%baaccess-token&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;在Jenkins中，需要使用GitLab的Access Token来访问GitLab代码库。创建步骤如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;登录GitLab，点击右上角的头像，进入 &lt;strong&gt;Settings &amp;gt; Access Tokens&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;创建一个 &lt;strong&gt;Personal Access Token&lt;/strong&gt;，并勾选 &lt;code&gt;api&lt;/code&gt; 权限（确保具有足够权限访问项目）。&lt;/li&gt;&#xA;&lt;li&gt;复制该Token备用，稍后会用到。glpat-Dqm_C_eU46G6Bsh8SpVE&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;步骤-3在jenkins中添加gitlab凭据&#34;&gt;步骤 3：在Jenkins中添加GitLab凭据&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-3%e5%9c%a8jenkins%e4%b8%ad%e6%b7%bb%e5%8a%a0gitlab%e5%87%ad%e6%8d%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在Jenkins中，进入 &lt;strong&gt;Manage Jenkins &amp;gt; Manage Credentials&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;添加一个新的凭据，类型选择 &lt;strong&gt;Secret text&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;在 &lt;strong&gt;Secret&lt;/strong&gt; 字段中粘贴之前创建的GitLab Access Token。&lt;/li&gt;&#xA;&lt;li&gt;给凭据一个ID（比如&lt;code&gt;gitlab-token&lt;/code&gt;）以便后续使用。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;步骤-4在jenkins中创建或配置job&#34;&gt;步骤 4：在Jenkins中创建或配置Job&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-4%e5%9c%a8jenkins%e4%b8%ad%e5%88%9b%e5%bb%ba%e6%88%96%e9%85%8d%e7%bd%aejob&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;创建一个新的Job（例如，选择 &lt;strong&gt;Freestyle project&lt;/strong&gt; 或 &lt;strong&gt;Pipeline&lt;/strong&gt;）。&lt;/li&gt;&#xA;&lt;li&gt;在Job配置中，选择 &lt;strong&gt;Source Code Management&lt;/strong&gt; 下的 &lt;strong&gt;Git&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;输入GitLab仓库的URL，并选择 &lt;strong&gt;Credentials&lt;/strong&gt; 中刚刚创建的GitLab Access Token。&lt;/li&gt;&#xA;&lt;li&gt;配置构建触发器，使其可以被GitLab的Webhook触发：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;找到 &lt;strong&gt;Build Triggers&lt;/strong&gt;，勾选 &lt;strong&gt;Build when a change is pushed to GitLab&lt;/strong&gt;（若使用GitLab Plugin），或者 &lt;strong&gt;Trigger builds remotely&lt;/strong&gt;（若使用GitLab Hook Plugin）。&lt;/li&gt;&#xA;&lt;li&gt;如果使用GitLab Hook Plugin，生成一个 &lt;strong&gt;Token&lt;/strong&gt;，如 &lt;code&gt;my-token&lt;/code&gt;，后续在GitLab Webhook中使用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;步骤-5在gitlab中配置webhook&#34;&gt;步骤 5：在GitLab中配置Webhook&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-5%e5%9c%a8gitlab%e4%b8%ad%e9%85%8d%e7%bd%aewebhook&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;登录到GitLab项目，进入 &lt;strong&gt;Settings &amp;gt; Webhooks&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;在 &lt;strong&gt;URL&lt;/strong&gt; 中输入 Jenkins Webhook 地址。格式如下：&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://&amp;lt;jenkins_url&amp;gt;/project/&amp;lt;job_name&amp;gt;&lt;/code&gt;&lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;如果配置了Token，则格式为：&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://&amp;lt;jenkins_url&amp;gt;/project/&amp;lt;job_name&amp;gt;?token=my-token&lt;/code&gt;&lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;选择触发条件，比如勾选 &lt;strong&gt;Push events&lt;/strong&gt; 和 &lt;strong&gt;Merge request events&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;点击 &lt;strong&gt;Add webhook&lt;/strong&gt; 保存配置。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;步骤-6测试&#34;&gt;步骤 6：测试&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%ad%a5%e9%aa%a4-6%e6%b5%8b%e8%af%95&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在GitLab仓库中进行一次Push或创建一个Merge Request。&lt;/li&gt;&#xA;&lt;li&gt;检查Jenkins中的Job是否被自动触发并构建。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;常见问题&#34;&gt;常见问题&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;网络访问问题&lt;/strong&gt;：确保Jenkins服务器能被GitLab访问到。如果Jenkins部署在内网，可能需要配置公网访问或者使用反向代理。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Token不匹配&lt;/strong&gt;：如果使用了Token，请确保GitLab Webhook中的Token与Jenkins中配置的Token一致。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：GitLab的Access Token需要具有对仓库的读取权限，确保设置的权限足够。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以上步骤完成后，每当GitLab中有新的代码提交或合并，Jenkins的Job都会自动触发构建。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Jenkins与SonarQube</title>
      <link>https://llinux.cn/cicd/jenkins/jenkins%E4%B8%8Esonarqube/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/jenkins%E4%B8%8Esonarqube/</guid>
      <description>&lt;h1 id=&#34;参考文档&#34;&gt;参考文档&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%8f%82%e8%80%83%e6%96%87%e6%a1%a3&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/&#34;&gt;https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;jenkins--sonarqube-工作流&#34;&gt;Jenkins + SonarQube 工作流&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins--sonarqube-%e5%b7%a5%e4%bd%9c%e6%b5%81&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Jenkins pipeline启动；&lt;/li&gt;&#xA;&lt;li&gt;SonarQube Scanner分析代码，并将报告发送至SonarQube Server；&lt;/li&gt;&#xA;&lt;li&gt;SonarQube Server分析代码检测的结果是否符合预定义的质量阈；&lt;/li&gt;&#xA;&lt;li&gt;SonarQube Server将通过（passed）或者失败（failed）的结果发送回Jenkins上的SonarQube Scanner插件暴露的Webhook；&lt;/li&gt;&#xA;&lt;li&gt;质量域相关的阶段成功通过或可选地失败时，则Jenkins pipeline续费后面的Stage；否则，pipeline将终止；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;配置-jenkins-使用-sonarqube&#34;&gt;配置 Jenkins 使用 SonarQube&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae-jenkins-%e4%bd%bf%e7%94%a8-sonarqube&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实现配置 Jenkins 使用 sonar-scanner 进行代码质量扫描， 并将结果报告给 SonarQube Server&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;流程概述&#34;&gt;流程概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%b5%81%e7%a8%8b%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在Jenkins上安装SonarQube插件&lt;/li&gt;&#xA;&lt;li&gt;在SonarQube上生成令牌&lt;/li&gt;&#xA;&lt;li&gt;配置Jenkins对接到SonarQube Server&lt;/li&gt;&#xA;&lt;li&gt;配置Jenkins的全局工具sonar-scanner&lt;/li&gt;&#xA;&lt;li&gt;在SonarQube上添加回调Jenkins的Webhook&lt;/li&gt;&#xA;&lt;li&gt;在Jenkins项目上调用sonar-scanner进行代码质量扫描&lt;/li&gt;&#xA;&lt;li&gt;通过SonarQube确认扫描结果的评估；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;在-sonarqube-上生成令牌&#34;&gt;在 SonarQube 上生成令牌&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%9c%a8-sonarqube-%e4%b8%8a%e7%94%9f%e6%88%90%e4%bb%a4%e7%89%8c&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在SonarQube上以相应的用户生成令牌，该令牌将被 Jenkins 用于通过相应的 URL 打开 SonarQube&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SonarQube Web UI &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 配置 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 权限 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 用户 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 令牌 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 更新令牌 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 填写名称后生成令牌&#xA;&lt;ul&gt;&#xA;&lt;li&gt;假设设置的令牌名称为：jenkins&lt;/li&gt;&#xA;&lt;li&gt;对应的令牌为：255faa25ad464db26c20cdba87710d35a04ae716&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;jenkins-相关配置&#34;&gt;Jenkins 相关配置&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e7%9b%b8%e5%85%b3%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;配置 Jenkins 对接到 SonarQube Server&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;安装-sonarqube-插件&#34;&gt;安装 SonarQube 插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%ae%89%e8%a3%85-sonarqube-%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Jenkins 借助于 SonarQube Scanner 插件 将 SonarQube 提供的 代码质量检查能力集成到 pipeline上，从而确保质量阈检查失败时，能够避免继续进行后续的操作，例如发布等。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Pipeline与Jenkinsfile</title>
      <link>https://llinux.cn/cicd/jenkins/pipeline%E4%B8%8Ejenkinsfile/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/pipeline%E4%B8%8Ejenkinsfile/</guid>
      <description>&lt;h1 id=&#34;pipeline-概述&#34;&gt;pipeline 概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline-%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jenkins.io/zh/doc/book/pipeline/&#34;&gt;https://www.jenkins.io/zh/doc/book/pipeline/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pipeline实际上就是基于Groovy语言实现的一种DSL，用于描述代码编译到打包发布的整个流水线是如何进行的；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;dsl&#34;&gt;DSL&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dsl&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;领域特定语言&lt;/strong&gt;（英语：domain-specific language、DSL）指的是专注于某个&lt;a href=&#34;https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/5985445?fromModule=lemma_inlink&#34;&gt;应用程序&lt;/a&gt;领域的&lt;a href=&#34;https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%AF%AD%E8%A8%80/4456504?fromModule=lemma_inlink&#34;&gt;计算机语言&lt;/a&gt;。又译作&lt;strong&gt;领域专用语言&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;Jenkins中的不同插件集成到pipeline时通常具有不同的语法格式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;pipeline-分类&#34;&gt;pipeline 分类&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline-%e5%88%86%e7%b1%bb&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Jenkinsfile&lt;/code&gt; 能使用两种语法进行编写 - 声明式和脚本式；&lt;/li&gt;&#xA;&lt;li&gt;声明式和脚本式的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;声明式&#34;&gt;声明式&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%a3%b0%e6%98%8e%e5%bc%8f&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;相比脚本化的流水线语法，它提供更丰富的语法特性；&lt;/li&gt;&#xA;&lt;li&gt;是为了使编写和读取流水线代码更容易而设计的。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;脚本式&#34;&gt;脚本式&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%84%9a%e6%9c%ac%e5%bc%8f&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h1 id=&#34;pipeline-定义&#34;&gt;pipeline 定义&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline-%e5%ae%9a%e4%b9%89&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;通过-blue-ocean&#34;&gt;通过 Blue Ocean&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%80%9a%e8%bf%87-blue-ocean&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jenkins.io/zh/doc/book/blueocean/&#34;&gt;https://www.jenkins.io/zh/doc/book/blueocean/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在 Blue Ocean 中设置一个流水线项目后，Blue Ocean UI 会帮你编写流水线的 &lt;code&gt;Jenkinsfile&lt;/code&gt; 文件并提交到源代码管理系统。&lt;/p&gt;&#xA;&lt;h2 id=&#34;通过经典-ui&#34;&gt;通过经典 UI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%80%9a%e8%bf%87%e7%bb%8f%e5%85%b8-ui&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;你可以通过经典 UI 在 Jenkins 中直接输入基本的流水线。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jenkins主页 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 新建item**&amp;ndash;&amp;gt;** 自定义项目名称后创建流水线&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意：Jenkins 使用这个项目名称在磁盘上创建目录。建议不要在项目名称中使用空格，因为这样做可能会触发在脚本中不能正确处理目录路径中的空格的bug。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;第一次保存流水线定义时，UI会提示流水线尚未执行；在项目上通过“立即构建”，可手动触发构建过程；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;阶段视图&#34;&gt;阶段视图&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%98%b6%e6%ae%b5%e8%a7%86%e5%9b%be&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;任务执行结果会在阶段视图中以方块的形式显示；&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一次构建用一行方块来表示，其中每个方块代表流水线中的一个stage；&lt;/li&gt;&#xA;&lt;li&gt;每个方块都代表了一个特定阶段的一次执行结果；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;方块颜色的含义：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;蓝色条纹：运行中&lt;/li&gt;&#xA;&lt;li&gt;白色：stage尚未执行&lt;/li&gt;&#xA;&lt;li&gt;红色条纹：state执行失败&lt;/li&gt;&#xA;&lt;li&gt;绿色：stage执行成功&lt;/li&gt;&#xA;&lt;li&gt;浅红色：stage执行成功，但是下游的某个stage出 现失败&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;回放&#34;&gt;回放&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%9b%9e%e6%94%be&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;非常好用的pipeline调试工具！&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>插件</title>
      <link>https://llinux.cn/cicd/jenkins/%E6%8F%92%E4%BB%B6/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;h1 id=&#34;jenkins-plugin-概述&#34;&gt;Jenkins plugin 概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-plugin-%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://plugins.jenkins.io/&#34;&gt;https://plugins.jenkins.io/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jenkins.io/zh/doc/book/managing/plugins/&#34;&gt;https://www.jenkins.io/zh/doc/book/managing/plugins/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jenkins 默认安装的插件往往不能满足生成需求，需要安装一些额外的插件&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;插件的安装通常在Jenkins的web界面进行（Manage Jenkins → Plugin Manager）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;虽然插件可以单独上传到Jenkins的家目录进行安装，但大部分插件都是和其他插件有依赖关系，因此单独上传的插件往往不能使用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;有的插件在下载完成后需重启Jenkins才可生效，也可以在下载过程中点击 安装完成后重启Jenkins(空闲时)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;配置文件管理插件&#34;&gt;配置文件管理插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;config-file-provider&#34;&gt;Config File Provider&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#config-file-provider&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://plugins.jenkins.io/config-file-provider/&#34;&gt;https://plugins.jenkins.io/config-file-provider/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jenkins.io/doc/pipeline/steps/config-file-provider/&#34;&gt;https://www.jenkins.io/doc/pipeline/steps/config-file-provider/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户不具有Jenkins节点的主机文件系统访问权限时，可借用Config File Provider插件进行修改&lt;/li&gt;&#xA;&lt;li&gt;Managing Jenkins → Managed Files（新增的菜单项）&lt;/li&gt;&#xA;&lt;li&gt;add a New configuration→ Global Maven settings.xml，指向国内或企业内部的maven镜像&lt;/li&gt;&#xA;&lt;li&gt;最后在 Global Tool Configuration → Maven 配置中引用即可&lt;/li&gt;&#xA;&lt;li&gt;在pipeline中的引用语法可以参阅语法生成器&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;cicd核心插件&#34;&gt;CI/CD核心插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cicd%e6%a0%b8%e5%bf%83%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GitLab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GitLab Authentication&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Generic Webhook Trigger&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GitLab Logo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;h1 id=&#34;角色管理插件&#34;&gt;角色管理插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%a7%92%e8%89%b2%e7%ae%a1%e7%90%86%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Role-based Authorization Strategy&lt;/code&gt;&lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;h1 id=&#34;邮件管理插件&#34;&gt;邮件管理插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%82%ae%e4%bb%b6%e7%ae%a1%e7%90%86%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Email Extension &lt;span class=&#34;c1&#34;&gt;#邮件管理扩展插件，非必选&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;h1 id=&#34;jenkins-用户和项目的创建&#34;&gt;Jenkins 用户和项目的创建&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e7%94%a8%e6%88%b7%e5%92%8c%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%88%9b%e5%bb%ba&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins默认创建的用户都是超级管理员权限，这时就需要给用户设置特定的权限从而实现灵活管理&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;举例的用户和项目：&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;dev-leader1 &amp;ndash;&amp;gt; project1&lt;/li&gt;&#xA;&lt;li&gt;dev-leader2 &amp;ndash;&amp;gt; project2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;创建用户&#34;&gt;创建用户&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统管理 &amp;ndash;&amp;gt; 管理用户 &amp;ndash;&amp;gt;  新建用户&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户名：dev-leader1&lt;/li&gt;&#xA;&lt;li&gt;密码：xxx&lt;/li&gt;&#xA;&lt;li&gt;确认密码：xxx&lt;/li&gt;&#xA;&lt;li&gt;全名：xxx&lt;/li&gt;&#xA;&lt;li&gt;电子邮件地址：767483070@qq.com&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;dev-leader2同理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;创建项目&#34;&gt;创建项目&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%88%9b%e5%bb%ba%e9%a1%b9%e7%9b%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新建任务 &amp;ndash;&amp;gt; &lt;strong&gt;输入一个任务名称&lt;/strong&gt;：project1 &amp;ndash;&amp;gt; &lt;strong&gt;构建一个自由风格的软件项目&lt;/strong&gt; &amp;ndash;&amp;gt; 确定&lt;/li&gt;&#xA;&lt;li&gt;project2同理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;jenkins-用户权限管理&#34;&gt;Jenkins 用户权限管理&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限管理依赖于上面安装的Role-based插件&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;开启role-based方式的授权策略&#34;&gt;开启Role-Based方式的授权策略&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%bc%80%e5%90%afrole-based%e6%96%b9%e5%bc%8f%e7%9a%84%e6%8e%88%e6%9d%83%e7%ad%96%e7%95%a5&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;系统管理 &amp;ndash;&amp;gt; 全局安全配置 &amp;ndash;&amp;gt; &lt;strong&gt;授权策略&lt;/strong&gt;  &amp;ndash;&amp;gt; Role-Based &amp;ndash;&amp;gt; 保存&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>分布式构建</title>
      <link>https://llinux.cn/cicd/jenkins/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%84%E5%BB%BA/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%84%E5%BB%BA/</guid>
      <description>&lt;h1 id=&#34;jenkins-分布式概述&#34;&gt;Jenkins 分布式概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e5%88%86%e5%b8%83%e5%bc%8f%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins 可以部署在多个节点上 以实现分布式构建的效果；&lt;/li&gt;&#xA;&lt;li&gt;其节点可划分主节点（master）和 代理节点（agent）两种类型；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;主节点&#34;&gt;主节点&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e4%b8%bb%e8%8a%82%e7%82%b9&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;主节点负责提供UI、处理HTTP请求及管理构建环境等&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jenkins的一个部署实例的核心控制系统，它能够完全访问所有Jenkins配置的选项和任务（job）列表，而且，若不存在其他代理节点，主节点也是默认的任务执行节点；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;代理节点&#34;&gt;代理节点&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e4%bb%a3%e7%90%86%e8%8a%82%e7%82%b9&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;代理节点则主要负责执行构建任务&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在早先版本的Jenkins中，代理节点（agent）也被称为从节点（slave），它代表着所有的非主节点；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;这类节点由主节点管理，按需分配或指定执行特定的任务 ，例如不同的构建任务或测试任务等&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;脚本式流水线中，节点特指一个运行代理节点的系统，而在声明式流水线中，它则是分配的一个来作为代理节点的特定节点&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;执行器executor&#34;&gt;执行器（Executor）&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e6%89%a7%e8%a1%8c%e5%99%a8executor&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;简单来说，Executor 只是节点或代理节点用于执行任务的一个槽位；&lt;/li&gt;&#xA;&lt;li&gt;Executor 的数量定义了该节点可以执行的并发任务量，一个节点上可以有任务数量的槽位，但也允许管理员按节点资源定义合适的数量&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;在主节点将任务分配给特定节点时，该节点上必须有可用的Executor来立即执行该任务，否则，只能等到有空闲槽位可用&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;节点标签&#34;&gt;节点标签&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%8a%82%e7%82%b9%e6%a0%87%e7%ad%be&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins中的标签（tag）指的是附加在节点之上的标识符，而后&lt;strong&gt;可由pipeline中的agent指令等进行过滤和选择；&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;agent节点较多时，出于便捷管理之需，通常应该给这些节点添加能够暴露其某种特性或功能的标签，以便于在构建任务中能基于标签过滤出符合条件的agent来；&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一个agent上可附加多个标签&lt;/li&gt;&#xA;&lt;li&gt;标签名称不允许使用空白字符，也不允许使用标签表达式中预留的关键字，例如!、&amp;amp;、|、&amp;lt;、&amp;gt;、) 和 ( 等；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;常用的标签纬度有如下几个：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;操作系统类型：linux、windows、macos等；&lt;/li&gt;&#xA;&lt;li&gt;系统位数：32bit、64bit；&lt;/li&gt;&#xA;&lt;li&gt;集成的工具链：jdk、go、python、nodejs等；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;master--agent-的连接方式&#34;&gt;Master &amp;amp; Agent 的连接方式&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#master--agent-%e7%9a%84%e8%bf%9e%e6%8e%a5%e6%96%b9%e5%bc%8f&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;为了能让 master 将一个主机识别为 agent，需要事先在各 agent 上运行特定的代理程序以使得其能够与master 之间建立双向通信，有多种方法实现 master 与 agent 之间的连接建立：&lt;/p&gt;&#xA;&lt;h3 id=&#34;ssh连接器&#34;&gt;SSH连接器&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ssh%e8%bf%9e%e6%8e%a5%e5%99%a8&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;首选且最稳定的双向连接机制，它依赖于Jenkins内置的SSH客户端，并要求各agent要部署并启动了SSH服务；&lt;/li&gt;&#xA;&lt;li&gt;支持基于密钥及口令的两种认证方式，但认证信息要保存为master之上的凭证；&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基于密钥认证时，master主机上私钥凭证对应的公钥要存在于各agent主机之上；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;inbound连接器&#34;&gt;Inbound连接器&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inbound%e8%bf%9e%e6%8e%a5%e5%99%a8&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在agent上以手动或系统服务的方式经由JNLP协议触发双向连接的建立；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;jnlp-http连接器&#34;&gt;JNLP-HTTP连接器&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jnlp-http%e8%bf%9e%e6%8e%a5%e5%99%a8&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在agent上经由JNLP协议通过HTTP建立双向连接；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;jenkins-分布式实现&#34;&gt;Jenkins 分布式实现&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e5%88%86%e5%b8%83%e5%bc%8f%e5%ae%9e%e7%8e%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;master-配置&#34;&gt;master 配置&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#master-%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Jenkins Dashboard &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 系统管理 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 节点管理 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 新建节点&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>凭据管理</title>
      <link>https://llinux.cn/cicd/jenkins/%E5%87%AD%E6%8D%AE%E7%AE%A1%E7%90%86/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/%E5%87%AD%E6%8D%AE%E7%AE%A1%E7%90%86/</guid>
      <description>&lt;h1 id=&#34;jenkins-凭据概述&#34;&gt;Jenkins 凭据概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e5%87%ad%e6%8d%ae%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Jenkins 凭据是 Jenkins 中用于安全存储和管理敏感信息的机制。这些凭据可以用来提供给 Jenkins 作业、管道（pipeline）或插件，避免在脚本中硬编码敏感信息，如密码、SSH 密钥、API 令牌等。Jenkins 凭据的设计使得用户可以安全地处理这些信息，且通过访问控制保证只有经过授权的任务和人员能够使用它们。&lt;/p&gt;&#xA;&lt;h2 id=&#34;凭据的主要类型&#34;&gt;凭据的主要类型&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%87%ad%e6%8d%ae%e7%9a%84%e4%b8%bb%e8%a6%81%e7%b1%bb%e5%9e%8b&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Jenkins 支持多种类型的凭据，常见的有：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;用户名和密码&lt;/strong&gt;（Username with password）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;这是最基本的凭据类型，存储用户名和密码，通常用于 HTTP 基本认证、API 访问等。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;SSH 私钥&lt;/strong&gt;（SSH Username with private key）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用于 SSH 连接时的认证，通常在 Jenkins 中执行 SSH 操作（如通过 SSH 连接到远程主机）时使用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Secret Text&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单个的密文字符串，可以是密码、API 令牌或其他类型的密钥。常用于与第三方服务集成时提供 API Token。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Secret File&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;敏感的文件凭据，比如私钥文件、配置文件等，可以在作业中下载并使用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;证书&lt;/strong&gt;（Certificate）&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用于存储包含私钥的证书文件，通常用于需要双向 SSL 的场景，如与某些服务的加密通信。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;GitHub 凭据&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;专用于 GitHub 操作的 OAuth 令牌、用户名/密码或 SSH 私钥，用于与 GitHub 仓库交互。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;jenkins-中的凭据存储&#34;&gt;Jenkins 中的凭据存储&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e4%b8%ad%e7%9a%84%e5%87%ad%e6%8d%ae%e5%ad%98%e5%82%a8&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Jenkins 凭据默认存储在主控节点的加密数据库中。Jenkins 通过 &lt;code&gt;Credentials&lt;/code&gt; 插件来管理凭据，并通过 Web 界面或 Jenkinsfile 进行使用和引用。对于安全性，Jenkins 采用两种机制来保护凭据：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>全局工具配置</title>
      <link>https://llinux.cn/cicd/jenkins/%E5%85%A8%E5%B1%80%E5%B7%A5%E5%85%B7%E9%85%8D%E7%BD%AE/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/%E5%85%A8%E5%B1%80%E5%B7%A5%E5%85%B7%E9%85%8D%E7%BD%AE/</guid>
      <description>&lt;h1 id=&#34;全局工具配置概述&#34;&gt;全局工具配置概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%85%a8%e5%b1%80%e5%b7%a5%e5%85%b7%e9%85%8d%e7%bd%ae%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Global Tool Configuration，主要用于定义全局级的代码编译构建工具&lt;/li&gt;&#xA;&lt;li&gt;实际的操作过程相当于配置全局的环境变量，以便Jenkins能够通过对应插件调用该工具。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：在pipeline的tools{}语句块中指定maven以便调用maven来进行Java代码编译&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;其中包含的工具取决于安装的插件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;jdk&#34;&gt;JDK&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jdk&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Manage Jenkins → Global Tool Configuration → JDK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;自动安装&#34;&gt;自动安装&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;无论使用何种自动安装方式，配置完成后， Jenkins都不会立即进行安装，而是在第一次被用到才安装；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;run-batch-command&#34;&gt;Run Batch Command&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#run-batch-command&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;从-javasuncom安装&#34;&gt;从 java.sun.com安装&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e4%bb%8e-javasuncom%e5%ae%89%e8%a3%85&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;即安装Oracle JDK，需要输入用户名和密码，但Oracle Java SE 11+ 不再授权商用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;解压-ziptargz&#34;&gt;解压 *.zip/*.tar.gz&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%a7%a3%e5%8e%8b-ziptargz&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载工具包并安装在Jenkins下的工作目录中. 例如：&lt;code&gt;http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip&lt;/code&gt; (选择离你最近的镜像服务器) 并指定一个子目录&lt;code&gt;apache-ant-1.7.1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;运行命令&#34;&gt;运行命令&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%bf%90%e8%a1%8c%e5%91%bd%e4%bb%a4&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;常用&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;别名：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：openjdk-11.0.14&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;运行命令：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：yum install -y java-11-openjdk&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;工具目录：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：/usr/lib/jvm/java-11-openjdk-11.0.14.1.1-6.el8.x86_64/bin/&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;非自动安装&#34;&gt;非自动安装&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%9d%9e%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;若Jenkins节点无法连接互联网，也可以选择在系统上通过其它方式部署好JDK，而后在Jenkins中经由$JAVA_HOME环境变量引用；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;maven&#34;&gt;Maven&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#maven&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Manage Jenkins → Global Tool Configuration → Maven&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;自动安装-1&#34;&gt;自动安装&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%87%aa%e5%8a%a8%e5%ae%89%e8%a3%85-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;无论使用何种自动安装方式，配置完成后， Jenkins都不会立即进行安装，而是在第一次被用到才安装；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;run-batch-command-1&#34;&gt;Run Batch Command&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#run-batch-command-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;从-apache-安装&#34;&gt;从 Apache 安装&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e4%bb%8e-apache-%e5%ae%89%e8%a3%85&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins节点能接入互联的情况下，直接从 Apache安装最为简单（因为服务器在国外，因此也有可能安装失败）；&lt;/li&gt;&#xA;&lt;li&gt;各构建工具程序默认安装在${JENKINS_HOME}/tools/目录下&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;解压-ziptargz-1&#34;&gt;解压 *.zip/*.tar.gz&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%a7%a3%e5%8e%8b-ziptargz-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;下载工具包并安装在Jenkins下的工作目录中. 例如：&lt;code&gt;http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip&lt;/code&gt; (选择离你最近的镜像服务器) 并指定一个子目录&lt;code&gt;apache-ant-1.7.1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;运行命令-1&#34;&gt;运行命令&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e8%bf%90%e8%a1%8c%e5%91%bd%e4%bb%a4-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;常用&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>通知管理</title>
      <link>https://llinux.cn/cicd/jenkins/%E9%80%9A%E7%9F%A5%E7%AE%A1%E7%90%86/</link>
      
      <guid>https://llinux.cn/cicd/jenkins/%E9%80%9A%E7%9F%A5%E7%AE%A1%E7%90%86/</guid>
      <description>&lt;h1 id=&#34;jenkins-通知概述&#34;&gt;Jenkins 通知概述&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-%e9%80%9a%e7%9f%a5%e6%a6%82%e8%bf%b0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jenkins通知 是将任务的执行状态、事件或信息推送给相关用户，这些通常发生在pipeline的构建后处理（post-processing）时期；&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Email是Jenkins内置支持的通知方式，它也能够通过webhook扩展支持其它的即时通信媒介，例如&#xA;Slack、钉钉等；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jenkins使用的许多插件或工具都会为其支持的多种任务生成HTML报告，相关的任务有如代码分析、代码覆盖率和单元测试等；&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;其中一些工具（如SonarQube和JaCoCo等）甚至可以和Jenkins任务输出做定制集成，这些工具甚至会采用直观的图标给出相关报告的链接；&lt;/li&gt;&#xA;&lt;li&gt;对于那些在报告相关的功能方面支持的不是特别好的工具来说，我们也可以借助于HTML Publisher插件进行定制；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;email&#34;&gt;Email&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#email&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;基于内置邮件功能&#34;&gt;基于内置邮件功能&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%9f%ba%e4%ba%8e%e5%86%85%e7%bd%ae%e9%82%ae%e4%bb%b6%e5%8a%9f%e8%83%bd&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;jenkins-ui-配置&#34;&gt;Jenkins UI 配置&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-ui-%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins UI &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 系统配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;jenkins-location&#34;&gt;Jenkins Location&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-location&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统管理员邮件地址&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：767483070@qq.com&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;邮件通知&#34;&gt;邮件通知&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e9%82%ae%e4%bb%b6%e9%80%9a%e7%9f%a5&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SMTP服务器&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：smtp.qq.com&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;用户默认邮件后缀&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：@qq.com&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;使用SMTP认证 √&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户名密码自行填写&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意：此处用户名要和 Jenkins Location 中的系统管理员邮件地址保持一致！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;使用SSL协议 √&lt;/li&gt;&#xA;&lt;li&gt;SMTP端口&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：465&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;最后填写接受邮箱测试能否发送。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pipeline&#34;&gt;pipeline&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#mail-mail&#34;&gt;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#mail-mail&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在声明式pipeline的post{}里可以使用mail这一step来发送通知&#xA;&lt;ul&gt;&#xA;&lt;li&gt;该步骤支持有参数有如下几个：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;subject：邮件主题；&lt;/li&gt;&#xA;&lt;li&gt;to：收件人地址；&lt;/li&gt;&#xA;&lt;li&gt;body：邮件正文；&lt;/li&gt;&#xA;&lt;li&gt;from：发件地址（通常可省略）；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;example&#34;&gt;example&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;maven-3.8.6&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stages&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;stage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Source&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;steps&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;branch:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;main&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;url:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;git@gitlab.xiangzheng.com:gitlab-instance-010b0ac5/spring-boot-helloWorld.git&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;stage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Build&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;steps&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;mvn clean package&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;post&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;mail&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;to:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;sredevops@163.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nl&#34;&gt;subject:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Status of pipeline: ${currentBuild.fullDisplayName}&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nl&#34;&gt;body:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;${env.BUILD_URL} has result ${currentBuild.result}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;测试&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight code-sample&#34;&gt;&#xA;  &#xA;  &lt;div class=&#34;includecode&#34; &gt;&#xA;    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pipeline&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stages&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;stage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Build&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;steps&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Building the project...&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;// 模拟构建步骤&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;stage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;steps&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Running tests...&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;// 模拟测试步骤&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;post&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;mail&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;to:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;sredevops@163.com, 767483070@qq.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nl&#34;&gt;subject:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Status of pipeline: ${currentBuild.fullDisplayName}&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nl&#34;&gt;body:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;${env.BUILD_URL} has result ${currentBuild.result}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;基于邮件扩展插件&#34;&gt;基于邮件扩展插件&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%9f%ba%e4%ba%8e%e9%82%ae%e4%bb%b6%e6%89%a9%e5%b1%95%e6%8f%92%e4%bb%b6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;需事先安装 &lt;a href=&#34;https://plugins.jenkins.io/email-ext&#34;&gt;Email Extension Plugin&lt;/a&gt; 插件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pipeline-1&#34;&gt;pipeline&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;h1 id=&#34;dingtalk&#34;&gt;DingTalk&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dingtalk&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;需事先安装 &lt;a href=&#34;https://plugins.jenkins.io/dingding-notifications&#34;&gt;DingTalk&lt;/a&gt; 插件&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;前期准备&#34;&gt;前期准备&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#%e5%89%8d%e6%9c%9f%e5%87%86%e5%a4%87&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;创建钉钉webhook机器人。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;jenkins-ui-配置-1&#34;&gt;Jenkins UI 配置&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#jenkins-ui-%e9%85%8d%e7%bd%ae-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins UI &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 系统配置 &lt;strong&gt;&amp;ndash;&amp;gt;&lt;/strong&gt; 钉钉（新版本中移动到了系统管理中的未分类栏中）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;代理&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;未设置代理则无需配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;机器人&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;id&#xA;&lt;ul&gt;&#xA;&lt;li&gt;机器人id，后续可以在pipeline中调用，例如：dingtalk-robot&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;名称&#xA;&lt;ul&gt;&#xA;&lt;li&gt;机器人id，例如：dingtalk-robot&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;webhook&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;加密&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例如：SEC11fee24d65dfxxxxxxxxxxxxxx&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;最后可以进行测试。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pipeline-2&#34;&gt;pipeline&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pipeline-2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html&#34;&gt;https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html#&lt;/a&gt;参数说明&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
