Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
dzÎö Jenkins ²å¼þ¿ª·¢
 
  4848  次浏览      28
 2018-2-7 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ²Ü Æ¼ ºÍ ÕÅ ½Ý,Jenkins ÊÇ Hudson µÄ¼ÌÐø¡£Jenkins ÌṩÁËÒ×ÓÚʹÓõijÖÐø¼¯³Éϵͳ£¬Ê¹¿ª·¢Õ߸üרעÓÚÒµÎñÂß¼­µÄʵÏÖ¡£

Jenkins ¸ÅÊö

Jenkins£¬¼òµ¥µÄ˵¾ÍÊÇÒ»¸ö¿ªÔ´µÄ³ÖÐø¼¯³É·þÎñÆ÷£¬ÊÇ Hudson µÄ¼ÌÐø¡£Jenkins ÌṩÁËÒ×ÓÚʹÓõijÖÐø¼¯³Éϵͳ£¬Ê¹¿ª·¢Õ߸üרעÓÚÒµÎñÂß¼­µÄʵÏÖ¡£Jenkins ÄÜʵʱ¼à¿Ø¼¯³É¹ý³ÌÖеÄÎÊÌ⣬ÌṩÏêϸµÄÈÕÖ¾ÐÅÏ¢£¬»¹ÄÜÒÔͼ±íµÄÐÎʽÏÔʾÏîÄ¿¹¹½¨µÄÇé¿ö¡£

Jenkins ÌṩÁ˷ḻµÄ¹ÜÀíºÍÅäÖù¦ÄÜ£¬ÈçÏÂͼËùʾ£¬°üÀ¨ÏµÍ³ÉèÖ㬲å¼þ¹ÜÀí£¬ÏµÍ³ÐÅÏ¢£¬ÏµÍ³ÈÕÖ¾£¬¸ºÔØÍ³¼Æ£¬½Úµã¹ÜÀíµÈ¹¦ÄÜ¡£

ͼ 1. Jenkins µÄϵͳ¹ÜÀí

Jenkins ¼Ü¹¹

Stapler

Stapler ÊÇÒ»¸ö½«Ó¦ÓóÌÐò¶ÔÏóºÍ URL ×°¶©ÔÚÒ»ÆðµÄ lib ¿â£¬Ê¹±àд web Ó¦ÓóÌÐò¸ü¼Ó·½±ã¡£Stapler µÄºËÐÄ˼ÏëÊÇ×Ô¶¯ÎªÓ¦ÓóÌÐò¶ÔÏó°ó¶¨ URL£¬²¢´´½¨Ö±¹ÛµÄ URL ²ã´Î½á¹¹¡£

ÏÂͼÏÔʾÁË Stapler µÄ¹¤×÷Ô­Àí£º

ͼ 2. Stapler ¹¤×÷Ô­Àí

ÉÏͼ×ó±ßÏÔʾÁËÓ¦ÓóÌÐòµÄ´úÂëÐÅÏ¢£¬ÓÒ±ßÏÔʾÁË URL µÄ²ã´Î½á¹¹¡£Í¨¹ý·´Éä»úÖÆ£¬Stapler ¿ÉÒÔ½« URL °ó¶¨µ½Ó¦ÓóÌÐò¶ÔÏó¡£±ÈÈç˵£¬Ó¦ÓóÌÐòµÄ¸ù¶ÔÏó¶ÔÓ¦ URL µÄ¸ù¡°/¡±¡£Í¨¹ý getProject(¡°stapler¡±) ·½·¨·ÃÎʵĶÔÏ󽫷ÖÅɸø URL ¡°/project/stapler¡±¡£Í¨¹ýÕâÖÖ·½Ê½£¬Ó¦ÓóÌÐò¶ÔÏóÄ£Ð;ÍÖ±½Óת»¯Îª URL µÄ²ã´Î½á¹¹, ÈçͼÖÐ×ÏÉ«¼ýÍ·Ëùʾ¡£

Jenkins µÄÀà¶ÔÏóºÍ URL °ó¶¨¾ÍÊÇͨ¹ý Stapler À´ÊµÏֵġ£Hudson ʵÀý×÷Ϊ root ¶ÔÏó°ó¶¨µ½ URL¡°/¡±£¬ÆäÓಿ·ÖÔò¸ù¾Ý¶ÔÏóµÄ¿É´ïÐÔÀ´°ó¶¨¡£ÀýÈç Hudson ÓÐÒ»¸ö getJob(String) ·½·¨£¬ÄÇô¸ù¾ÝÉÏͼµÄ½éÉÜ£¬¿ÉÒÔÖªµÀ URL¡°/job/foo/¡±½«°ó¶¨µ½ Hudson.getJob(¡°foo¡±) ·µ»ØµÄ¶ÔÏó¡£

³Ö¾Ã»¯

Jenkins ʹÓÃÎļþÀ´´æ´¢Êý¾Ý£¨ËùÓÐÊý¾Ý¶¼´æ´¢ÔÚ$JENKINS_HOME£©¡£ÓÐЩÊý¾Ý£¬±ÈÈç console Êä³ö£¬»á×÷ΪÎı¾Îļþ´æ´¢£»ÓÐЩÊý¾ÝÔò»áÏñ Java ÅäÖÃÎļþ¸ñʽһÑù´æ´¢£»´ó¶àÊýµÄ½á¹¹Êý¾Ý£¬ÈçÒ»¸öÏîÄ¿µÄÅäÖûò¹¹½¨£¨build£©¼Ç¼ÐÅÏ¢Ôò»áͨ¹ý XStream ³Ö¾Ã»¯£¬Êµ¼ÊÈçͼ 3 Ëùʾ¡£´ÓͼÖпÉÒÔ¿´µ½ Jenkins °ÑÒ»¸ö Job µÄËùÓй¹½¨¼Ç¼¶¼Í¨¹ý XStream ¼Ç¼ÏÂÀ´¡£

ͼ 3. Jenkins ¹¹½¨¼Ç¼

²å¼þ

Jenkins µÄ¶ÔÏóÄ£ÐÍÊÇ¿ÉÀ©Õ¹µÄ£¬Í¨¹ý Jenkins ÌṩµÄ¿ÉÀ©Õ¹µã£¬ÎÒÃÇ¿ÉÒÔ¿ª·¢²å¼þÀ©Õ¹ Jenkins µÄ¹¦ÄÜ¡£µ½Ä¿Ç°ÎªÖ¹£¬Jenkins ÒѾ­Ö§³Ö³¬¹ý 600 ¸ö²å¼þ£¬ÕâЩ²å¼þÖ§³ÖµÄ¹¦Äܺ­¸ÇÁËÈí¼þÅäÖùÜÀí (SCM)¡¢Èí¼þ²âÊÔ¡¢Í¨Öª (Notification)¡¢±¨±íµÈ·½Ãæ¡£

Jenkins ͨ¹ýµ¥¶ÀµÄÀà¼ÓÔØÆ÷¼ÓÔØÃ¿¸ö²å¼þÒÔ±ÜÃâ²å¼þÖ®¼ä²úÉú³åÍ»¡£²å¼þ¾ÍÏñ Jenkins ÄÚÖÃµÄÆäËûÀàÒ»Ñù²ÎÓ뵽ϵͳµÄ»î¶¯ÖС£ÁíÍ⣬²å¼þ¿ÉÒÔͨ¹ý XStream ³Ö¾Ã»¯£¬¿ÉÒÔÓÉ Jelly ÌṩÊÓͼ¼¼Êõ£¬¿ÉÒÔÌṩͼƬµÈ¾²Ì¬×ÊÔ´£¬²å¼þÖÐËùÓеŦÄÜ¿ÉÒÔÎÞ·ìµÄ¼ÓÈëµ½ Jenkins ÄÚÖõŦÄÜÉÏ¡£

Jenkins Ô´´úÂëµ÷ÊÔºÍdzÎö

Ô´Âëµ÷ÊÔ

Òª¿ª·¢ Jenkins ²å¼þ±ØÈ»Àë²»¿ª Jenkins Ô´´úÂëµ÷ÊÔ¡£Jenkins ¹Ù·½ÍøÕ¾ÉÏÌṩÁËÔ´´úÂëµ÷ÊÔ·½Ê½¡£±ÊÕß³¢ÊÔ¹ý¸Ã·½·¨£¬²»¹ý²»ÐÒµÄÊÇһֱûÓгɹ¦£¬Èç¹ûÓжÁÕ߳ɹ¦¹ý£¬»¶Ó­Ö¸µ¼¡£ÔÚÕâÀ±ÊÕß²ÉÈ¡ÁËÒ»¸ö±äͨµÄ·½Ê½À´µ÷ÊÔ Jenkins Ô´´úÂë¡£

  1. ¼ì³ö jenkins-core ÏîÄ¿µ½±¾µØ£¬È»ºó import µ½ Eclipse ÖУ»
  2. ²Î¿¼ Jenkins ¹Ù·½²å¼þ¿ª·¢ÈëÃÅÎĵµ£¬ÔÚ Eclipse ÉÏн¨²å¼þÏîÄ¿£»
  3. ÔÚ jenkins-core ÏîÄ¿ÖÐÌí¼Ó¶Ïµã£»
  4. Ñ¡Ôñн¨µÄ²å¼þÏîÄ¿ÓÒ¼ü£¬Ñ¡Ôñ¡°Debug Configurations¡±£¬ÔÚ Source ÖÐÌí¼ÓµÚÒ»²½µÄ jenkins-core ÏîÄ¿£¬Èçͼ 4 Ëùʾ£º

ͼ 4. Debug Configurations ÖÐ Source µÄÅäÖÃ

Èç´ËÅäÖÃºó£¬Æô¶¯²å¼þÏîÄ¿£¬Õâʱ Eclipse »áÆô¶¯ Jenkins£¬Ö®ºó¾Í»á½øÈëµÚ 3 ²½ÉèÖõĶϵ㴦£¬ÈçÏÂͼËùʾ£º

ͼ 5. Jenkins-core µ÷ÊÔ

Ô´ÂëdzÎö

Jenkins ´úÂëµÄÈë¿ÚÊÇÈçͼ 5 ÓÒ±ßËùʾµÄ WebAppMain À࣬λÓÚ hudson(package) ÏÂÃæ¡£

Çåµ¥ 1. WebAppMain.java

package hudson;
...
public final class WebAppMain implements ServletContextListener {
...
public void contextInitialized(ServletContextEvent event) {
...
initThread = new Thread("hudson initialization thread") {
@Override
public void run() {
boolean success = false;
try {
Jenkins instance = new Hudson(home, context);
context.setAttribute(APP, instance);

// at this point we are open for business and serving requests normally
LOGGER.info("Jenkins is fully up and running");
success = true;
} catch (Error e) {
LOGGER.log(Level.SEVERE, "Failed to initialize Jenkins",e);
context.setAttribute(APP,new HudsonFailedToLoad(e));
throw e;
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failed to initialize Jenkins",e);
context.setAttribute(APP,new HudsonFailedToLoad(e));
} finally {
Jenkins instance = Jenkins.getInstance();
if(!success && instance!=null)
instance.cleanUp();
}
}
};
initThread.start();
...
}
...
public void contextDestroyed(ServletContextEvent event) {
terminated = true;
Jenkins instance = Jenkins.getInstance();
if(instance!=null)
instance.cleanUp();
Thread t = initThread;
if (t!=null)
t.interrupt();
}
..
}

ÓÉÒÔÉÏÇåµ¥¿ÉÒÔ¿´µ½£¬Àà WebAppMain ʵÏÖÁË ServletContextListener ½Ó¿Ú¡£¸Ã½Ó¿ÚµÄ×÷ÓÃÖ÷ÒªÊǼàÌý ServletContext ¶ÔÏóµÄÉúÃüÖÜÆÚ¡£µ± Servlet ÈÝÆ÷Æô¶¯»òÖÕÖ¹ Web Ó¦ÓÃʱ£¬»á´¥·¢ ServletContextEvent ʼþ£¬¸ÃʼþÓÉ ServletContextListener À´´¦Àí¡£´ËÍ⣬ServletContextListener ½Ó¿Ú»¹¶¨ÒåÁËÁ½¸ö·½·¨£¬contextInitialized ºÍ contextDestroyed¡£Í¨¹ý·½·¨Ãû£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÕâÁ½¸ö·½·¨ÖÐÒ»¸öÊÇÆô¶¯Ê±ºòµ÷Óà (contextInitialized)£¬Ò»¸öÊÇÖÕÖ¹µÄʱºòµ÷Óà (contextDestroyed)¡£

ÀàÖÐͨ¹ý contextInitialized ·½·¨³õʼ»¯ÁËÒ»¸ö Jenkins ¶ÔÏó¡£ÈçÇåµ¥ 1 Ëùʾ£¬ÔÚ Servlet ÈÝÆ÷³õʼ»¯µÄʱºò£¬Jenkins ¶ÔÏó»á½»ÓÉ WebAppMain µÄ initTread Ï̴߳´½¨¡£

²å¼þ·ÖÎö

Jenkins Ö§³ÖµÄ²å¼þÓкܶà (Çë²Î¿¼ Jenkins ²å¼þ½éÉÜ£¬Á˽â¾ßÌåÖ§³ÖµÄ²å¼þÀàÐÍ)¡£·ÖÎöÏÖÓвå¼þÔ´ÂëÊÇѧϰ Jenkins ²å¼þ¿ª·¢Ò»Öַdz£ºÃµÄ;¾¶£¬ËùÒÔÔÚ½éÉÜʵ¼Ê²å¼þ¿ª·¢Ö®Ç°£¬ÏÈÀ´·ÖÎöϱÊÕßʹÓùýµÄ Dynamic Jenkins Parameters ²å¼þ£¨¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔµ½ Jenkins ¹ÙÍøÉÏÏÂÔØÕâ¸ö²å¼þµÄÔ´´úÂ룩¡£

¸Ã²å¼þµÄÖ÷Òª×÷ÓÃÊÇÔÚ Jenkins ¹¹½¨Ò³ÃæÉÏÌṩÁËÒ»¸ö¶¯Ì¬²ÎÊý¡£Ã¿´Î¹¹½¨±»´¥·¢Ê±£¬²ÎÊýÖÐÅäÖÃµÄ Groovy ½Å±¾½«±»µ÷Ó㬶¯Ì¬Éú³É²ÎÊýÖµ¡£¸Ã²å¼þÖ§³ÖÁ½ÖÖÀàÐ͵IJÎÊý£º¼òµ¥µÄÎı¾ÊäÈë²ÎÊýºÍÏÂÀ­Ñ¡Ôñ¿ò²ÎÊý¡£Èç¹ûÊǼòµ¥Îı¾ÊäÈë¿ò²ÎÊý£¬Ôò Groovy ½Å±¾±ØÐë·µ»ØÒ»¸ö×Ö·û´®²ÅÄÜÔÚ¹¹½¨Ò³ÃæÕýÈ·ÏÔʾ¡£Èç¹ûÊÇÏÂÀ­Ñ¡Ôñ¿ò²ÎÊý£¬Ôò½Å±¾±ØÐë·µ»ØÒ»¸ö×Ö·û´®ÁÐ±í¡£

Çåµ¥ 2 ÁгöÁË Danymic Parameter ²å¼þÖÐÒ»¸ö·Ç³£ÖØÒªµÄÀà DanaymicParameter.java. ´ÓÕâ¸öÀà¿ÉÒÔ¿´µ½£¬Ëü¼Ì³ÐÁË ParameterDefinition Àà¡£ParameterDefinition ÊÇ Jenkins ÖеĹ¹½¨²ÎÊý¶¨ÒåÀ࣬ËùÓÐ Jenkins ¹¹½¨²ÎÊý²å¼þ¿ª·¢¶¼ÐèÒª¼Ì³ÐÕâ¸öÀà¡£

Çåµ¥ 2. DynamicParameter.java

public class DynamicParameter extends ParameterDefinition {
...
@Extension
public static final class DescriptorImpl extends ParameterDescriptor {
...
public ListBoxModel doFillValueItems(@QueryParameter String name) {
...
}
public ListBoxModel doFillDynamicValueItems(@QueryParameter String name,
@QueryParameter String value) {
...
}
}
...
}

ParameterDefinition Àà¶ÔÓ¦ÓÚ Jenkins ÅäÖà Job ʱµÄ Parameter Ñ¡Ïî¡£ÒòΪ DynamicParameter ¼Ì³ÐÁË ParameterDefinition£¬ËùÒԾͻáÔÚ Jenkins µÄ Job ÅäÖÃÒ³ÃæµÄ Add Parameter ÏÂÀ­¿òÖп´µ½Õâ¸ö²å¼þ£¬ÈçÏÂͼËùʾ£º

ͼ 6. Job ÅäÖÃ-Dynamic Parameter

ÎÒÃÇ¿´µ½ DynamicParameter ÀàÀïÃæÓиöÄÚ²¿ÀࣺDescriptorImpl¡£ÄÚ²¿ÀàÀïÃæÓÐÈçÇåµ¥ 2 ËùʾµÄ¼¸¸ö·½·¨ doFillValueItems ºÍ doFillDanymicValueItems¡£±ÊÕßÔÚµ÷ÊÔµÄʱºò·¢ÏÖ£¬µÚÒ»¸ö²ÎÊý Value µÄ¸Ä¶¯»á´¥·¢µÚ¶þ¸ö²ÎÊý DynamicValue Ñ¡ÏîµÄ±ä¶¯£¬ÎªÊ²Ã´»áÕâÑù£¿ÎªÊ²Ã´ DescriptorImpl ÄÚ²¿ÀàÖеķ½·¨Ãû±ØÐëÊÇ doFill+²ÎÊýÃû+Item µÄÐÎʽ£¿´ø×ÅÕâЩÎÊÌ⣬ÎÒÃǽÓÏÂÀ´¿´¿´ DynamicParameter ÖÐµÄ index.jelly Îļþ¡£

Çåµ¥ 3. Index.jelly

<f:entry title="${it.name} " description="${it.description}">
<div name="parameter" description="${it.description}">
<j:set var="instance" value="${it}" />
<j:set var="descriptor" value="${it.descriptor}" />

<input type="hidden" name="name" value="${it.name}" />
<input type="hidden" name="secondName" value="${it.secondName}" />

<f:select id="select1" field="value" default="" title="${it.name}" tooltip="${it.tips1}" /><br /> <br />

${it.secondName}<br /> <br />
<f:select id="select2" field="dynamicValue" title="${it.secondName}" tooltip="${it.tips2}" /><br />

</div>
</f:entry>

´ÓÕâ¸öÎļþÖпÉÒÔ¿´µ½£¬²ÎÊý value ºÍ dynamicValue µÄÀàÐÍÊÇ f:select£¬ËùÒÔÎÒÃÇÈ¥ÕÒ select.jelly¡£

Çåµ¥ 4. Select.jelly

${descriptor.calcFillSettings(field,attrs)}
<!-- this figures out the 'fillUrl' and 'fillDependsOn' attribute -->

´Ó select.jelly ÖлᷢÏÖµ÷Óà descriptor µÄ calcFillSettings ·½·¨£¬descriptor Æäʵ¾ÍÊÇ DynamicParameter µÄÄÚ²¿Àà DescriptorImpl¡£Í¨¹ý DescriptorImpl µÄ³éÏó¸¸Àà Descriptor ¿ÉÒÔÕÒµ½¶ÔÓ¦µÄ calcFillSettings ·½·¨£¬Çåµ¥ÈçÏ£º

Çåµ¥ 5. Descriptor.java

public void calcFillSettings(String field, Map<String,Object> attributes) {
String capitalizedFieldName = StringUtils.capitalize(field);
String methodName = "doFill" + capitalizedFieldName + "Items";
Method method = ReflectionUtils.getPublicMethodNamed(getClass(), methodName);
if(method==null)
throw new IllegalStateException(......);

// build query parameter line by figuring out what should be submitted
List<String> depends = buildFillDependencies(method, new ArrayList<String>());

if (!depends.isEmpty())
attributes.put("fillDependsOn",Util.join(depends," "));
attributes.put("fillUrl", String.format("%s/%s/fill%sItems",
getCurrentDescriptorByNameUrl(), getDescriptorUrl(), capitalizedFieldName));
}

ÓÉÇåµ¥ 5 ÎÒÃÇÒѾ­ÖªµÀΪʲô DescriptorImpl ÀàÖеķ½·¨Ãû±ØÐëÊÇ doFill+²ÎÊýÃû+Items µÄÐÎʽÁË¡£

²å¼þʵս

ѧϰÁË DanymicParameter Õâ¸ö¹¹½¨²ÎÊý²å¼þºó£¬½ÓÏÂÀ´ÎÒÃÇ¿ÉÒÔ³¢ÊÔ¿ª·¢Ò»¸ö Jenkins ²å¼þ¡£

ÐèÇóÃèÊö

¸ÃÏîÄ¿ÔÚ¹¹½¨ÖÐÐèÒªÈô¸É¸ö²ÎÊý£¨Jenkins µÄ´ø²Î¹¹½¨¿ÉÒÔʵÏÖ£©£¬ÆäÖÐÓÐЩ²ÎÊý´æÔÚÒÀÀµ¹ØÏµ£¬±ÈÈç˵ÓÐËĸö²ÎÊý£¬A¡¢B¡¢C ºÍ D¡£µ±²ÎÊý A Ñ¡Ôñij¸öÖµ£¬±ÈÈç Options1 ʱ£¬²ÎÊý B µÄÑ¡ÏîΪ [1, 2, 3]£¬Í¬Ê±²ÎÊý C ÏÔʾ£¬²ÎÊý D Òþ²Ø£»µ±²ÎÊý A Ñ¡Ôñ Option2 µÄʱºò£¬²ÎÊý B µÄÑ¡ÏîΪ [4, 5, 6]£¬Í¬Ê±²ÎÊý C Òþ²Ø£¬²ÎÊý D ÏÔʾ¡£

²å¼þ¿ª·¢

ͨ¹ýµ÷²é¿ÉÖª£¬Jenkins ÎÞ·¨ÊµÏÖÈçÉϵÄÐèÇó£¬Ò²ÕÒ²»µ½Ò»ÖÖÌæ´úµÄ·½·¨¡£ÓÚÊÇ£¬ÎÒÃDz»µÃ²»¿ª·¢×Ô¼ºµÄ²å¼þ£¬ÊµÏÖ¶Ô Jenkins µÄ¶¨ÖÆ»¯¡£ÁíÍ⣬ÎÒÃÇÒ²»á·¢ÏÖ²»Äܼòµ¥µÄͨ¹ýÉÏÃæÌáµ½µÄ²ÎÊý²å¼þµÄ·½Ê½À´ÊµÏÖÕâ¸öÐèÇó¡£Õâ¸öʱºòÎÒÃÇÐèÒªÉîÈëÁ˽âÏ Jenkins µÄ¹¹½¨Ô­Àí¡£

´ò¿ª Jenkins£¬Ð½¨Ò»¸ö²âÊÔ Job Test1¡£¿ÉÒÔ¿´µ½Ò³ÃæÖС°Á¢¼´¹¹½¨¡±µÄ URL£¬Èçͼ 7 µÄϲ¿×ÏÉ«ÇøÓòËùʾ£º

ͼ 7. Job-¹¹½¨

ͨ¹ýÉÏͼËùʾµÄ URL£¬ÎÒÃÇ¿ÉÒÔÕÒµ½¶ÔÓ¦µÄ³éÏóÀà-AbstractProject£¨ÔÚ package hudson.model ÏÂÃæ£©µÄ doBuild ·½·¨£¬ÈçÏ£º

Çåµ¥ 6. AbstractProject.java

public void doBuild( StaplerRequest req, StaplerResponse rsp, @QueryParameter
TimeDuration delay ) throws IOException, ServletException {
...
ParametersDefinitionProperty pp = getProperty(ParametersDefinitionProperty.class);
if (pp != null && !req.getMethod().equals("POST")) {
req.getView(pp, "index.jelly").forward(req, rsp);
return;
}
...
if (pp != null) {
pp._doBuild(req,rsp,delay);
return;
}
...
}

ͨ¹ýÇåµ¥ 6£¬»á·¢ÏÖͼ 7 ËùʾµÄ URL »á½»ÓÉ ParametersDefinitionProperty µÄ index.jelly ÏÔʾ¡£

²é¿´¸Ã jelly Îļþ·¢ÏÖËü»á±éÀúÿ¸ö ParameterDefinition£¨Í¨¹ýÉÏÃæÕ½ڵĽéÉÜ¿ÉÖª£¬Ã¿¸ö ParameterDefinition ʵ¼ÊÉϾÍÊÇÒ»¸ö¹¹½¨²ÎÊý£©£¬È»ºóÒ»Ò»ÏÔʾ¡£

ÎÒÃǻص½Êµ¼ÊÐèÇó£¬ÐèÇóÀïÃæÒªÇó¿ØÖƹ¹½¨²ÎÊý£¬ËùÒÔÎÒÃÇ¿ÉÒԼ̳РParametersDefinitionProperty£¬²¢Í¨¹ýÔÚ index.jelly ÖмÓÈë JS µÄ·½Ê½À´´ïµ½²ÎÊýÖ®¼äµÄÒÀÀµ¹ØÏµ¡£

¿ÉÒԲο¼ ʾÀý´úÂë https://github.com/qinganw/customize-parameter£¬Ð§¹û¼ûÏÂͼ¡£

ͼ 8. Customize Parameters-ÅäÖÃ

´Óͼ 8 ¿ÉÒÔ¿´µ½£¬ÎÒÃÇ¿ª·¢ÁËÒ»¸ö Jenkins ¹¹½¨²å¼þ£¬ÓÚÊÇÔÚ Job µÄÅäÖÃÒ³Ãæ¶àÁËÒ»¸öºì¿òÖбê¼ÇµÄÅäÖÃÏî¡£

ͼ 9. Customize Parameters-²ÎÊýÏî

ÏÖÔÚÎÒÃÇÅäÖà 4 ¸ö¹¹½¨²ÎÊý£¬·Ö±ðÊÇ PARAMONE, PARAMTWO, PARAMONEOne ºÍ PARAMONETwo¡£ÆäÖÐ PARAMONE ÓÐÈý¸öÑ¡ÏOne, Two ºÍ Three£»PARAMTWO ÓÐÁù×éÑ¡ÏOne:Apple, One:Banana, Two:Red, Two:Green, Three:Dog, Three:Cat¡£

µ± PARAMONE Ϊ One ʱ£¬PARAMTWO µÄÑ¡ÏîΪ Apple ºÍ Banana£¬Í¬Ê± PARAMONEOne ÏÔʾ£¬PARAMONETwo Òþ²Ø£»µ± PARAMONE Ϊ Two ʱ£¬PARAMTWO Ñ¡ÏîΪ Red ºÍ Green£¬Í¬Ê± PARAMONEOne Òþ²Ø£¬PARAMONETwo ÏÔʾ£»µ± PARAMONE Ϊ Three ʱ£¬PARAMTWO Ñ¡ÏîΪ Dog ºÍ Cat£¬Í¬Ê± PARAMONEOne ºÍ PARAMONETwo ¶¼Òþ²Ø¡£

ͼ 10. Customize Parameters-Ч¹ûչʾ 1

ͼ 11. Customize Parameters-Ч¹ûչʾ 2

ͼ 12. Customize Parameters-Ч¹ûչʾ 3

Óöµ½µÄÎÊÌâ

ʵ¼Ê¿ª·¢¹ý³ÌÖÐÓöµ½¹ý²»ÉÙÎÊÌ⣬ÒÔÏÂÁм¸¸ö±È½ÏµäÐ͵ģ¬Ï£ÍûÄܸø¶ÁÕßһЩ²Î¿¼¡£

²å¼þ°²×°ºó£¬ÔÚ Jenkins Ò³ÃæÕÒ²»µ½

Õâ¸öÎÊÌâ¾­³£»áÓöµ½£¬±ÊÕß²ÉÈ¡µÄ×ö·¨ÊÇɾ³ý plugin Ŀ¼Ï°²×°µÄ²å¼þ£¬Ò»°ã°üÀ¨Ò»¸öÒÔ²å¼þÃûÃüÃûµÄ jpi ÎļþºÍÎļþ¼Ð¡£È«²¿É¾³ýºó£¬»Øµ½ Eclipse£¬ÔËÐÐ mvn clean£¬Çå¿Õ´ò°ü¹ý³ÌÖвÐÁôµÄÎļþ£¬ÔÙÖØÐ´ò°ü°²×°¡£Õâ¸öʱºò¾ÍÄÜÔÚ Jenkins ÉÏÕÒµ½ÄãµÄ²å¼þÁË¡£

ÎÞ·¨ÔÚ¹¹½¨¹ý³ÌÖлñÈ¡²ÎÊýÖµ

Õâ¸öÎÊÌâÖ÷Òª·¢ÉúÔÚ¶¨ÖÆ»¯µÄ²ÎÊý²å¼þÖС£µ± Jenkins ¹¹½¨ Job Ò³ÃæÅäÖÃÍê×Ô¼º¿ª·¢µÄ²ÎÊý²å¼þºó£¬·¢ÏÖÓÐʱºòÎÞ·¨´Ó¹¹½¨½Å±¾»ñÈ¡²ÎÊýÖµ¡£³öÏÖÕâÖÖÎÊÌâÒ»°ãÓÐÁ½¸öÔ­Òò£º

  1. ¹¹½¨½Å±¾ÖÐûÓÐÒýÈëϵͳµÄ»·¾³±äÁ¿¡£Jenkins µÄËùÓй¹½¨²ÎÊýÔÚ¹¹½¨Ê±¶¼»á±»·ÅÈëϵͳµÄ»·¾³±äÁ¿ÖУ¬ËùÒÔ¹¹½¨½Å±¾ÐèÒªÒýÈëϵͳ»·¾³±äÁ¿£¬²ÅÄܶÁÈ¡¹¹½¨²ÎÊý¡£±ÈÈç²ÎÊýÃûΪ MyParameter£¬ÔòÎÒÃÇÐèÒªÔڽű¾ÖÐͨ¹ý<property environment="env" />ÒýÈë»·¾³±äÁ¿ÒÔºó£¬È»ºó²ÅÄÜͨ¹ý {env.MyParameter} ʹÓù¹½¨²ÎÊý£¬»òÕßÊÇÆäËû»·¾³±äÁ¿¡£
  2. ²å¼þ¿ª·¢Ê±Ã»ÓаѲÎÊý·ÅÈë»·¾³±äÁ¿¡£²ÎÊý²å¼þÖж¨ÒåµÄ²ÎÊýÖ»Òª±»¼ÓÈë»·¾³±äÁ¿£¬¹¹½¨¹ý³ÌÖÐͨ¹ý 1 Öеķ½·¨²ÅÄܶÁÈ¡²ÎÊýÖµ¡£¾ßÌåʵÏÖÇë²Î¿¼Çåµ¥ 7¡£

Çåµ¥ 6. AbstractProject.java

public void doBuild( StaplerRequest req, StaplerResponse rsp, @QueryParameter
TimeDuration delay ) throws IOException, ServletException {
...
ParametersDefinitionProperty pp = getProperty(ParametersDefinitionProperty.class);
if (pp != null && !req.getMethod().equals("POST")) {
req.getView(pp, "index.jelly").forward(req, rsp);
return;
}
...
if (pp != null) {
pp._doBuild(req,rsp,delay);
return;
}
...
}

¹¹½¨²ÎÊýÎÞ·¨ÑéÖ¤

Jenkins ËäȻ֧³Ö´ø²Î¹¹½¨£¬µ«ÊÇÈ´ÎÞ·¨ÑéÖ¤ËùÌî²ÎÊýµÄÕýÈ·ÐÔ£¬Òò´Ë¾­³£³öÏÖÒòΪÓû§Ìîд²ÎÊý²»ÕýÈ·¶øµ¼Ö¹¹½¨Ê§°ÜµÄÇé¿ö¡£ÎªÁËÌá¸ßÓû§ÌåÑé¸Ð£¬Í¬Ê±¼õÉÙ¹¹½¨Æ½¾ùʱ¼ä£¬±ÊÕßËùÔÚµÄÍŶÓÐèÒª¶Ô Jenkins ½øÐж¨ÖÆ£¬ÊµÏÖ²ÎÊýÑéÖ¤¹¦ÄÜ¡£

µ±Ê±¶Ô Jenkins »¹²»Ê죬½â¾öÕâ¸öÎÊÌ⻨Á˲»ÉÙʱ¼ä¡£×îºóͨ¹ýÑо¿ Jenkins Ô´Âë·¢ÏÖ£¬Æäʵ Jenkins µÄ¹¹½¨¹¦ÄÜÒ²ÊÇÒ»¸ö²å¼þ£¬¼ÈÈ»Èç´Ë£¬ÄÇÎÒÃÇ¿ÉÒÔ¶¨ÖÆÒ»¸ö¹¹½¨²å¼þ£¬ÔÚÕâ¸ö²å¼þµÄ index.jelly ÖÐÒýÈë JS ´úÂëʵÏÖ²ÎÊýÑéÖ¤¡£

ä¯ÀÀÆ÷¼æÈÝ

Jenkins ±¾Éí¶Ô Chrome ºÍ Firefox µÄ¼æÈÝÐԱȽϺ㬶ø¶Ô IE µÄ¼æÈÝÐÔÔò½Ï²î¡£±ÊÕßÔÚ¶¨ÖÆ Jenkins µÄ¹ý³ÌÖУ¬Ò²ÉîÊÜä¯ÀÀÆ÷¼æÈÝÎÊÌâÀ§ÈÅ¡£

ÓÉÓÚ×î³õ¿ª·¢Ê¹ÓõÄÊÇÔ­ÉúµÄ JS£¬Ã»Óл¨¶àÉÙ¾«Á¦´¦Àíä¯ÀÀÆ÷¼æÈÝÎÊÌ⣬µ¼ÖÂËùÓÐÓû§Ö»ÄÜʹÓÃij¸öä¯ÀÀÆ÷£¬¸øÓû§Ôì³ÉÒ»¶¨³Ì¶ÈµÄ²»±ã¡£ºóÀ´¾­¹ýÑо¿·¢ÏÖ£¬Jenkins ±¾ÉíʹÓõÄÊÇ jQuery ¿ò¼Ü¡£Èç´Ë£¬ÎÒÃÇÔÚʵ¼Ê¿ª·¢ÖУ¬¿ÉÒÔʹÓøÿò¼Ü£¬¾Í²»ÓÃ×Ô¼º»¨´óÁ¿Ê±¼äºÍ¾«Á¦ÓÃÔ­Éú JS À´½â¾öä¯ÀÀÆ÷ÎÊÌâ¡£

×ܽá

±¾ÎÄ´Ó Jenkins ¸ÅÊö¿ªÊ¼£¬½éÉÜÁË Jenkins µÄ¼Ü¹¹£¬Í¨¹ý¼Ü¹¹µÄÃèÊö£¬ÏàÐŶÁÕß¶Ô Jenkins ÓÐÁË»ù±¾µÄÈÏʶºÍÀí½â¡£½Ó×űÊÕß½éÉÜÁË Jenkins µÄµ÷ÊÔ·½·¨£¬¼òµ¥½éÉÜÁË Jenkins ´úÂëµÄÈë¿Ú£¬¶ÁÕß¿ÉÒÔ´ÓÕâÀ↑ʼ£¬ÉîÈëÁ˽â Jenkins ÀïÃæµÄÄ£¿éºÍÄÚÈÝ¡£È»ºó±ÊÕßͨ¹ý·ÖÎö Dynamic Parameter ²å¼þµÄÁ÷³Ì£¬½áºÏ±ÊÕßµÄʵ¼ÊÏîÄ¿£¬¿ª·¢Á˲å¼þ Customze Parameters¡£×îºóÁоÙÁ˼¸¸öÔÚ Jenkins ¿ª·¢¹ý³ÌÖÐÓöµ½µÄ±È½ÏµäÐ͵ÄÎÊÌâºÍ´¦Àí°ì·¨¹©¶ÁÕ߲ο¼¡£Jenkins ²å¼þ¿ª·¢Ô¶²»Ö¹ÕâЩÄÚÈÝ£¬Ï£ÍûÔÚ½øÒ»²½µÄѧϰºÍÓ¦ÓÃÖÐÄܼÌÐøÓë´ó¼Ò·ÖÏí¡£

×îºó£¬Ìرð¸ÐлÍôÇå°²¡£ËûÔÚ IBM ʵϰÆÚ¼ä£¬Ôø°ïÖúÎÒÃÇÍŶӻ¨Ê±¼äÑо¿ Jenkins ²å¼þ¿ª·¢¡£ÎÄÖÐһЩ¹ÛµãºÍ½áÂ۵ĵóö£¬Àë²»¿ªËûµÄÐÁÇÚŬÁ¦¡£

   
4848 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ