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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Python ÔÚ Linux ÉÏʵÏÖÒ»¼ü»Ø¹é²âÊÔ
 
×÷Õß ¶¡³¯½Ü£¬Í¿²¨,ÕÔÑÇÀö,»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-06-12
 

ÔÚ Linux ƽ̨ÉϽøÐдóÐÍÏîÄ¿¿ª·¢¹ý³ÌÖУ¬²âÊÔÈËÔ±ÐèÒª¶¨ÆÚ£¨Í¨³£ÊÇÿÌ죩£¬´Ó´úÂë¿âÖиüдúÂë¡¢±àÒë°æ±¾¡¢ÔËÐÐÈ«²¿²âÊԽű¾¡¢ÊÕ¼¯²¢·¢²¼²âÊÔ½á¹û¡£Õâ¸ö¹ý³Ì¼È·±ËöÓÖºÄʱ¡£Í¨³£ÎÒÃÇÏ£ÍûÄÜÔÚϰàºóÄÜ×Ô¶¯Íê³ÉÕâһϵÁвÙ×÷£¬±¾ÎĽ«½²ÊöÈçºÎÀûÓà Python ½Å±¾ÇáËÉʵÏÖÕâÒ»¹ý³Ì¡£

´Ó´úÂë¿âǨ³ö´úÂë ---- pexpect µÄʹÓÃ

²âÊÔÈËÔ±´Ó´úÂë¿â£¨ÀýÈç CVS £©Ç¨³ö´úÂëµÄ¹ý³ÌÖУ¬ÐèÒªÊÖ¶¯ÊäÈë·ÃÎÊÃÜÂ룬¶ø Python ÌṩÁË Pexpect Ä£¿éÔòÄܹ»½«ÊÖ¶¯ÊäÈëÃÜÂëÕâÒ»¹ý³Ì×Ô¶¯»¯¡£µ±È» Pexpect Ò²¿ÉÒÔÓÃÀ´ºÍ ssh¡¢ftp¡¢passwd¡¢telnet µÈÃüÁîÐнøÐÐ×Ô¶¯»¯½»»¥¡£ÕâÀïÎÒÃÇÒÔ CVS ΪÀýչʾÈçºÎÀûÓà Pexpect ´Ó´úÂë¿âǨ³ö´úÂë¡£

Çåµ¥ 1. Óà pexpect Ǩ³ö´úÂë¿â´úÂë

try:
chkout_cmd = 'cvs co project_code' #´Ó´úÂë¿âǨ³ö project_code µÄÄÚÈÝ
child = pexpect.spawn(chkout_cmd)
child.expect('password:')
child.sendline('your-password') #ÇëÌæ»»"your-password"ÎªÕæÊµÃÜÂë
child.interact()
except:
pass #ºöÂÔǨ³ö´úÂëÖеĴíÎó

ÔÚÇåµ¥ 1 ÖУ¬ÎÒÃÇÓÃÃüÁî"cvs co project_code"´Ó´úÂë¿âÖÐǨ³öÁË project_code µÄÄÚÈÝ£¬ÎÒÃÇÒ²¿ÉÒÔÓøÃÃüÁîÀ´¸üÐÂÒѾ­Ç¨³öµÄ´úÂë¡£Ö»ÐèÒª½«ÃüÁî"cvs update" ´«¸øÀà pexpect.spawn()¼´¿É£¬ÏêϸµÄʵÏÖÇë²Î¿¼´úÂëÎļþ¡£ÕâÀï interact()º¯ÊýÊDZØÐëµÄ£¬ÓÃÀ´ÔÚ½»»¥µÄ·½Ê½Ï¿ØÖƸÃ×Ó½ø³Ì¡£ÓÐʱ´úÂë¿âÖÐ»á´æÔÚĿ¼²»Ò»ÖÂÐÐÇé¿ö£¬Ç¨³ö´úÂë»áÒò±¨´íÖÕÖ¹£¬ËùÒÔÐèÒªÒì³£´¦Àí(try ... execpt)À´ºöÂԸôíÎó¡£

±àÒë´úÂëºÍÔËÐвâÊԽű¾ ---- subprocess µÄʹÓÃ

²âÊÔÈËÔ±»ñÈ¡×îеĴúÂëÖ®ºó£¬¾ÍÒª¶ÔÔ´Âë½øÐбàÒ룬²¢ÇÒÔËÐвâÊÔÓÃÀý¡£Python ÓïÑÔÌṩÁ˶àÖÖ·½·¨Èç os.system()/os.popen()À´Ö´ÐÐÒ»ÌõÃüÁÕâÀïÎÒÃÇÍÆ¼öÓà subprocess Ä£¿éÀ´´´½¨×Ó½ø³Ì£¬Íê³É´úÂë±àÒëºÍÔËÐвâÊÔÓÃÀý¡£ÒòΪ subprocess Ö§³ÖÖ÷½ø³ÌºÍ×Ó½ø³ÌµÄ½»»¥£¬Í¬Ê±Ò²Ö§³ÖÖ÷½ø³ÌºÍ×Ó½ø³ÌÊÇͬ²½Ö´Ðл¹ÊÇÒì²½Ö´ÐС£ÓÉÓÚ±¾ÎÄÖеĸ÷¸ö¹¦ÄÜÄ£¿éÓж¼ÏȺóÒÀÀµ¹ØÏµ£¬ËùÒÔÈ«²¿²ÉÓõÄÊÇÖ÷½ø³ÌºÍ×Ó½ø³Ìͬ²½Ä£Ê½Ö´ÐС£

±àÒë´úÂë

Çåµ¥ 2. Óà subprocess ±àÒë´úÂë

build_cmd = 'build_command_for_your_code' #ÇëÔÚÕâÀïÅäÖñàÒëÃüÁî
build_proc = subprocess.Popen(build_cmd, stdin=None, stdout=None, stderr=None, shell=True)
build_proc.wait() #µÈ´ý×Ó½ø³Ì½áÊø
assert (0 == build_proc.returncode)

ÔÚһЩϵͳÖÐÎÒÃDZàÒë´úÂë²ÉÓõÄÊǽű¾Îļþ£¨Èç shell ½Å±¾£©£¬ÄÇôÎÒÃÇÈÔÈ»¿ÉÒÔÈçÏÂÃüÁîÀ´Íê³É´úÂë±àÒ빤×÷¡£

Çåµ¥ 3. Óà subprocess µÄ call º¯ÊýÖ´Ðнű¾Îļþ

 subprocess.call(["code_compile.sh"])

ÔËÐвâÊԽű¾

ÔÚ±àÒëÍê³É´úÂëÖ®ºó£¬ÎÒÃÇͬÑù¿ÉÒÔµ÷Óà subprocess.Popen À´´´½¨×Ó½ø³ÌÔËÐвâÊÔÓÃÀý¡£Èç¹û²âÊÔÈËÔ±µÄ²âÊÔÓÃÀýÒѾ­Ð´³ÉÁ˲âÊÔÀý½Å±¾£¬ÎÒÃÇÔò¿ÉÒÔÓà subprocess.call()À´Ö´ÐвâÊÔÀý½Å±¾Îļþ£¬´úÂëʵÏ־Ͳ»ÔÙ׸Êö¡£ÓÐЩϵͳ»áÖ±½Ó°ÑÏêϸÈÕÖ¾Êä³öµ½ÆÁÄ»ÉÏ£¬ÄÇôÎÒÃÇ¿ÉÒÔÓÃÖØ¶¨ÏòÃüÁî"2>&1"°ÑÆÁÄ»Êä³öдÎļþ¡£

Çåµ¥ 4. ÓÃÖØ¶¨ÏòÃüÁî°ÑÊä³öдÎļþ

ut_cmd = 'Your_unit_test_command  2>&1 > 
%s' %self.debug_log #debug_log ¶¨ÒåÔÚ__init__º¯ÊýÖУ¬ÓÃÀ´´æ´¢ÏêϸÈÕÖ¾

²âÊÔ½á¹û´æ´¢ºÍ·¢²¼ ---- XML ½âÎö

ÎÒÃǵÄÏîÄ¿²ÉÓÃÃô½Ý¿ª·¢£¬ÎªÁ˸üºÃµÄ·´Ó¦Ãô½Ý¿ª·¢ÖÜÆÚ£¬ÎÒÃÇÏ£Íû´æ´¢ÈÕÖ¾µÄĿ¼Ãû²»µ«Äܹ»Ö¸Ã÷µÄ¾ßÌåÈÕÆÚ£¬Í¬Ê±Ò²ÄÜ·´Ó³Ãô½Ý£¨µü´ú£©¿ª·¢½×¶Î£¬ÕâÑùÏà¹ØÈËÔ±Ôڲ鿴ÏàӦĿ¼ÖеÄÈÕ־ʱ£¬Äܹ»Çå³þµÄÃ÷°×ÈÕ־ʵÔÚÔÚÄĸöµü´úÖÜÆÚµÄÄÄÒ»Ìì²úÉúµÄ¡£±¾ÎÄʹÓÃÎļþ summary ×÷ΪÔËÐвâÊÔÓÃÀýºóÉú³ÉµÄ»ã×ÜÈÕÖ¾£¬ÓÃÎļþ log.txt ÓÃÀ´´æ´¢ÏêϸÈÕÖ¾¡£ÈçÏÂͼËùʾ£¬ÔÚ¹²ÏíĿ¼ SharedFiles Öд洢ÁËһЩÁеü´úÖÜÆÚÖеÄÈÕÖ¾¡£

Çåµ¥ 5. ¹²ÏíĿ¼½á¹¹

SharedFiles
©À©¤©¤ Sprint10-20130823121500
©¦ ©À©¤©¤ log.txt
©¦ ©¸©¤©¤ summary
©À©¤©¤ Sprint10-20130826152715
©¦ ©À©¤©¤ log.txt
©¦ ©¸©¤©¤ summary
©À©¤©¤ Sprint10-20130828165235

ΪÁËÄܹ»ÈÃĿ¼Ãû·´Ó³Ãô½Ý¿ª·¢ÖÜÆÚ£¬ÎÒÃÇÐèÒª×Ô¼º¶¨ÒåÒ»¸öÅäÖÃÎļþ£¨txt »ò xml ¾ù¿É£©¡£ÓÉÓÚ Python ÒѾ­ºÜºÃµÄÖ§³ÖÁË XML ½âÎö£¬²¢ÇÒ XML Îļþ×÷ΪÅäÖÃÒ²Êǵ±Ç°µÄÁ÷ÐÐÇ÷ÊÆ¡£±¾ÎľÍÒÔ XML ½âÎöΪÀý½øÐÐ˵Ã÷¡£±¾ÎÄʹÓÃµÄ XML ÎļþÃûÊÇ Sprint.xml£¬Çåµ¥ 6 ÊǸà xml µÄ¸ÅÒªÄÚÈÝ

Çåµ¥ 6. Sprint.xml Îļþ½á¹¹

<sprint-schedule>
<min-sprint>10</min-sprint>
<max-sprint>20</max-sprint>
<sprint10>20130814</sprint10>
<sprint11>20130828</sprint11>
¡­ ¡­
<sprint19>20131218</sprint19>
<sprint20>20140101</sprint20>
</sprint-schedule>

¹ØÓÚ xml ½âÎö Python ÌṩÁ˶àÖÖ·½·¨¡£±¾ÎIJÉÓà minidom ¶Ô xml Îļþ½øÐнâÎö£¬Çåµ¥ 7 ÊÇÏà¹Ø´¦Àí´úÂë¡£

Çåµ¥ 7. xml ½âÎö´úÂë

cur_date = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) # Ê×ÏÈ»ñÈ¡µ±Ç°ÏµÍ³ÈÕÆÚ

xmldoc = minidom.parse(xml_file)
min_num_node = xmldoc.getElementsByTagName('min-sprint')[0]
min_num = int(min_num_node.firstChild.data) #½âÎö³öµü´ú¿ª·¢ÖÜÆÚµÄÆðʼÖÜÆÚ

max_num_node = xmldoc.getElementsByTagName('max-sprint')[0]
max_num = int(max_num_node.firstChild.data) #½âÎö³öµü´ú¿ª·¢ÖÜÆÚµÄÖÕÖ¹ÖÜÆÚ

cur_num = min_num
#±éÀúËùÓеü´úÖÜÆÚ£¬È¡³öµ±Ç°µü´úÖÜÆÚµÄ¿ªÊ¼Ê±¼äºÍµ±Ç°µÄϵͳʱ¼ä¶Ô±È£¬´Ó¶øÈ·¶¨µ±Ç°Î»ÓÚÄÄÒ»¸öµü´úÖÜÆÚ¡£
while cur_num <= max_num :
node_name = 'sprint' + str(cur_num)
cur_node = xmldoc.getElementsByTagName(node_name)[0]
sprint_date = cur_node.firstChild.data
if sprint_date < cur_date[0:7]:
cur_num = cur_num + 1
else:
break

ÕâÑù cur_num ¾ÍÖ¸ÏòÁ˵±Ç°µÄµü´ú¿ª·¢ÖÜÆÚ¡£È»ºó£¬ÎÒÃǾͿÉÒÔ¸ù¾Ýµ±Ç°ÈÕÆÚºÍ¿ª·¢½×¶Î´´½¨¶ÔÓ¦µÄÈÕ־Ŀ¼ÃûÁË£¬×îºó°ÑÔËÐнá¹û´æ´¢µ½¸ÃĿ¼Ï£¬²Î¼ûÇåµ¥ 8 ʵÏÖ¡£

Çåµ¥ 8. ÈÕÖ¾´æ´¢´úÂë

log_dir = self.share_dir + '/Sprint' + str(cur_num) + '-' + cur_date #share_dir Ϊ¹²ÏíĿ¼£¬¶¨ÒåÔÚ³õʼ»¯º¯ÊýÖÐ
os.mkdir(log_dir)
os.system('mv %s %s' %(self.debug_fullname, log_dir)) #debug_fullname£¬ÏêϸÈÕÖ¾ÎļþÃû£¨º¬Ä¿Â¼£©£¬¶¨ÒåÔÚ³õʼ»¯º¯ÊýÖÐ
os.system('mv %s %s' %(self.sum_fullname, log_dir)) #sum_fullname£¬»ã×ÜÈÕÖ¾µÄȫ·¾¶ÎļþÃû£¬¶¨ÒåÔÚ³õʼ»¯º¯ÊýÖÐ

¹ØÓÚ²âÊÔ½á¹ûµÄ·¢²¼£¬±¾ÎIJ¢Ã»ÓаѲâÊÔ½á¹ûÒÔ×Ô¶¯»¯µÄÐÎʽ·¢ËÍÓʼþ£¬¶øÊÇÊÖ¶¯ÔÚÿ¸ö¿ª·¢ÖÜÆÚ½áÊøÊ±£¬Èº·¢Óʼþ¸øÏà¹ØÈËÔ±¡£»òÕßÔÚÑé֤ʧ°Üºó£¬Í¨ÖªÏà¹ØµÄ¿ª·¢ÈËÔ±£¬ÕâÊÇÓÉÓÚ×÷ÕßËùÔÚÍŶÓÏîÄ¿´úÂëÌύƵÂʲ»ÊǺܸߡ£ÔÚ¸ü´óÐ͵ÄÏîÄ¿ÖУ¬ÍùÍùÐèÒªÔö¼Ó×Ô¶¯·¢ËÍÓʼþµÄ¹¦ÄÜ£¬Ïà¹ØÊµÏÖ±¾ÎIJ»ÔÙ׸Êö¡£

Ҳ̸½çÃæÉè¼Æ ---- getopt µÄʹÓÃ

ÔÚÈÕ³£µÄ²âÊÔ¹ý³ÌÖУ¬ÎÒÃDz¢²»ÊÇÿ´Î¶¼ÒªÇ¨³ö´úÂ룬±àÒë´úÂ룬ÔËÐвâÊÔÓÃÀýºÍÊÕ¼¯²âÊÔ½á¹û¡£ÕâÑù¾ÍÐèÒªÎÒÃÇÄܹ»ÓÐÑ¡ÔñµÄÔËÐв¿·Ö³ÌÐò¹¦ÄÜ£¬ÀýÈçÖ»ÔËÐвâÊÔÓÃÀýºÍÊÕ¼¯½á¹û¡£ÕâÀïÎÒÃÇÌṩÁË 4 ¸öÔËÐÐÑ¡Ôó£º

Ñ¡Ïî 1£ºÇ¨³ö´úÂë-->±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û

Ñ¡Ïî 2£º¸üдúÂë-->±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û

Ñ¡Ïî 3£º±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û

Ñ¡Ïî 4£ºÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û

µ±È»ÎÒÃÇ»¹ÐèÒªÌṩ°ïÖúÐÅÏ¢£¬ÒÔ·½±ã²»ÊìϤ¸Ã½Å±¾ÊµÏÖµÄÈËԱʹÓá£python Ò²ÌṩÁË getopt Ä£¿éÈÃÎÒÃÇÇáËÉʵÏÖÉÏÊö¹¦ÄÜ¡£ÊµÏÖ´úÂë²Î¼ûÇåµ¥ 9

Çåµ¥ 9. ÃüÁîÐÐд½âÎö´úÂë

try:
opts, args = getopt.getopt(sys.argv[1:], 'bchu', ['build', 'checkout', 'help', 'update'])
except getopt.error, msg:
self.usage()
sys.exit(2)

build_flag = 0 #¹¹½¨Ñ¡Ïî
for o, a in opts:
if o in ('-h', '--help'):
self.usage()
sys.exit()
elif o in ('-c', '--checkout'):
print "Ö´ÐвÙ×÷£ºÇ¨³ö´úÂë-->±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û"
build_flag = 1
break
elif o in ('-u', '--update'):
print "Ö´ÐвÙ×÷£º¸üдúÂë-->±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û"
build_flag = 2
break
elif o in ('-b', '--build'):
print "Ö´ÐвÙ×÷£º±àÒë°æ±¾-->ÔËÐвâÊÔÓÃÀý-->ÊÕ¼¯²âÊÔ½á¹û"
build_flag = 3
break
else:
self.usage()
sys.exit()
if (0 == build_flag) :
if 2 <= len(sys.argv):
self.usage()
sys.exit()

raw_input('\n °´ Enter ¼ü¼ÌÐø¡£¡£¡£(Ctrl+C Í˳ö)\t')

if (1 == build_flag) : #Ǩ³ö´úÂ룬²¢±àÒë´úÂë
self.checkout_code()
self.build_code()
elif (2 == build_flag) : #¸üдúÂ룬²¢±àÒë´úÂë
self.update_code()
self.build_code()
elif (3 == build_flag) : #±àÒë´úÂë
self.build_code()

#ÔËÐвâÊÔÓÃÀý²¢ÊÕ¼¯ÔËÐнá¹û
self.set_python()
self.run_testsuite()
self.store_logs()

Èç¹ûÎÒÃÇÔÚÔËÐеĹý³ÌÖÐÏëÖжϣ¨ÈçÀûÓà Ctrl+C£©Ò»¼ü»Ø¹é²âÊÔ½ø³ÌµÄÖ´ÐÐʱ£¬ÓÐʱÎÒÃǻᷢÏÖËäÈ»Ö÷½ø³ÌÒѾ­±»ÖÕÖ¹£¬µ«×Ó½ø³ÌÈÔÔÚÔËÐС£ÎÒÃÇÄÜ·ñÔÚÖжÏÖ÷½ø³ÌµÄͬʱҲÖжÏ×Ó½ø³ÌÄØ£¿´ð°¸µ±È»Êǿ϶¨µÄ£¬ÎÒÃÇ¿ÉÒÔÓÃÐźŴ¦Àíº¯Êý²¶»ñÐźţ¨Èç²¶»ñ Ctrl+C ²úÉúµÄÖжÏÐźţ©£¬È»ºóÔÚÏÔʽÖÕÖ¹¶ÔÓ¦µÄ×Ó½ø³Ì¡£ÕâÀï¾ÍÐèÒªÎÒÃÇÔÚ´´½¨×Ó½ø³ÌµÄʱºò£¬Ïȱ£´æ×Ó½ø³Ì ID£¬µ±È»°Ñ×Ó½ø³Ì ID ±£´æµ½³õʼ»¯º¯ÊýÖУ¬ÊǸö²»´íµÄÑ¡Ôñ£¬Çåµ¥ 10 ÊÇÏà¹ØÊµÏÖ¡£

Çåµ¥ 10. ÐźŴ¦Àí´úÂë

# ÖÕÖ¹×Ó½ø³ÌµÄÔËÐÐ
def handler(self, signum, frame):
if (-1 != self.subproc_id) : #subproc_id ¶¨ÒåÔÚ³õʼ»¯º¯ÊýÖУ¬ÓÃÀ´´æ´¢µ±Ç°×Ó½ø³ÌµÄ ID
os.killpg(self.subproc_id, signal.SIGINT)
sys.exit(-1)

ÕâÀïÎÒÃÇÐèÒªÔÚ³õʼ»¯º¯ÊýÖÐ×¢²áÒª²¶»ñµÄÐźţ¬²¢ÇÒ´´½¨³ÉÔ±±äÁ¿ÓÃÀ´±£´æ×Ó½ø³ÌµÄ ID£¬ÏêϸʵÏÖÇë²Î¼ûÇåµ¥ 11¡£

»ùÓÚ¶ÔÏóµÄÉè¼Æ ---- class µÄʹÓÃ

×îºóÖÕÓÚÂÖµ½ class µÇ³¡ÁË£¬Ìáµ½ class ÎÒÃǾͲ»Äܲ»Ì¸¹¹Ô캯Êý£¨³õʼ»¯º¯Êý£©ºÍÎö¹¹º¯Êý¡£Ö®Ç°ÎÒÃǶà´ÎÌáµ½³õʼ»¯º¯Êý£¬³õʼ»¯º¯ÊýÔÊÐíÎÒÃǶ¨ÒåһЩ±äÁ¿£¬ÕâЩ±äÁ¿ÔÚÕû¸öÀà¶ÔÏóµÄÉú´æÖÜÆÚÄÚ¾ùÓÐЧ¡£ÓÉÓÚ±¾ÎÄûÓÐÏòϵͳÉêÇë×ÊÔ´£¬¾ÍÔÙ²»¶¨ÒåÎö¹¹º¯ÊýÁË¡£

Çåµ¥ 11. ³õʼ»¯´¦Àí´úÂë

def __init__(self):
signal.signal(signal.SIGINT, self.handler) #×¢²áÐèÒª²¶»ñµÄÐźÅÁ¿
self.myafs_dir = os.getenv('myafs')
self.subproc_id = -1 #×Ó½ø³Ì ID£¬ÓÃÀ´ÔÚÖÕÖ¹Ö÷½ø³ÌʱҲͬʱÖÕÖ¹×Ó½ø³Ì
self.debug_log = 'log.txt' #´æ´¢ÏêϸÔËÐÐÈÕÖ¾µÄÎļþÃû
self.debug_fullname = os.getcwd() + os.sep + self.debug_log #ȫ·¾¶ÎļþÃû£¨¼ÙÉè²úÉúÔÚ¸ÃĿ¼Ï£©
self.sum_log = 'summary' #´æ´¢»ã×ÜÈÕÖ¾µÄÎļþÃû
self.sum_fullname = os.getcwd() + os.sep + self.sum_log #ȫ·¾¶ÎļþÃû£¨¼ÙÉè²úÉúÔÚµ±Ç°Ä¿Â¼Ï£©
self.share_dir = self.utafs_dir + '/SharedFiles' #¹²ÏíĿ¼ÎļþÃû

ͨ³£ÎÒÃDz»ÐèҪ̫¹Ø×¢Éè¼Æ·ç¸ñ£¬Ö»Òª Python ½Å±¾ÄÜÍê³ÉÎÒÃǵIJâÊÔÒªÇó¼´¿É¡£¶ÔÓÚ½ÏСµÄ½Å±¾£¬¼¸Ìõ Python Ö¸Áî˳ÐòÖ´Ðм´¿É¡£ÎªÁËÄ£¿é¹¦Äܸ´ÓúͿɶÁÐÔ£¬ÎÒÃÇͨ³£»á°Ñ¹¦ÄÜÄ£¿é·â×°³Éº¯Êý¡£±¾ÎĽ«ÊµÏÖµÄËùÓк¯Êý¶¼·â×°µ½Ò»¸öÀàÖУ¬Ê¹µÃ¸Ã½Å±¾¸ü¼ÓÒ»Ì廯¡£

Çåµ¥ 12. class ¿ò¼Ü½á¹¹´úÂë

class COneClickRegTest:
#É趨һЩ¾­³£Ê¹ÓõıäÁ¿£¬È統ǰ¹¤×÷Ŀ¼£¬ÈÕÖ¾Ãû³Æ¡¢´æ´¢Â·¾¶µÈ
def __init__(self):

#É趨 python »·¾³±äÁ¿£¬ÊµÏֲμû´úÂëÎļþ
def set_python(self):

#¸üдúÂ룬ʵÏֲμû´úÂëÎļþ
def update_code(self):

#Ǩ³ö´úÂ룬ʵÏֲμûµÚ 2 Õ´úÂë
def checkout_code(self):

#±àÒë°æ±¾£¬ÊµÏֲμûÇåµ¥ 1 ´úÂë
def build_code(self):

#ÔËÐвâÊÔ¼¯£¬ÊµÏֲμû´úÂëÎļþ
def run_testsuite(self):

#´æ´¢ÔËÐнá¹û£¬ÊµÏֲμûÇåµ¥ 7 ºÍÇåµ¥ 8 ´úÂë
def store_logs(self):

#ÐźŴ¦Àí£¬ÊµÏֲμûÇåµ¥ 10 ´úÂë
def handler(self, signum, frame):

#½Å±¾Ê¹ÓÃ˵Ã÷£¬ÊµÏֲμû´úÂëÎļþ
def usage(self):

#ÃüÁîÐнâÎöÒÔ¼°Ö´ÐжÔÓ¦µÄ¹¦ÄÜ£¬ÊµÏֲμûÇåµ¥ 9 ´úÂë
def main(self):

½áÊøÓï

Python ÓïÑÔÊÇÒ»¸öÒ×ѧÒ×ÓõĽű¾ÓïÑÔ£¬±ÊÕßûÓжà¾ÃµÄ Python ¿ª·¢¾­Ñ飬²»¹ýÆäËûÓïÑÔÓеŦÄÜÔÚ Python Öд󶼿ÉÒÔÕÒµ½¶ÔÓ¦µÄʵÏÖ£¬ÕâÒ²ÊDZÊÕßÄܹ»Ôں̵ܶÄʱ¼äÄÚÍê³É¸Ã²âÊԽű¾µÄÔ­Òò¡£Òò´Ë£¬±ÊÕ߰ѸÃÓïÑÔºÍʹÓøÃÓïÑÔÍê³ÉÒ»¼ü»Ø¹é²âÊÔ½éÉܸø´ó¼Ò£¬Ï£Íû¶Ô´ó¼ÒÓÐËù°ïÖú¡£ÕýÏñ±ÊÕß˵µÄÆäËûÓïÑÔÓеŦÄÜÔÚ Python Öд󶼿ÉÒÔÕÒµ½¶ÔÓ¦µÄʵÏÖ£¬Í¬Ñù£¬Èç¹û´ó¼Ò¶ÔijһÖÖÌØ¶¨µÄ½Å±¾ÓïÑÔ»òÕß¿ª·¢ÓïÑÔÌØ±ðÊìϤ£¬Ò²ÍêÈ«¿ÉÒÔ²ÉÓÃËùÊìϤµÄÓïÑÔÀ´Íê³ÉÒ»¼ü»Ø¹é²âÊԵŤ×÷¡£

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

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù


LoadRunnerÐÔÄܲâÊÔ»ù´¡
Èí¼þ²âÊÔ½á¹û·ÖÎöºÍÖÊÁ¿±¨¸æ
ÃæÏò¶ÔÏóÈí¼þ²âÊÔ¼¼ÊõÑо¿
Éè¼Æ²âÊÔÓÃÀýµÄËÄÌõÔ­Ôò
¹¦ÄܲâÊÔÖйÊÕÏÄ£Ð͵Ľ¨Á¢
ÐÔÄܲâÊÔ×ÛÊö


ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
²âÊÔ¹ý³ÌÓëÍŶӹÜÀí
LoadRunner½øÐÐÐÔÄܲâÊÔ
WEBÓ¦ÓõÄÈí¼þ²âÊÔ
ÊÖ»úÈí¼þ²âÊÔ
°×ºÐ²âÊÔ·½·¨Óë¼¼Êõ


ij²©²ÊÐÐÒµ Êý¾Ý¿â×Ô¶¯»¯²âÊÔ
IT·þÎñÉÌ Web°²È«²âÊÔ
IT·þÎñÉÌ ×Ô¶¯»¯²âÊÔ¿ò¼Ü
º£º½¹É·Ý µ¥Ôª²âÊÔ¡¢Öع¹
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀý·ÖÎö
»¥ÁªÍøweb²âÊÔ·½·¨Óëʵ¼ù
»ùÓÚSeleniumµÄWeb×Ô¶¯»¯²âÊÔ