index.html 22.0 KB
Newer Older
LinuxSuRen's avatar
LinuxSuRen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
<!DOCTYPE html>
<html class="no-js" lang="zh-CN">
  <head>
    <meta charset="utf-8">
    
    <link rel="preload" href="https://jenkins-zh.github.io/files/muli-latin-200.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="https://jenkins-zh.github.io/files/muli-latin-400.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="https://jenkins-zh.github.io/files/muli-latin-800.woff2" as="font" type="font/woff2" crossorigin>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     
    <title>Custom WAR Packager | Jenkins 中文社区</title>
    <meta name="HandheldFriendly" content="True">
    <meta name="MobileOptimized" content="320">

    <meta name="viewport" content="width=device-width,minimum-scale=1">
     <meta name="generator" content="Hugo 0.52" />

      
        <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
      

    <link href='/dist/main.css' rel='stylesheet' type="text/css" /><script src="/js/chart.js"></script>
<style>
  img.avatar {
    width: 32px;
    display: inline;
  }
</style>
<meta property="og:title" content="Custom WAR Packager" />
<meta property="og:description" content="打造你自己的 Jenkins!了解自定义 WAR/Docker Packager" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://jenkins-zh.github.io/wechat/articles/2018-12-5-custom-war-packager/" />

<meta itemprop="name" content="Custom WAR Packager">
<meta itemprop="description" content="打造你自己的 Jenkins!了解自定义 WAR/Docker Packager">



<meta itemprop="wordCount" content="497">



<meta itemprop="keywords" content="tools,docker,jenkins-x,cloud-native," />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Custom WAR Packager"/>
<meta name="twitter:description" content="打造你自己的 Jenkins!了解自定义 WAR/Docker Packager"/>





  </head>
  <body class="ma0 sans-serif bg-primary-color-light">
    
<nav class="bg-primary-color-dark pv4 w-100" role="navigation">

  <div class="center flex-ns flex-wrap items-center justify-start mw9">

    <h1 class="dim f3 lh-solid ml0-ns mr0 mr4-l mv0 pl3 pl4-ns">
      <a href="https://jenkins-zh.github.io/" class="link white">
         SuRenPi
      </a>
    </h1>
    <ul class="list ma0 pa0 dn dib-l">
      
        <li class="f5 dib mr4" role="menuitem">
            
          <a href="/wechat/" class="dim link light-silver">
            微信
              
            
            
          </a>
        </li>
      
        <li class="f5 dib mr4" role="menuitem">
            
LinuxSuRen's avatar
deploy  
LinuxSuRen 已提交
79 80
          <a href="http://jenkins.io/zh" class="dim link light-silver">
            Jenkins 官网
LinuxSuRen's avatar
LinuxSuRen 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
              
            
            
              <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10" viewBox="0 0 32 32" class="fill-current v-base" aria-label="External Link">
<path d="M25.152 16.576v5.696q0 2.144-1.504 3.648t-3.648 1.504h-14.848q-2.144 0-3.648-1.504t-1.504-3.648v-14.848q0-2.112 1.504-3.616t3.648-1.536h12.576q0.224 0 0.384 0.16t0.16 0.416v1.152q0 0.256-0.16 0.416t-0.384 0.16h-12.576q-1.184 0-2.016 0.832t-0.864 2.016v14.848q0 1.184 0.864 2.016t2.016 0.864h14.848q1.184 0 2.016-0.864t0.832-2.016v-5.696q0-0.256 0.16-0.416t0.416-0.16h1.152q0.256 0 0.416 0.16t0.16 0.416zM32 1.152v9.12q0 0.48-0.352 0.8t-0.8 0.352-0.8-0.352l-3.136-3.136-11.648 11.648q-0.16 0.192-0.416 0.192t-0.384-0.192l-2.048-2.048q-0.192-0.16-0.192-0.384t0.192-0.416l11.648-11.648-3.136-3.136q-0.352-0.352-0.352-0.8t0.352-0.8 0.8-0.352h9.12q0.48 0 0.8 0.352t0.352 0.8z"></path>
</svg>

            
          </a>
        </li>
      
    </ul>

    <div class="db dib-ns pl3"><form id="site-search-form" action="" role="search">
  <fieldset class="bn ma0 pa0">
    <label class="clip" for="email-address">Search</label>
    <input type="search" id="search-input" class="needs-js bg-left bg-transparent bn f5 input-reset lh-solid mt3 mt0-ns pl4 pv2 w5 white"
      placeholder="搜索文档" type="text"
      name="email-address" value="" style="background-image:url('/images/icon-search.png');background-size:16px 16px;">
  </fieldset>
</form>
</div>

    <div class="list ma0 pa0 dn dib-l"><ul class="list ma0 pa0 dn dib-l">

  <li class="f5 dib mr4" role="menuitem">
    <a href="https://jenkins-zh.github.io/" class="dim gray"></a>
  </li>

</ul>
</div>

    <span class="absolute mt1 mt2-l pr3 right-0 top-0">

<a class="github-button needs-js link primary-color-dark" href="https://github.com/LinuxSuRen" data-size="large" data-show-count="false" aria-label="Star LinuxSuRen GitHub">Star</a>
</span>

  </div>
</nav>

    
    <main role="main" class="content-with-sidebar min-vh-100 pb7 pb0-ns">
      
<main>
  <article class="w-100 ph4 pb5 pb6-ns pt1 pt5-ns">
    <div class="flex-l">

      <div class="order-2 w-100 w-20-l ph5-m ph0-l mb4 sticky">
<aside class="fixed-lTK mw5-l right-0 f6 bl-l b--moon-gray pv4 pv0-ns ph4-l nested-list-reset nested-links nested-copy-line-height">
	

	<div date-pref>
		
			<a href="https://jenkins-zh.github.io/wechat/articles/2018-12-19-jenkins-survey/" class="dib f6 pl1 hover-bg-light-gray br-100" title="2018年 Jenkins 国内使用情况调查问卷 ">
				<svg class="fill-current" height="30px" viewBox="0 0 24 24" width="30px" xmlns="http://www.w3.org/2000/svg">
    <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
    <path d="M0 0h24v24H0z" fill="none"/>
</svg>

			</a>
		

		
			<a href="https://jenkins-zh.github.io/wechat/articles/2018-12-12-gasc/" class="dib f6 pr1 hover-bg-light-gray br-100" title="Jenkins Configuration-as-Code: 看,我都不用手动配置">
			<svg class="fill-current" height="30px" viewBox="0 0 24 24" width="30px" xmlns="http://www.w3.org/2000/svg">
    <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
    <path d="M0 0h24v24H0z" fill="none"/>
</svg>

			</a>
		
	</div>

</aside>
</div>

      <div class="order-1 w-60-l mw7 ph0 ph5-ns mid-gray nested-copy-line-height no-underline nested-links nested-img nested-copy-seperator nested-blockquote mt0-ns" style="flex-grow:1;">
        <div class="documentation-copy center measure-wide-l">
          <div id="readout" class="fixed right-0 bottom-0">
          </div>
          <header class="flex-none w-100">
  
  <h1 class="lh-title mb3 mv0 pt3 primary-color-dark">Custom WAR Packager</h1>
</header>

<aside class="bt bw1 pt3 mt2 mid-gray b--mid-gray fn w-100">
  
    <div class="f4 fw4 lh-copy">
      打造你自己的 Jenkins!了解自定义 WAR/Docker Packager
    </div>
  

  
</aside>



<div class="prose" id="prose">

<p>我打算给 Jenkins 管理员和开发者介绍一个新的工具
<a href="https://github.com/jenkinsci/custom-war-packager">Custom WAR Packager</a>。该工具可以打包 Jenkins 的自定义 WAR 发行版、
<a href="https://github.com/jenkinsci/docker">Docker 镜像</a>
<a href="https://github.com/jenkinsci/jenkinsfile-runner">Jenkinsfile Runner</a> 包。
它可以打包 Jenkins、插件以及配置为开箱即用的发行版。
<code>Custom WAR Packager</code> 是我们在博客
A Cloud Native Jenkins(/blog/2018/09/12/speaker-blog-a-cloud-native-jenkins/) 中介绍过的无状态 <code>Jenkins master</code> 工具链的一部分。这个工具链已经在 <a href="https://jenkins-x.io">Jenkins X</a> 中被使用,用于构建 serverless 镜像(<a href="https://github.com/jenkins-x/jenkins-x-serverless)。">https://github.com/jenkins-x/jenkins-x-serverless)。</a></p>

<p>在这篇文章中,我将会介绍几种 <code>Custom WAR Packager</code> 常见的使用场景。</p>

<p>== 历史</p>

<p>正如 Jenkins 本身一样,<code>Custom WAR Packager</code> 开始于一个小的开发工具。在 Jenkins 内运行集成测试很长时间以来都是一个难题。
对此,我们有三个主要的框架:
    <a href="https://github.com/jenkinsci/jenkins-test-harness">Jenkins Test Harness</a>,
    <a href="https://github.com/jenkinsci/acceptance-test-harness">Acceptance Test Harness</a>,
<a href="https://github.com/jenkinsci/plugin-compat-tester">Plugin Compatibility Tester</a>.
这些框架都需要一个 Jenkins WAR 文件来运行测试。但是假如你想在类似 AWS 一样的自定义环境中进行 Jenkins 测试呢?
或者,你希望基于 <a href="/sigs/cloud-native/pluggable-storage/">Pluggable Storage</a> 的环境也可以复用 Jenkins 流水线测试,来确保没有回归缺陷?</p>

<p>这并不是一个无意义的问题。Jenkins 项目中有重大的活动正在进行:云原生 Jenkins、Jenkins Evergreen 以及 Jenkins X。
这些都需要很多集成测试来保障持续部署流程。为了复用已有的框架,我们需要打包一个自带配置的 WAR 文件,使得可以在已有的框架中运行集成测试。
这正是 Custom WAR Packager 于 2018年4月 创建的原因。到 2018年9月,它相继支持了 Docker 镜像和 Jenkinsfile Runner,
后者由 <a href="https://github.com/kohsuke/">Kohsuke Kawaguchi</a> 创建并由 <a href="https://github.com/ndeloof">Nicolas de Loof</a>
完善。</p>

<p>== 包含的内容?</p>

<p>Custom WAR Packager 是一个工具,可以作为命令行、Maven 插件或者 Docker 来用。
它从用户那获取配置和包。所有内容都由一个 YAML 配置文件管理:</p>

<p>image::/images/post-images/2018-10-16-cwp/cwp_flow.png[Custom WAR Packager 构建流程]</p>

<p>它支持多种输入类型。插件列表可以来自 YAML,<code>pom.xml</code> 或一个 BOM(jep:309[] 提出的 Bill of Materials) 文件。
Custom WAR Packager 不仅支持发布版本,还可以构建部署到
<a href="/blog/2018/05/15/incremental-deployment/">增量仓库</a> (Jenkins 核心及插件的 CD 流程 - jep:305[]),
甚至直接从 Git 或指定目录中构建。它允许构建的包来自任何源,而无需等待官方的发版。
构建过程也非常快,因为,插件已经通过 <code>Commit ID</code> 缓存到了本地的 Maven 仓库中。</p>

<p>Custom WAR Packager 还支持下面的配置选项:</p>

<p>** <a href="https://github.com/jenkinsci/configuration-as-code-plugin">Jenkins 配置即代码</a> 的 YAMl 文件
** <a href="https://wiki.jenkins.io/display/JENKINS/Groovy+Hook+Script">Groovy Hooks</a> (例如:预配置的 init hooks)
** 系统属性</p>

<p>== WAR 打包</p>

<p>每当这个库构建时会打包出来一个 WAR 文件。
通常,Custom WAR Packager 会根据下面对 Jenkins 核心和 JCasC 的配置把所有内容打包的一个 WAR 文件中。</p>

<p>样例配置:</p>

<pre><code class="language-yaml">bundle:
  groupId: &quot;io.jenkins.tools.war-packager.demo&quot;
  artifactId: &quot;blogpost-demo&quot;
  vendor: &quot;Jenkins project&quot;
  description: &quot;Just a demo for the blogpost&quot;
war:
  groupId: &quot;org.jenkins-ci.main&quot;
  artifactId: &quot;jenkins-war&quot;
  source:
    version: 2.138.2
plugins:
  - groupId: &quot;io.jenkins&quot;
    artifactId: &quot;configuration-as-code&quot;
    source:
      # Common release
      version: 1.0-rc2
  - groupId: &quot;io.jenkins&quot;
    artifactId: &quot;artifact-manager-s3&quot;
    source:
      # Incrementals
      version: 1.2-rc259.c9d60bf2f88c
  - groupId: &quot;org.jenkins-ci.plugins.workflow&quot;
    artifactId: &quot;workflow-job&quot;
    source:
      # Git
      git: https://github.com/jglick/workflow-job-plugin.git
      commit: 18d78f305a4526af9cdf3a7b68eb9caf97c7cfbc
  # etc.
systemProperties:
    jenkins.model.Jenkins.slaveAgentPort: &quot;9000&quot;
    jenkins.model.Jenkins.slaveAgentPortEnforce: &quot;true&quot;
groovyHooks:
  - type: &quot;init&quot;
    id: &quot;initScripts&quot;
    source:
      dir: src/main/groovy
casc:
  - id: &quot;jcasc&quot;
    source:
      dir: casc.yml
</code></pre>

<p>== Docker 打包</p>

<p>为了打包 Docker,Custom WAR Packager 使用官方的 Docker 镜像 <a href="https://hub.docker.com/r/jenkins/jenkins/">jenkins/jenkins</a>
或同样格式的其他镜像。构建中,WAR 文件会被该工具所替换。这也就意味着镜像的 <strong>所有</strong> 特色在该自定义构建中都可用:
<code>plugins.txt</code>, Java 选项, Groovy hooks 等等。</p>

<pre><code class="language-yaml">
## ...
## WAR configuration from above
## ...

buildSettings:
  docker:
    build: true
    # Base image
    base: &quot;jenkins/jenkins:2.138.2&quot;
    # Tag to set for the produced image
    tag: &quot;jenkins/custom-war-packager-casc-demo&quot;
</code></pre>

<p>例如:<a href="https://github.com/jenkinsci/custom-war-packager/tree/master/demo/external-logging-elasticsearch">示例</a>
展示了打包带有将构建日志存储到 Elasticsearch 的 Docker 镜像。
尽管这些已经作为了 jep:207[] 和 jep:210[] 的一部分,你还是可以查看这个示例,了解该 Docker 镜像是如何配置、连接到 Elasicsearch、
然后启动外部的日志存储,而不需要改变日志的界面。一个 Docker Compose 文件对于运行整个集群是必要的。</p>

<p>== Jenkinsfile Runner 打包</p>

<p>这可能是 Jenkinsfile Runner 最有意思的模式。
三月份,在开发者列表中 <a href="https://groups.google.com/d/msg/jenkinsci-dev/gjz3CDhi-kk/1mwi_oa0AQAJ">宣布</a>
一个新的项目 <a href="https://github.com/jenkinsci/jenkinsfile-runner">Jenkinsfile Runner</a>
大体的思路是,支持在单一 master 上只运行一次并打印输出到控制台的 Jenkins 流水线。
Jenkinsfile Runner 作为命令或一个 Docker 镜像来运行。
虽然只推荐 Docker 的形式,但是 Custom WAR Packager 都能够生成。
有了 Jenkinsfile Runner 你可以像下面的方式来运行流水线:</p>

<pre><code class="language-sh">docker run --rm -v $PWD/Jenkinsfile:/workspace/Jenkinsfile acmeorg/jenkinsfile-runner
</code></pre>

<p>当我们开始在云原生特别兴趣小组(Cloud Native SIG)中开始研究无状态(也就是“一次”)时,
有一个想法就是使用 Custom WAR Packager 和其他已有的工具(Jenkinsfile Runner, Jenkins Configuration as Code 等)来实现。
也许只是替换 Jenkinsfile Runner 中的 Jenkins 核心的 JAR 以及插件,但这还不够。
为了高效,Jenkinsfile Runner 镜像应该启动的 *很快*。在这个实现中,我们使用了 Jenkins 和 Jenkinsfile Runner 一些实验性的选项,
包括:类加载预缓存、插件解压等等。有了这些后,Jenkins 使用 configuration-as-code 和几十个插件可以在几秒钟内启动。</p>

<p>那么,如何构建自定义 Jenkinsfile Runner 镜像呢?尽管现在还没有发布,我们继续实现上面提到的内容。</p>

<pre><code class="language-yaml">##...
## WAR Configuration from above
##...

buildSettings:
  jenkinsfileRunner:
    source:
      groupId: &quot;io.jenkins&quot;
      artifactId: &quot;jenkinsfile-runner&quot;
      build:
        noCache: true
      source:
        git: https://github.com/jenkinsci/jenkinsfile-runner.git
        commit: 8ff9b1e9a097e629c5fbffca9a3d69750097ecc4
    docker:
      base: &quot;jenkins/jenkins:2.138.2&quot;
      tag: &quot;onenashev/cwp-jenkinsfile-runner-demo&quot;
      build: true
</code></pre>

<p>你可以从 <a href="https://github.com/jenkinsci/custom-war-packager/tree/master/demo/jenkinsfile-runner">这里</a>
找到用 Custom WAR Packager 打包 Jenkinsfile Runner 的例子。</p>

<p>== 更多</p>

<p>还有很多其他的特色没有在本文中提到。例如:它还可以修改 Maven 构建配置或增加、替换 Jenkins 核心中的库(例如:Remoting)。
请查看 <a href="https://github.com/jenkinsci/custom-war-packager/blob/master/README.md">Custom WAR Packager 文档</a>
获取更多信息。这个库中还有很多示例。</p>

<p>如果你有兴趣对这个库做贡献,请创建 PR 并抄送 <a href="https://github.com/oleg-nenashev/">@oleg-nenashev</a>
<a href="https://github.com/raul-arabaolaza">Raul Arabaolaza</a>,第二位维护者正在研究 Jenkins 自动化测试流程。</p>

<p>== 下一步?</p>

<p>还有很多值得改进的地方可以让这个工具更加高效:</p>

<ul>
<li>增加对插件依赖传递的检查以便在构建过程中发现冲突</li>
<li>允许在 YAML 配置文件中设置各种系统属性和 Java 选项</li>
<li>改进 Jenkinsfile Runner 的性能</li>
<li>集成到 Jenkins 集成测试流程中,(查看 Jenkins 流水线库中的 <a href="https://github.com/jenkins-infra/pipeline-library/blob/master/vars/essentialsTest.groovy">essentialsTest()</a>)</li>
</ul>

<p>还有很多其他的任务需要在 Custom WAR Packager 中实现,但是,现在它已经能够让 Jenkins 用户构建他们自己的发行版。</p>

</div>



<script src="https://utteranc.es/client.js"
        repo="jenkins-zh/jenkins-zh.github.io"
        issue-term="pathname"
        theme="github-light"
        crossorigin="linuxsuren"
        async>
</script>


          

        </div>
      </div>
      <div class="order-0 w-20 dn db-l">
        
<nav role="navigation">
  <ul class="list pa0 nl2">
    
  </ul>
</nav>

      </div>

    </div>
  </article>

  <div class="w-100 bg-light-gray">
    <div class="mw7 pa4 center nested-lh-copy lh-copy">
      <h6 class="f4 dark-gray mb2">
  <a href="https://jenkins-zh.github.io/wechat/articles/2018-12-5-custom-war-packager/" class="hide-child link primary-color">
  <span class="nl3 child"><svg class="grow" fill="" height="14px" viewBox="0 0 24 24" width="14px" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>
</span>
    “Custom WAR Packager”
  </a> was last updated: January 1, 0001
</h6>

LinuxSuRen's avatar
deploy  
LinuxSuRen 已提交
405
      <a href="https://github.com/jenkins-infra/wechat/edit/master/content/wechat/articles/2018-12-5-custom-war-packager.md" class="
LinuxSuRen's avatar
LinuxSuRen 已提交
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
f6 ph3 pv1 br2 dib  tc ttu mv3 bg-primary-color white hover-bg-green link
" target="_blank">改善此页</a>

      

  
  
  

  <div class="nested-lh-copy">
    <ul class="list dib nested-links ml0 pl0">
      
        <li class="db mb2 b">
          Tags:
        </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/tools">
              tools
            </a>
          </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/docker">
              docker
            </a>
          </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/jenkins-x">
              jenkins-x
            </a>
          </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/cloud-native">
              cloud-native
            </a>
          </li>
        
              
      
        
        
      
    </ul>
  </div>


    </div>
  </div>
</main>

    </main>

    <footer class="bg-primary-color-dark ph4-ns pt4 relative w-100" role="contentinfo">
  <div class="center flex-ns flex-wrap justify-between mw9 w-90">
    <div class="pb3 pt4 w-100 w-50-ns">

      <div class="b f3  light-gray mb3 nested-links tc">
<a href="https://github.com/LinuxSuRen/surenpi/graphs/contributors" class="link">SuRen</a> 维护<br/>
      </div>

      <ul class="center f6 list ma0 mv3 pa0 tc" style="display:none"><li class="dib mr3"><a href="https://github.com/linuxsuren/surenpi/issues/new" class="dim link light-gray pv2">File an Issue</a></li></ul>

      <ul class="center f6 list ma0 mv4 pa0 tc">
        <li class="dib mr3">
          <a href="https://twitter.com/suren69811254" target="_blank" class="dim link light-gray pv2">@suren69811254</a>
        </li>
        <li class="dib mr3">
          <a href="https://www.youtube.com/channel/UC63xz3pq26BBgwB3cnwCoqQ" target="_blank" class="dim link light-gray pv2">YouTube</a>
        </li>
      </ul>

      
    </div>

    <div>
      <img src="https://jenkins-zh.github.io//qrcode_for_linuxsuren.jpg" with="100" height="100">
      <img src="https://avatars2.githubusercontent.com/u/1450685?s=460&v=4" with="100" height="100" style="display:none">
      <a href="https://mp.weixin.qq.com/s/vifdduC3kRGSIMpyL03yVA" target="_blank">
        <img src="https://jenkins.io/images/jenkins-wechat.png" with="100" height="100">
      </a>
    </div>

  </div>

  <div class="f7 gray mb5 mb0-ns ph3 w-100" style="display:none"> 
    <p class="dib mr4">Jenkins&reg; is a registered trademark of <a href="https://www.spi-inc.org/" class="link">Software in the Public Interest, Inc.</a></p>
    <p class="dib">Copyright 2018–2018 the original authors.</p>
  </div>


  <div class="bg-primary-color-dark bottom-0 left-0 right-0 dn-l fixed pb3 ph3 w-100"><div  class="globalmenu mobilemenu pb3 dn">
    

<ul class="list hidden dib ph0 ma0 scrolling-touch tc">
  
    <li  class="tl dib ma0 hover-bg-black w-100">
        <a href="/wechat/" class="ttu f6 link primary-color-light overflow hover-white db brand-font  ma0 w-100 pv3 ph4">
          微信
        </a>
    </li>
  
    <li  class="tl dib ma0 hover-bg-black w-100">
LinuxSuRen's avatar
deploy  
LinuxSuRen 已提交
511 512
        <a href="http://jenkins.io/zh" class="ttu f6 link primary-color-light overflow hover-white db brand-font  ma0 w-100 pv3 ph4">
          Jenkins 官网
LinuxSuRen's avatar
LinuxSuRen 已提交
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
        </a>
    </li>
  
</ul>

</div>
<div  class="docsmenu mobilemenu pb3 dn">
    

<ul class="list dib ph0 ma0 scrolling-touch tc">
  
</ul>

</div>

<div class="flex dn-l justify-between">
  <button class="js-toggle flex-auto dib dn-l f6 tc db mt4-ns ph3 pv2 link mr2 white bg-primary-color-dark hover-bg-primary-color ba b--white-40 w-auto" data-target=".globalmenu">Menu</button>

  <button class="js-toggle flex-auto dib dn-l f6 tc db mt4-ns ph3 pv2 link white bg-primary-color-dark hover-bg-primary-color ba b--white-40 w-auto" data-target=".docsmenu">Docs Menu</button>
</div>
</div>

</footer>

    
<link href="/dist/auto-complete.css" rel="stylesheet">
<script type="text/javascript">
    
        var baseurl = "https:\/\/jenkins-zh.github.io\/";
    
</script>
<script src="/dist/lunr.js"></script>
<script src="/dist/autocomplete.js"></script>
<script src="/dist/jquery-3.2.1.min.js"></script>
<script src="/dist/search.js"></script>

<script async defer src="https://buttons.github.io/buttons.js"></script>


  </body>
</html>