index.html 37.8 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
<!DOCTYPE html>
<html class="no-js" lang="zh-CN">
  <head>
    <meta charset="utf-8">
    
    <link rel="preload" href="https://jenkins-zh.cn/files/muli-latin-200.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="https://jenkins-zh.cn/files/muli-latin-400.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="https://jenkins-zh.cn/files/muli-latin-800.woff2" as="font" type="font/woff2" crossorigin>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     
    <title>Jenkins 插件开发之旅:两天内从 idea 到发布(下篇) | Jenkins 中文社区</title>
    <meta name="HandheldFriendly" content="True">
    <meta name="MobileOptimized" content="320">
    <meta name="description" content="共建开放、包容、活跃的 Jenkins 社区">
    <meta name="keywords" content="Jenkins,Jenkins中文社区,Jenkins官方公众号,持续集成,持续交付,开源社区,DevOps">

    <meta name="viewport" content="width=device-width,minimum-scale=1">
LinuxSuRen's avatar
LinuxSuRen 已提交
19
     <meta name="generator" content="Hugo 0.54.0" />
LinuxSuRen's avatar
LinuxSuRen 已提交
20 21

      
LinuxSuRen's avatar
LinuxSuRen 已提交
22
        <META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
LinuxSuRen's avatar
LinuxSuRen 已提交
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
      

    <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="Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)" />
<meta property="og:description" content="两天内,从产生 idea 到编写插件,最后发布到 Jenkins 插件更新中心" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://jenkins-zh.cn/wechat/articles/2019/05/2019-05-08-jenkins-plugin-develop-within-two-days-part02/" />
<meta property="article:published_time" content="2019-05-08T00:00:00&#43;00:00"/>
<meta property="article:modified_time" content="2019-05-08T00:00:00&#43;00:00"/>

<meta itemprop="name" content="Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)">
<meta itemprop="description" content="两天内,从产生 idea 到编写插件,最后发布到 Jenkins 插件更新中心">


<meta itemprop="datePublished" content="2019-05-08T00:00:00&#43;00:00" />
<meta itemprop="dateModified" content="2019-05-08T00:00:00&#43;00:00" />
<meta itemprop="wordCount" content="485">



<meta itemprop="keywords" content="jenkins,maven,jira," />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)"/>
<meta name="twitter:description" content="两天内,从产生 idea 到编写插件,最后发布到 Jenkins 插件更新中心"/>

LinuxSuRen's avatar
LinuxSuRen 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
        
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-4216293-5"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-4216293-5');



var trackOutboundLink = function(id, url) {
  console.log("track:", id, url)
  gtag('event', 'click', {
    'event_category': 'outbound',
    'event_label': id,
    'transport_type': 'beacon',
    'event_callback': function(){document.location = url;}
  });
}

</script>

      
LinuxSuRen's avatar
LinuxSuRen 已提交
78 79 80 81 82 83 84 85
  </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">
LinuxSuRen's avatar
LinuxSuRen 已提交
86
      <a href="https://jenkins-zh.cn/" class="link white">
LinuxSuRen's avatar
LinuxSuRen 已提交
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
         Jenkins 中文社区
      </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">
            
            
          <a href="/event/" class="dim link light-silver"
            >
            活动
              
            
          </a>
        </li>
      
        <li class="f5 dib mr4" role="menuitem">
            
            
          <a href="/about/" class="dim link light-silver"
            >
            关于我们
              
            
          </a>
        </li>
      
        <li class="f5 dib mr4" role="menuitem">
            
            
          <a href="http://jenkins.io/zh" class="dim link light-silver"
            target="_blank">
            Jenkins 官网
              
            
              <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"></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/jenkins-zh/jenkins-zh/" data-size="large" data-show-count="false" aria-label="Star Jenkins WeChat 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="mw5 br3 mv3 nested-links">
    
    
      
LinuxSuRen's avatar
LinuxSuRen 已提交
179
        <h3 class="f4 dib">
LinuxSuRen's avatar
LinuxSuRen 已提交
180
            Wang Donghui
LinuxSuRen's avatar
LinuxSuRen 已提交
181 182 183 184 185
        </h3>

      
      
        <p class="lh-copy measure center mt0 f6 black-60">
LinuxSuRen's avatar
LinuxSuRen 已提交
186
          a long-time Jenkins user and contributor
LinuxSuRen's avatar
LinuxSuRen 已提交
187
        </p>
LinuxSuRen's avatar
LinuxSuRen 已提交
188
      
LinuxSuRen's avatar
LinuxSuRen 已提交
189
      <a href="https://github.com/donhui" target="_blank" class="link dim v-mid dib">
LinuxSuRen's avatar
LinuxSuRen 已提交
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
        <svg version="1.1" fill="gray" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="18" viewBox="0 0 27 32">
<path d="M9.28 21.44q0.064-0.128-0.064-0.256-0.16-0.128-0.256-0.032-0.064 0.128 0.064 0.224 0.16 0.128 0.256 0.064zM8.768 20.704q-0.096-0.128-0.224-0.096-0.096 0.096 0 0.224 0.128 0.16 0.224 0.096t0-0.224zM8.032 19.968q0.032-0.064-0.096-0.128-0.128-0.032-0.128 0.032-0.064 0.096 0.064 0.16 0.16 0.032 0.16-0.064zM8.416 20.384q0.032 0 0.032-0.064t-0.064-0.096q-0.128-0.128-0.192-0.064t0.032 0.192q0.096 0.096 0.192 0.032zM9.952 21.728q0.032-0.128-0.16-0.192-0.16-0.064-0.224 0.064t0.16 0.192q0.16 0.064 0.224-0.064zM10.688 21.792q0-0.16-0.192-0.16t-0.192 0.16 0.192 0.128 0.192-0.128zM11.392 21.664q-0.032-0.128-0.224-0.096t-0.16 0.16q0.032 0.16 0.192 0.096t0.192-0.16zM22.848 16q0-3.776-2.656-6.464t-6.464-2.688-6.464 2.688-2.688 6.464q0 2.976 1.76 5.376t4.48 3.296q0.32 0.064 0.48-0.096t0.16-0.352q0-0.928-0.032-1.696-0.096 0.032-0.256 0.064t-0.64 0.032-0.864-0.096-0.768-0.352-0.544-0.736q-0.416-1.056-1.024-1.312-0.032-0.032-0.064-0.064l-0.16-0.16t-0.096-0.16 0.064-0.128 0.352-0.064q0.096 0 0.256 0.032t0.544 0.288 0.576 0.64q0.288 0.48 0.672 0.736t0.768 0.256 0.704-0.064 0.512-0.16q0.128-0.864 0.608-1.248-0.896-0.096-1.536-0.32t-1.312-0.704-0.992-1.344-0.352-2.144q0-1.408 0.96-2.464-0.448-1.088 0.096-2.4 0.32-0.128 0.96 0.128t1.088 0.512l0.448 0.288q1.056-0.288 2.304-0.288t2.272 0.288q0.192-0.128 0.512-0.32t0.992-0.448 1.024-0.16q0.512 1.312 0.096 2.4 0.928 1.056 0.928 2.464 0 1.024-0.256 1.792t-0.64 1.248-0.928 0.8-1.12 0.448-1.216 0.224q0.608 0.544 0.608 1.696 0 0.704 0 1.6t-0.032 0.896q0 0.224 0.16 0.352t0.48 0.096q2.752-0.928 4.512-3.296t1.728-5.376zM27.424 7.424v17.152q0 2.112-1.504 3.616t-3.648 1.536h-17.12q-2.144 0-3.648-1.536t-1.504-3.616v-17.152q0-2.112 1.504-3.616t3.648-1.536h17.12q2.144 0 3.648 1.536t1.504 3.616z"></path>
</svg>

      </a>
  </aside>


<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">
	
		<p class="b">此页面上的内容</p>
  	<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#托管插件">托管插件</a>
<ul>
<li><a href="#准备工作">准备工作</a>
<ul>
<li><a href="#查找类似的插件">查找类似的插件</a></li>
<li><a href="#命名规约">命名规约</a>
<ul>
<li><a href="#artifactid">artifactId</a></li>
<li><a href="#插件名称">插件名称</a></li>
<li><a href="#groupid">groupId</a></li>
<li><a href="#java-源代码">Java 源代码</a></li>
<li><a href="#提交消息">提交消息</a></li>
</ul></li>
<li><a href="#license">License</a></li>
<li><a href="#要求注册的账号">要求注册的账号</a></li>
</ul></li>
<li><a href="#发起托管请求">发起托管请求</a></li>
<li><a href="#创建-wiki-页面">创建 wiki 页面</a></li>
<li><a href="#开启-ci-构建">开启 CI 构建</a></li>
<li><a href="#申请上传权限">申请上传权限</a></li>
<li><a href="#发布插件">发布插件</a>
<ul>
<li><a href="#前提">前提</a></li>
<li><a href="#maven-要使用的-artifactory-凭据">Maven 要使用的 Artifactory 凭据</a></li>
<li><a href="#配置-github-以接受你的-ssh-key">配置 GitHub 以接受你的 SSH key</a></li>
<li><a href="#执行发布">执行发布</a></li>
</ul></li>
<li><a href="#为插件分类">为插件分类</a></li>
</ul></li>
<li><a href="#总结">总结</a></li>
<li><a href="#参考">参考</a></li>
</ul></li>
</ul>
</nav>
	

	<div date-pref>
		<a href=".." class="dib f6 pl1 hover-bg-light-gray br-100">
			<svg class="fill-current" height="30px" viewBox="0 0 24 24" width="30px" xmlns="http://www.w3.org/2000/svg">
      <path transform="rotate(90 11.704999923706055,12.000000000000002) " d="m15.41,7.41l-1.41,-1.41l-6,6l6,6l1.41,-1.41l-4.58,-4.59l4.58,-4.59z" id="svg_1"/>
    <path d="M0 0h24v24H0z" fill="none"/>
</svg>

		</a>
		
		
LinuxSuRen's avatar
LinuxSuRen 已提交
251 252 253 254 255 256 257 258
			<a href="https://jenkins-zh.cn/wechat/articles/2019/05/2019-05-09-jenkins-release/" class="dib f6 pl1 hover-bg-light-gray br-100" title="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>
		
LinuxSuRen's avatar
LinuxSuRen 已提交
259 260

		
LinuxSuRen's avatar
LinuxSuRen 已提交
261
			<a href="https://jenkins-zh.cn/wechat/articles/2019/05/2019-05-07-jenkins-install-plugins-shell/" class="dib f6 pr1 hover-bg-light-gray br-100" title="Jenkins 自动化安装插件">
LinuxSuRen's avatar
LinuxSuRen 已提交
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 405 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 511 512 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 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
			<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-80-l mw8 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 mw8">
          <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">Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)</h1>
</header>

<aside class="bt bw1 pt3 mt2 mid-gray b--mid-gray fn w-100">
  
    <div class="f4 fw4 lh-copy">
      两天内,从产生 idea 到编写插件,最后发布到 Jenkins 插件更新中心
    </div>
  

  
</aside>



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



<p><img src="../../../images/articles/2019/05/2019-05-08-jenkins-plugin-develop-within-two-days-part02/sunset.png" alt="江边落日" /></p>

<p>本文分上下两篇,上篇介绍了从产生 idea 到插件开发完成的过程;
下篇将介绍将插件托管到 Jenkins 插件更新中心的一系列过程。</p>

<h2 id="托管插件">托管插件</h2>

<p>托管插件包括一系列流程步骤。
笔者完成了它所有步骤(包括非必须的步骤),其中主要有两个具有标志性的任务:
- 插件代码被托管在 jenkinsci GitHub 组织的一个仓库,然后作者拥有它的管理权限。<br />
  笔者插件的代码仓库为:<a href="https://github.com/jenkinsci/maven-snapshot-check-plugin">jenkinsci/maven-snapshot-check-plugin</a>
- 你可以将插件发布到 Jenkins 项目的 Maven 仓库,它是 Jenkins 项目所使用的更新站点的数据来源。</p>

<h3 id="准备工作">准备工作</h3>

<p>在请求插件托管之前,需要完成以下几个步骤。</p>

<h4 id="查找类似的插件">查找类似的插件</h4>

<p>Jenkins 社区欢迎任何人的贡献,但为了让 Jenkins 用户受益,
它要求查找解决相同或类似问题的插件,看看是否可以与现有的维护人员联手。
可以在 <a href="https://plugins.jenkins.io">https://plugins.jenkins.io</a> 查看所有的插件,
以确认是否已有类似的插件实现了你计划实现的功能。
笔者在之前已进行过查找,并没有找到可以实现笔者计划实现的功能的类似插件。</p>

<h4 id="命名规约">命名规约</h4>

<p>Jenkins 制定了一些与插件相关的命名规约。
插件开发者要确保遵循这些命名规约。</p>

<h5 id="artifactid">artifactId</h5>

<p>插件的 artifactId 被用于文件基本名称,是 Jenkins 插件和更新站点的唯一标识。<br />
它需要遵循一些发布规约:
- 使用小写 ID ,并根据需要使用连字符分隔术语。
- 除非名称有任何意义,否则不要在 ID 中包含 jenkins 或 plugin 。</p>

<h5 id="插件名称">插件名称</h5>

<p>插件的名称在 Jenkins UI 和其它地方(如:插件站点)展示给用户。<br />
如果可以,建议使用简短的描述性名称,如 <em>Subversion</em><br />
笔者所写的插件的名称为:<em>Maven SNAPSHOT Check</em></p>

<h5 id="groupid">groupId</h5>

<p>推荐使用 <code>io.jenkins.plugins</code><code>org.jenkins-ci.plugins</code> 作为 groupId 。
但是不禁止其他组织 ID ,除非它们是恶意的(例如引用与你没有关系的组织)。
笔者所写的插件使用的 groupId 为: <code>org.jenkins-ci.plugins</code></p>

<h5 id="java-源代码">Java 源代码</h5>

<p>Jenkins 项目一般遵循 <a href="https://jenkins.io/doc/developer/publishing/style-guides/www.oracle.com/technetwork/java/codeconvtoc-136057.html">Oracle Java 代码规约</a>
但是并没有很好的强制甚至在核心组件中。
个别的插件维护者有时会选择使用不同的风格指南作为插件。
笔者日常使用 IDEA 进行开发,之前安装了「阿里 Java 规约插件」,
因而使用它作为编码规约。</p>

<h5 id="提交消息">提交消息</h5>

<p>Git 提交消息应该从引用与之相关的 JIRA 问题开始(如果适用),
然后在第一行进行简短的总结,并在随后的行中提供更多详细信息。例如:</p>

<pre><code>[JENKINS-00000] Frobnicate the widget
</code></pre>

<p>如果给定的提交修复了指定的问题,
那么使用以下前缀中的任何一个将会自动化解决相关的 JIRA 问题。</p>

<pre><code>[FIX JENKINS-00000] Frobnicate the widget
[FIXED JENKINS-00000] Frobnicate the widget
[FIXES JENKINS-00000] Frobnicate the widget
</code></pre>

<p>由于还没过将插件托管,笔者并没有遵循该规约,
等插件发布后,笔者将考虑遵循该规约。</p>

<h4 id="license">License</h4>

<p>Jenkins 项目分发的所有插件都需要是免费的开源软件。
这适用于插件源代码及其所有依赖项。
要确保在 <code>pom.xml</code> 文件和仓库中的 <code>LICENSE</code> 文件指定协议。
官方建议使用 MIT license ,它用于 Jenkins 核心和大多数插件和库,
但是任何 OSI 批准的开源 license 都可以。
笔者这里使用了 MIT license 。</p>

<h4 id="要求注册的账号">要求注册的账号</h4>

<p>通过 Jenkins 项目更新站点分发的插件需要托管在 <a href="https://github.com/jenkinsci">jenkinsci GitHub 组织</a>中,
因此需要在 GitHub 上有一个账号,并且需要有一个公共仓库来存放插件源代码。</p>

<p>为了完整地发布你的插件,需要注册一个 <a href="https://accounts.jenkins.io/">Jenkins 社区帐号</a>
它可以让你访问 <a href="https://issues.jenkins-ci.org/">JIRA</a><a href="https://wiki.jenkins-ci.org/">wiki</a><a href="https://repo.jenkins-ci.org/">Maven 仓库</a></p>

<h3 id="发起托管请求">发起托管请求</h3>

<blockquote>
<p>注意:Jenkins 官方自动化流程使用更容易实现的 fork + 删除的方式(见下文),而不是转移仓库所有者。</p>
</blockquote>

<p>登录到 <a href="https://issues.jenkins-ci.org/">JIRA</a> 然后在 <a href="https://issues.jenkins-ci.org/browse/HOSTING">HOSTING</a> 项目创建一个问题。
请确保按照描述填写所有字段。
Jenkins 项目成员将在几天内审查你的请求。
如果审查人员要求你更改,那么请按照要求进行更改。</p>

<p>笔者提交的申请为:<a href="https://issues.jenkins-ci.org/browse/HOSTING-750">HOSTING-750</a>
比较幸运的是当天凌晨(北京时间)笔者的请求就被审查,
正巧那时笔者未眠,于是随后按要求进行了更改并在不久后该申请被审批通过。</p>

<p>一旦满足了所有的需求,你的仓库将被 fork 到 jenkinsci 组织中,
并且你将被邀请加入该组织,并且将为你在 JENKINS 项目中创建 JIRA 组件。</p>

<p>此时,将要求你删除 Jenkins 从中 fork 的仓库。
之后你可以通过再次从 <code>jenkinsci</code> 那里 fork 来重新创建它。
这将确保 <code>jenkinsci</code> 仓库是 Github 上网络图的根。
这意味着:
- 不会混淆哪个仓库是权威仓库。
- 即使在 GitHub 上没有大量的关注者,<a href="https://help.github.com/articles/searching-in-forks/">源代码搜索</a>也会成功。
- 其他人更可能在 <code>jenkinsci</code> 仓库中提交 pull request(这是协作的理想选择)。</p>

<h3 id="创建-wiki-页面">创建 wiki 页面</h3>

<p>尽管这对发布插件来说这不是严格要求的,但最好为插件创建一个 wiki 页面来存储文档。关于如何执行此操作的详细信息,请参阅<a href="https://jenkins.io/doc/developer/publishing/wiki-page">插件 wiki 页面指南</a></p>

<p>笔者所写的插件的 wiki 页面为:<a href="https://wiki.jenkins.io/display/JENKINS/Maven+SNAPSHOT+Check+Plugin">Maven SNAPSHOT Check Plugin</a>
其间除了官方文档,笔者还参考了其它插件 wiki 页面的排版。</p>

<h3 id="开启-ci-构建">开启 CI 构建</h3>

<p>Jenkins 项目托管了一个 Jenkins 实例来执行插件的持续集成构建。
官方推荐通过在插件的 Github 仓库根目录创建一个 Jenkinsfile,
为在 Jenkinsci Github 组织中的插件设置 CI 构建。
典型的插件构建( Maven 或 Gradle )只需在 Jenkinsfile 中包含以下语句即可运行:</p>

<pre><code>buildPlugin()
</code></pre>

<h3 id="申请上传权限">申请上传权限</h3>

<p>在源代码被 fork 到 <code>jenkinsci</code> 组织后,需要提交一个上传权限请求。
按照 <a href="https://github.com/jenkins-infra/repository-permissions-updater/">jenkins-infra/repository-permissions-updater/</a> 仓库的 README 文件中所说的来做就可以。</p>

<p>Jenkins 项目在 <a href="https://repo.jenkins-ci.org/">Artifactory</a> 上托管 Maven 制品,例如核心和插件发布。
它的权限系统与 Github 是独立的,
限制了那些用户(由 Jenkins LDAP 帐户标识,与 wiki 和 JIRA 一样)可以上传。
这个仓库包含 YAML 格式的 Artifactory 上传权限定义,
以及将它们同步到 Artifactory 的工具。
&gt; 先决条件:在申请权限之前,需要先用 Jenkins 社区帐号登录一次  <a href="https://repo.jenkins-ci.org/">Artifactory</a></p>

<p>要请求对制品(通常是插件)的上传权限,需要提交一个 PR ,
该 PR 需要创建与申请上传权限相关的 YAML 文件。
笔者所提交的 PR 为:<a href="https://github.com/jenkins-infra/repository-permissions-updater/pull/1107">Plugin: Permission for maven-snapshot-check-plugin</a></p>

<p>通过查看它可以看出该 PR 增加了一个文件:permissions/plugin-maven-snapshot-check.yml ,其内容如下:</p>

<pre><code class="language-yaml">name: &quot;maven-snapshot-check&quot;
github: &quot;jenkinsci/maven-snapshot-check-plugin&quot;
paths:
- &quot;org/jenkins-ci/plugins/maven-snapshot-check&quot;
developers:
- &quot;donhui&quot;
</code></pre>

<p>在创建 PR 后,会有帮助说明以及 checklist 让提交人对该 PR 进行检查确认。<br />
等这个 PR 被审批后,插件开发者就会拥有该插件的发布权限。</p>

<h3 id="发布插件">发布插件</h3>

<h4 id="前提">前提</h4>

<p>要先确认拥有发布该插件的权限。</p>

<h4 id="maven-要使用的-artifactory-凭据">Maven 要使用的 Artifactory 凭据</h4>

<p>需要告诉 Maven 访问 Artifactory 的凭据。
登录 Artifactory ,从用户 profile 中获取<code>加密的密码</code>
<code>~/.m2/settings.xml</code> 文件配置 server 认证信息,如下所示:</p>

<pre><code class="language-xml">&lt;settings xmlns=&quot;https://maven.apache.org/SETTINGS/1.0.0&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;https://maven.apache.org/SETTINGS/1.0.0
                      https://maven.apache.org/xsd/settings-1.0.0.xsd&quot;&gt;

  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;maven.jenkins-ci.org&lt;/id&gt; 
      &lt;username&gt;your_user_name_here&lt;/username&gt;
      &lt;password&gt;your_encrypted_password_here&lt;/password&gt;
    &lt;/server&gt;
  &lt;/servers&gt;

&lt;/settings&gt;
</code></pre>

<h4 id="配置-github-以接受你的-ssh-key">配置 GitHub 以接受你的 SSH key</h4>

<p>当执行 release 时,Maven Release Plugin 会自动往仓库推送代码,
所以需要<a href="https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/">配置 GitHub 以接受你的 SSH key</a></p>

<p>更多信息可以参考:<a href="https://help.github.com/articles/connecting-to-github-with-ssh/">GitHub help on SSH</a></p>

<h4 id="执行发布">执行发布</h4>

<p>当 GitHub 和 Maven 凭据配置好后,
执行一次发布应该很简单,只需要运行下面的命令:</p>

<pre><code>mvn release:prepare release:perform
</code></pre>

<p>可能在执行发布时会遇到 &ldquo;401 Unauthorized&rdquo;&ldquo;403 Forbidden&rdquo; 之类问题,
这一般是 settings.xml 配置问题或是没有上传权限。
一些公共的问题处理方案可以查看:<a href="https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins#HostingPlugins-Workingaroundcommonissues">HostingPlugins-Workingaroundcommonissues</a></p>

<p>插件发布后,8 小时内,将可以在插件更新中心看到它。</p>

<p>笔者所写的 maven-snapshot-check 插件,
在插件列表页的地址为:<a href="https://plugins.jenkins.io/maven-snapshot-check">https://plugins.jenkins.io/maven-snapshot-check</a></p>

<p>Jenkins 实例的插件管理页面的「可选插件」选项截图如下:
<img src="../../../images/articles/2019/05/2019-05-08-jenkins-plugin-develop-within-two-days-part02/maven-snapshot-check-available.png" alt="maven-snapshot-check-available" /></p>

<h3 id="为插件分类">为插件分类</h3>

<p>在 Jenkins <a href="https://plugins.jenkins.io/">插件列表页面</a>,可以对插件进行分类显示。</p>

<p>要为插件添加一个分类,需要向 <a href="https://github.com/jenkins-infra/update-center2">jenkins-infra/update-center2</a> 仓库提交一个 PR 。
笔者所提交的 PR 为:<a href="https://github.com/jenkins-infra/update-center2/pull/271">add maven-snapshot-check category</a></p>

<p>通过查看它可以看出该 PR 在 <code>src/main/resources/label-definitions.properties</code> 文件增加了一行,如下所示:</p>

<pre><code>maven-snapshot-check=builder
</code></pre>

<h2 id="总结">总结</h2>

<p>两天的 Jenkins 插件开发之旅(尤其是 04.24 晚上花了很多时间),
让笔者了解了插件开发的基本知识,并在托管插件的过程中学到一些知识。
然后在周末花了几个小时总结回顾,并将它写成文档。
同时也希望此文能给 Jenkins 插件开发者入门带来一点帮助!</p>

<h2 id="参考">参考</h2>

<ul>
<li><a href="https://jenkins.io/doc/developer/publishing/requesting-hosting/">Guide to Plugin Hosting</a></li>
<li><a href="https://jenkins.io/doc/developer/publishing/releasing/">Performing a Plugin Release</a></li>
</ul>

</div>


<aside class="bt bw1 pt3 mt2 mid-gray b--mid-gray fn w-100">

</aside>




<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>
  </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.cn/wechat/articles/2019/05/2019-05-08-jenkins-plugin-develop-within-two-days-part02/" 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>
    “Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)”
  </a> 更新于:May 8, 2019
  <div>
    原文作者:<a href="" target="_blank">donhui</a>
  </div>
</h6>

      <a href="https://github.com/jenkins-zh/jenkins-zh/edit/master/content/wechat/articles/2019/05/2019-05-08-jenkins-plugin-develop-within-two-days-part02.md" class="
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/jenkins">
              jenkins
            </a>
          </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/maven">
              maven
            </a>
          </li>
        
          <li class="db dib-l mr3">
            <a class="tag" href="/tags/jira">
              jira
            </a>
          </li>
        
              
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
625
          <li class="db dib-l mb2 mr3">
LinuxSuRen's avatar
LinuxSuRen 已提交
626 627
            <a href="/wechat/articles/2019/05/2019-05-22-jacoco-coverage-for-functional-test/" class="link">
              基于 Jenkins &#43; JaCoCo 实现功能测试代码覆盖率统计
LinuxSuRen's avatar
LinuxSuRen 已提交
628 629 630
            </a>
          </li>
        
LinuxSuRen's avatar
LinuxSuRen 已提交
631 632 633 634 635 636 637
      
        
          <li class="db b mt4 mb2 mr2">
            Related entries:
          </li>
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
638 639 640 641 642 643 644 645 646
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-20-jenkins-ansible-springboot/" class="link">
              使用 Jenkins &#43; Ansible 实现 Spring Boot 自动化部署101
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
647 648 649 650 651 652 653 654 655
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-17-from-jenkins-to-jenkins-x/" class="link">
              从 Jenkins 到 Jenkins X
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
656 657 658 659 660 661 662 663 664
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-15-gsoc-annoncement/" class="link">
              19年 GSoC 中 Jenkins 的七个项目
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
665 666 667 668 669 670 671 672 673
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-14-devops-jenkins-credential-manage/" class="link">
              基于 Jenkins 的 DevOps 平台应该如何设计凭证管理
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
deploy  
LinuxSuRen 已提交
674 675 676 677 678 679 680 681 682
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-13-jenkins-book-gift/" class="link">
              Jenkins 公众号送书福利
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
683 684 685 686 687 688 689 690 691
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-09-jenkins-release/" class="link">
              Jenkins 版本发布
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
692 693 694
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
695 696 697 698 699 700 701 702 703
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-07-jenkins-install-plugins-shell/" class="link">
              Jenkins 自动化安装插件
            </a>
          </li>
        
      
        
        
LinuxSuRen's avatar
LinuxSuRen 已提交
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/05/2019-05-06-jenkins-plugin-develop-within-two-days-part01/" class="link">
              Jenkins 插件开发之旅:两天内从 idea 到发布(上篇)
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-29-progressive-delivery-with-jenkins-x-automatic-cana/" class="link">
              使用 Jenkins X 渐进式交付:自动化金丝雀部署
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-26-progressive-delivery-with-jenkins-x/" class="link">
              使用 Jenkins X 渐进式交付
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-25-jenkins-ansible-nginx/" class="link">
              使用 Jenkins &#43; Ansible 实现自动化部署 Nginx
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-23-jenkins-master-shared-home/" class="link">
              关于 Jenkins master 共享 JENKINS_HOME 目录的实验
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-19-the-business-value-of-cd/" class="link">
              持续交付的商业价值
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/" class="link">
              使用 Zabbix 监控 Jenkins
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-12-brief-analysis-the-encryption-algorithm-of-the-built-in-jenkins-user-database/" class="link">
              简析 Jenkins 专有用户数据库加密算法
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-10-getting-started-with-docker-for-java-applications/" class="link">
              Java 应用使用 Docker 的入门指南:建立一个 CI/CD 流水线
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/04/2019-04-08-becoming-contributor-intro/" class="link">
              介绍:成为一名 Jenkins 贡献者的旅程
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/03/2019-03-13-electron-pipeline-demo/" class="link">
              Electron 应用的流水线设计
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/03/2019-03-13-ready-for-cdf/" class="link">
              为 Continuous Delivery Foundation 的成立感到兴奋
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/03/2019-01-08-mpl-modular-pipeline-library/" class="link">
              MPL - 模块化的流水线库
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/02/2019-02-27-jenkins-script-console-in-practice/" class="link">
              批量修改 Jenkins 任务的技巧
            </a>
          </li>
        
      
        
        
          <li class="db dib-l mb2 mr3">
            <a href="/wechat/articles/2019/01/2019-01-16-webhook-firewalls/" class="link">
              在安全防火墙内通过 WebHook 触发构建
            </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/jenkins-zh/jenkins-zh/graphs/contributors" target="_blank" class="link">Jenkins 社区贡献者</a> 维护<br/>
      </div>

      <ul class="center f6 list ma0 mv3 pa0 tc" style="display:none"><li class="dib mr3"><a href="https://github.com/jenkins-zh/jenkins-zh/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>
      <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–2019 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">
        <a href="/event/" 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">
        <a href="/about/" 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">
        <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 官网
        </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">
    
LinuxSuRen's avatar
LinuxSuRen 已提交
937
        var baseurl = "https:\/\/jenkins-zh.cn\/";
LinuxSuRen's avatar
LinuxSuRen 已提交
938 939 940 941 942 943 944 945
    
</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>
LinuxSuRen's avatar
LinuxSuRen 已提交
946 947 948 949 950 951 952 953 954
<script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?6db234f713318730f0e5f6a95bdd8d47";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
</script>
LinuxSuRen's avatar
LinuxSuRen 已提交
955 956 957 958 959 960 961
<script>
(function(){
var src = (document.location.protocol == "http:") ? "http://js.passport.qihucdn.com/11.0.1.js?6276dcef5c15f276644151772390c1f9":"https://jspassport.ssl.qhimg.com/11.0.1.js?6276dcef5c15f276644151772390c1f9";
document.write('<script src="' + src + '" id="sozz"><\/script>');
})();
</script>

LinuxSuRen's avatar
LinuxSuRen 已提交
962 963 964

  </body>
</html>