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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
pipeline ʹÓÃÖ®Óï·¨Ïê½â
 
  9640  次浏览      27
 2018-2-1 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚYatHo,Jenkins 2.0µÄµ½À´£¬pipline½øÈëÁËÊÓÒ°£¬jenkins2.0µÄºËÐÄÌØÐÔ. Ò²ÊÇ×îÊʺϳÖÐø½»¸¶µÄfeature,±¾Îļòµ¥½éÉÜÁËpipeline£¬Ï£Íû¶ÔÄúµÄѧϰÓаïÖú¡£

Ò»¡¢ÒýÑÔ

Jenkins 2.0µÄµ½À´£¬pipline½øÈëÁËÊÓÒ°£¬jenkins2.0µÄºËÐÄÌØÐÔ. Ò²ÊÇ×îÊʺϳÖÐø½»¸¶µÄfeature¡£

¼òµ¥µÄÀ´Ëµ£¬¾ÍÊǰÑJenkins1.0°æ±¾ÖУ¬ProjectÖеÄÏà¹ØÅäÖÃÐÅÏ¢£¬ÈçSVN/GitµÄÅäÖã¬ParameterµÄÅäÖõȶ¼±ä³ÉCode£¬¼´Pipeline as Code¡£

Ëæ×Åpipeline½»¸¶Á÷Ë®ÏßÔÚÍŶÓÖеÄÍÆ¹ã£¬Ê¹ÓÃpipeline½Å±¾µÄjobҲѸËÙÔö¼Ó¡£

ÓÅÊÆ£º

ͨ¹ýд´úÂëµÄÐÎʽÅäÖÃProject£¬ÇÒJenkinsÖÐÄÚÖÃÁ˳£ÓõÄsteps¡£

ʵÏÖÁ˹¹½¨²½Öè´úÂ뻯¡¢¹¹½¨¹ý³ÌÊÓͼ»¯¡£

¶þ¡¢Óï·¨¼ò½é

Pipeline×î»ù±¾µÄ²¿·ÖÊÇ¡°step¡±¡£»ù±¾ÉÏ£¬step¸æËßJenkins Òª×öʲô£¬²¢ÇÒ×÷ΪDeclarative PipelineºÍScripted PipelineÓï·¨µÄ»ù±¾¹¹½¨¿é¡£

PipelineÖ§³ÖÁ½ÖÖÓï·¨£ºDeclarative Pipeline£¨ÔÚPipeline 2.5ÖÐÒýÈ룬½á¹¹»¯·½Ê½£©ºÍScripted Pipeline£¬Á½Õß¶¼Ö§³Ö½¨Á¢Á¬ÐøÊäË͵ÄPipeline¡£

Ñ¡ÔñDeclarative Pipeline»¹ÊÇScripted Pipeline

×ʼµÄPipeline plugin£¬Ö§³ÖµÄÖ»ÓÐÒ»Öֽű¾ÀàÐÍ£¬¾ÍÊÇScripted Pipeline£»

Declarative PipelineΪPipeline pluginÔÚ2.5°æ±¾Ö®ºóÐÂÔöµÄÒ»Öֽű¾ÀàÐÍ£¬ÓëÔ­ÏȵÄScripted PipelineÒ»Ñù£¬¶¼¿ÉÒÔÓÃÀ´±àд½Å±¾¡£

Ïà¹Ø×ÊÁÏ£º

´Ó¼ìË÷µÄ×ÊÁÏÀ´¿´£¬Declarative Pipeline ÊǺóÐøOpen Blue OceanËùÖ§³ÖµÄÀàÐÍ¡£Ïà¶Ô¶øÑÔ£¬Declarative Pipeline±È½Ï¼òµ¥£¬Declarative PipelineÖУ¬Ò²ÊÇ¿ÉÒÔÄÚǶScripted Pipeline´úÂëµÄ¡£

ΪÓëBlueOcean½Å±¾±à¼­Æ÷¼æÈÝ£¬Í¨³£½¨ÒéʹÓÃDeclarative PipelineµÄ·½Ê½½øÐбàд,´ÓjenkinsÉçÇøµÄ¶¯ÏòÀ´¿´£¬ºÜÃ÷ÏÔÕâÖÖÓï·¨½á¹¹Ò²»áÊÇδÀ´µÄÇ÷ÊÆ¡£

Èý¡¢Declarative Pipeline

Declarative PipelineÊÇJenkins Pipeline µÄÒ»¸öÏà¶Ô½ÏеIJ¹³ä£¬ ËüÔÚPipeline×Óϵͳ֮ÉÏÌá³öÁËÒ»ÖÖ¸üΪ¼ò»¯ºÍÓÐÒâÒåµÄÓï·¨¡£

ËùÓÐÓÐЧµÄDeclarative Pipeline±ØÐë°üº¬ÔÚÒ»¸öpipeline¿éÄÚ£¬ÀýÈ磺

pipeline { /* insert Declarative Pipeline here */ }

Declarative PipelineÖеĻù±¾Óï¾äºÍ±í´ïʽ×ñÑ­ÓëGroovyÓï·¨ÏàͬµÄ¹æÔò £¬µ«ÓÐÒÔÏÂÀýÍ⣺

a.PipelineµÄ¶¥²ã±ØÐëÊǿ飬¾ßÌåÀ´ËµÊÇ£ºpipeline { }

b.ûÓзֺÅ×÷ΪÓï¾ä·Ö¸ô·û¡£Ã¿¸öÉùÃ÷±ØÐëÔÚ×Ô¼ºµÄÒ»ÐÐ

c.¿éÖ»Äܰüº¬Sections, Directives, Steps»ò¸³ÖµÓï¾ä¡£

d.ÊôÐÔÒýÓÃÓï¾ä±»ÊÓΪÎ޲η½·¨µ÷Óá£ËùÒÔÀýÈ磬ÊäÈë±»ÊÓΪinput£¨£©

1.Sections£¨Õ½ڣ©

Declarative PipelineÀïµÄSectionsͨ³£°üº¬Ò»¸ö»ò¶à¸öDirectives»ò Steps

agent

agent²¿·ÖÖ¸¶¨Õû¸öPipeline»òÌØ¶¨½×¶Î½«ÔÚJenkins»·¾³ÖÐÖ´ÐеÄλÖ㬾ßÌåÈ¡¾öÓÚ¸Ãagent ²¿·ÖµÄ·ÅÖÃλÖ᣸ò¿·Ö±ØÐëÔÚpipeline¿éÄڵĶ¥²ã¶¨Òå £¬µ«stage¼¶Ê¹ÓÃÊÇ¿ÉÑ¡µÄ¡£

ΪÁËÖ§³ÖPipeline¿ÉÄÜÓµÓеĸ÷ÖÖÓÃÀý£¬¸Ãagent²¿·ÖÖ§³Ö¼¸ÖÖ²»Í¬ÀàÐ͵IJÎÊý¡£ÕâЩ²ÎÊý¿ÉÒÔÓ¦ÓÃÓÚpipeline¿éµÄ¶¥²ã£¬Ò²¿ÉÒÔÓ¦ÓÃÔÚÿ¸östageÖ¸ÁîÄÚ¡£

²ÎÊý

any

ÔÚÈκοÉÓõÄagent ÉÏÖ´ÐÐPipeline»òstage¡£ÀýÈ磺agent any

none

µ±ÔÚpipeline¿éµÄ¶¥²ãʹÓÃnoneʱ£¬½«²»»áΪÕû¸öPipelineÔËÐзÖÅäÈ«¾Öagent £¬Ã¿¸östage²¿·Ö½«ÐèÒª°üº¬Æä×Ô¼ºµÄagent²¿·Ö¡£

label

ʹÓÃÌṩµÄlabel±êÇ©£¬ÔÚJenkins»·¾³ÖпÉÓõĴúÀíÉÏÖ´ÐÐPipeline»òstage¡£ÀýÈ磺agent { label 'my-defined-label' }

node

agent { node { label 'labelName' } }£¬µÈͬÓÚ agent { label 'labelName' }£¬µ«nodeÔÊÐíÆäËûÑ¡ÏÈçcustomWorkspace£©¡£

docker

¶¨Òå´Ë²ÎÊýʱ£¬Ö´ÐÐPipeline»òstageʱ»á¶¯Ì¬¹©Ó¦Ò»¸ödocker½ÚµãÈ¥½ÓÊÜDocker-basedµÄPipelines¡£ docker»¹¿ÉÒÔ½ÓÊÜÒ»¸öargs£¬Ö±½Ó´«µÝ¸ødocker runµ÷Óá£ÀýÈ磺agent { docker 'maven:3-alpine' }»ò

docker
agent {
docker {
image 'maven:3-alpine'
label 'my-defined-label'
args '-v /tmp:/tmp'
}
}

ʹÓôÓDockerfileÔ´´æ´¢¿âÖаüº¬µÄÈÝÆ÷À´¹¹½¨Ö´ÐÐPipeline»òstage ¡£ÎªÁËʹÓôËÑ¡ÏJenkinsfile±ØÐë´ÓMultibranch Pipeline»ò¡°Pipeline from SCM"¼ÓÔØ¡£

ĬÈÏÊÇÔÚDockerfileÔ´¿âµÄ¸ùĿ¼£ºagent { dockerfile true }¡£Èç¹ûDockerfileÐèÔÚÁíÒ»¸öĿ¼Öн¨Á¢£¬ÇëʹÓÃÒÔÏÂdirÑ¡Ïagent { dockerfile { dir 'someSubDir' } }¡£Äú¿ÉÒÔͨ¹ýdocker build ...ʹÓÃadditionalBuildArgsÑ¡ÏÈçagent { ¡¡¡¡¡¡¡¡dockerfile { additionalBuildArgs '--build-arg foo=bar' } }¡£

²ÎÊý

any

ÔÚÈκοÉÓõÄagent ÉÏÖ´ÐÐPipeline»òstage¡£ÀýÈ磺agent any

none

µ±ÔÚpipeline¿éµÄ¶¥²ãʹÓÃnoneʱ£¬½«²»»áΪÕû¸öPipelineÔËÐзÖÅäÈ«¾Öagent £¬Ã¿¸östage²¿·Ö½«ÐèÒª°üº¬Æä×Ô¼ºµÄagent²¿·Ö¡£

label

ʹÓÃÌṩµÄlabel±êÇ©£¬ÔÚJenkins»·¾³ÖпÉÓõĴúÀíÉÏÖ´ÐÐPipeline»òstage¡£ÀýÈ磺agent { label 'my-defined-label' }

node

agent { node { label 'labelName' } }£¬µÈͬÓÚ agent { label 'labelName' }£¬µ«nodeÔÊÐíÆäËûÑ¡ÏÈçcustomWorkspace£©¡£

docker

¶¨Òå´Ë²ÎÊýʱ£¬Ö´ÐÐPipeline»òstageʱ»á¶¯Ì¬¹©Ó¦Ò»¸ödocker½ÚµãÈ¥½ÓÊÜDocker-basedµÄPipelines¡£ docker»¹¿ÉÒÔ½ÓÊÜÒ»¸öargs£¬Ö±½Ó´«µÝ¸ødocker runµ÷Óá£ÀýÈ磺agent { docker 'maven:3-alpine' }»ò

docker
agent {
docker {
image 'maven:3-alpine'
label 'my-defined-label'
args '-v /tmp:/tmp'
}
}

ʹÓôÓDockerfileÔ´´æ´¢¿âÖаüº¬µÄÈÝÆ÷À´¹¹½¨Ö´ÐÐPipeline»òstage ¡£ÎªÁËʹÓôËÑ¡ÏJenkinsfile±ØÐë´ÓMultibranch Pipeline»ò¡°Pipeline from SCM"¼ÓÔØ¡£

ĬÈÏÊÇÔÚDockerfileÔ´¿âµÄ¸ùĿ¼£ºagent { dockerfile true }¡£Èç¹ûDockerfileÐèÔÚÁíÒ»¸öĿ¼Öн¨Á¢£¬ÇëʹÓÃÒÔÏÂdirÑ¡Ïagent { dockerfile { dir 'someSubDir' } }¡£Äú¿ÉÒÔͨ¹ýdocker build ...ʹÓÃadditionalBuildArgsÑ¡ÏÈçagent { dockerfile { additionalBuildArgs '--build-arg foo=bar' } }¡£

³£ÓÃÑ¡Ïî

ÕâЩÊÇ¿ÉÒÔÓ¦ÓÃÓÚÁ½¸ö»ò¶à¸öagentµÄÑ¡Ïî¡£³ý·ÇÃ÷È·¶¨Ò壬·ñÔò²»ÐèÒª¡£

label

Ò»¸ö×Ö·û´®¡£±ê¼ÇÔÚÄÄÀïÔËÐÐpipeline»òstage

´ËÑ¡ÏîÊÊÓÃÓÚnode£¬dockerºÍdockerfile£¬²¢ÇÒ nodeÊDZØÐèµÄ¡£

customWorkspace

Ò»¸ö×Ö·û´®¡£×Ô¶¨ÒåÔËÐеŤ×÷¿Õ¼äÄÚ¡£Ëü¿ÉÒÔÊÇÏà¶Ô·¾¶£¬ÔÚÕâÖÖÇé¿öÏ£¬×Ô¶¨Ò幤×÷Çø½«Î»ÓÚ½ÚµãÉϵŤ×÷¿Õ¼ä¸ùĿ¼Ï£¬Ò²¿ÉÒÔÊǾø¶Ô·¾¶¡£ÀýÈ磺

agent {
node {
label 'my-defined-label'
customWorkspace '/some/other/path'
}
}

Ò»¸ö²¼¶ûÖµ£¬Ä¬ÈÏΪfalse¡£Èç¹ûΪtrue£¬ÔòÔÚͬһ¹¤×÷¿Õ¼äÖС£

´ËÑ¡ÏîÊÊÓÃÓÚdockerºÍdockerfile£¬²¢ÇÒ½öÔÚ individual stageÖÐʹÓÃagent²ÅÓÐЧ¡£

pipeline {
//Execute all the steps defined in this Pipeline within a newly created container of the given name and tag (maven:3-alpine).
agent { docker 'maven:3-alpine' }
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}

pipeline {
agent none
stages {
stage('Example Build') {
agent { docker 'maven:3-alpine' }
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent { docker 'openjdk:8-jre' }
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}

post

¶¨ÒåPipeline»òstageÔËÐнáÊøÊ±µÄ²Ù×÷¡£post-condition¿éÖ§³Öpost²¿¼þ£ºalways£¬changed£¬failure£¬success£¬unstable£¬ºÍaborted¡£ÕâЩ¿éÔÊÐíÔÚPipeline»òstageÔËÐнáÊøÊ±Ö´Ðв½Ö裬¾ßÌåÈ¡¾öÓÚPipelineµÄ״̬¡£

conditionsÏ

always

ÔËÐУ¬ÎÞÂÛPipelineÔËÐеÄÍê³É״̬ÈçºÎ¡£

changed

Ö»Óе±Ç°PipelineÔËÐеÄ״̬ÓëÏÈǰÍê³ÉµÄPipelineµÄ״̬²»Í¬Ê±£¬²ÅÄÜÔËÐС£

failure

½öµ±µ±Ç°Pipeline´¦ÓÚ¡°Ê§°Ü¡±×´Ì¬Ê±²ÅÔËÐУ¬Í¨³£ÔÚWeb UIÖÐÓúìɫָʾ±íʾ¡£

success

½öµ±µ±Ç°Pipeline¾ßÓС°³É¹¦¡±×´Ì¬Ê±²ÅÔËÐУ¬Í¨³£ÔÚ¾ßÓÐÀ¶É«»òÂÌɫָʾµÄWeb UIÖбíʾ¡£

pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}

unstable

Ö»Óе±Ç°Pipeline¾ßÓС°²»Îȶ¨¡±×´Ì¬£¬Í¨³£ÓɲâÊÔʧ°Ü£¬´úÂëÎ¥ÀýµÈÒýÆð£¬²ÅÄÜÔËÐС£Í¨³£ÔÚ¾ßÓлÆÉ«Ö¸Ê¾µÄWeb UIÖбíʾ¡£

aborted

Ö»Óе±Ç°Pipeline´¦ÓÚ¡°ÖÐÖ¹¡±×´Ì¬Ê±£¬²Å»áÔËÐУ¬Í¨³£ÊÇÓÉÓÚPipeline±»ÊÖ¶¯ÖÐÖ¹¡£Í¨³£ÔÚ¾ßÓлÒɫָʾµÄWeb UIÖбíʾ¡£

°üº¬Ò»¸ö»ò¶à¸östageµÄÐòÁУ¬PipelineµÄ´ó²¿·Ö¹¤×÷ÔÚ´ËÖ´ÐС£½¨ÒéstagesÖÁÉÙ°üº¬ÖÁÉÙÒ»¸östageÖ¸ÁÓÃÓÚÁ¬½Ó¸÷¸ö½»¸¶¹ý³Ì£¬Èç¹¹½¨£¬²âÊԺͲ¿ÊðµÈ¡£

steps

steps°üº¬Ò»¸ö»ò¶à¸öÔÚstage¿éÖÐÖ´ÐеÄstepÐòÁС£

pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}

2.Directives £¨Ö¸Á

environment

environmentÖ¸ÁîÖ¸¶¨Ò»ÏµÁмüÖµ¶Ô£¬ÕâЩ¼üÖµ¶Ô½«±»¶¨ÒåΪËùÓÐstep»òstage-specific stepµÄ»·¾³±äÁ¿£¬¾ßÌåÈ¡¾öÓÚenvironmentÖ¸ÁîÔÚPipelineÖеÄλÖá£

¸ÃÖ¸ÁîÖ§³ÖÒ»ÖÖÌØÊâµÄ·½·¨credentials()£¬¿ÉÒÔͨ¹ýÆäÔÚJenkins»·¾³Öеıêʶ·ûÀ´·ÃÎÊÔ¤¶¨ÒåµÄƾ¾Ý¡£

¶ÔÓÚÀàÐÍΪ¡°Secret Text¡±µÄƾ¾Ý£¬¸Ã credentials()·½·¨½«È·±£Ö¸¶¨µÄ»·¾³±äÁ¿°üº¬Secret TextÄÚÈÝ£»¶ÔÓÚ¡°±ê×¼Óû§ÃûºÍÃÜÂ롱ÀàÐÍµÄÆ¾Ö¤£¬Ö¸¶¨µÄ»·¾³±äÁ¿½«±»ÉèÖÃΪusername:password¡£

pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
AN_ACCESS_KEY = credentials('my-prefined-secret-text')
}
steps {
sh 'printenv'
}
}
}
}

options

optionsÖ¸ÁîÔÊÐíÔÚPipeline±¾ÉíÄÚÅäÖÃPipelineרÓÃÑ¡Ïî¡£Pipeline±¾ÉíÌṩÁËÐí¶àÑ¡ÏÀýÈçbuildDiscarder£¬µ«ËüÃÇÒ²¿ÉÄÜÓɲå¼þÌṩ£¬ÀýÈç timestamps¡£

¿ÉÓÃÑ¡Ïî

buildDiscarderpipeline±£³Ö¹¹½¨µÄ×î´ó¸öÊý¡£ÀýÈ磺options { buildDiscarder(logRotator(numToKeepStr: '1')) }

disableConcurrentBuilds

²»ÔÊÐí²¢ÐÐÖ´ÐÐPipeline,¿ÉÓÃÓÚ·Àֹͬʱ·ÃÎʹ²Ïí×ÊÔ´µÈ¡£ÀýÈ磺options { disableConcurrentBuilds() }

skipDefaultCheckout

ĬÈÏÌø¹ýÀ´×ÔÔ´´úÂë¿ØÖÆµÄ´úÂë¡£ÀýÈ磺options { skipDefaultCheckout() }

skipStagesAfterUnstable

Ò»µ©¹¹½¨×´Ì¬½øÈëÁË¡°Unstable¡±×´Ì¬£¬¾ÍÌø¹ý´Ëstage¡£ÀýÈ磺options { skipStagesAfterUnstable() }

timeout

ÉèÖÃPipelineÔËÐеij¬Ê±Ê±¼ä¡£ÀýÈ磺options { timeout(time: 1, unit: 'HOURS') }

retry

ʧ°Üºó£¬ÖØÊÔÕû¸öPipelineµÄ´ÎÊý¡£ÀýÈ磺options { retry(3) }

timestamps

Ô¤¶¨ÒåÓÉPipelineÉú³ÉµÄËùÓпØÖÆÌ¨Êä³öʱ¼ä¡£ÀýÈ磺options { timestamps() }

pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}

parameters

parametersÖ¸ÁîÌṩÓû§ÔÚ´¥·¢PipelineʱµÄ²ÎÊýÁÐ±í¡£ÕâЩ²ÎÊýֵͨ¹ý¸Ãparams¶ÔÏó¿ÉÓÃÓÚPipeline²½Ö裬¾ßÌåÓ÷¨ÈçÏÂ

¿ÉÓòÎÊý

string

Ŀǰֻ֧³Ö[booleanParam, choice, credentials, file, text, password, run, string]Õ⼸ÖÖ²ÎÊýÀàÐÍ£¬ÆäËû¸ß¼¶²ÎÊý»¯ÀàÐÍ»¹ÐèµÈ´ýÉçÇøÖ§³Ö¡£

pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
}
stages {
stage('Example') {
steps {
echo "Hello ${params.PERSON}"
}
}
}
}

triggers

triggersÖ¸ÁÒåÁËPipeline×Ô¶¯»¯´¥·¢µÄ·½Ê½¡£¶ÔÓÚÓëÔ´´úÂ뼯³ÉµÄPipeline£¬ÈçGitHub»òBitBucket£¬triggers¿ÉÄܲ»ÐèÒª»ùÓÚwebhookµÄ¼¯³ÉÒ²ÒѾ­´æÔÚ¡£Ä¿Ç°Ö»ÓÐÁ½¸ö¿ÉÓõĴ¥·¢Æ÷£ºcronºÍpollSCM¡£

cron

½ÓÊÜÒ»¸öcron·ç¸ñµÄ×Ö·û´®À´¶¨ÒåPipeline´¥·¢µÄ³£¹æ¼ä¸ô£¬ÀýÈ磺 triggers { cron('H 4/* 0 0 1-5') }

pollSCM

½ÓÊÜÒ»¸öcron·ç¸ñµÄ×Ö·û´®À´¶¨ÒåJenkins¼ì²éSCMÔ´¸ü¸ÄµÄ³£¹æ¼ä¸ô¡£Èç¹û´æÔÚеĸü¸Ä£¬ÔòPipeline½«±»ÖØÐ´¥·¢¡£ÀýÈ磺triggers { pollSCM('H 4/* 0 0 1-5') }

pipeline {
agent any
triggers {
cron('H 4/* 0 0 1-5')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}

stage

stageÖ¸ÁîÔÚstages²¿·ÖÖУ¬Ó¦°üº¬stop²¿·Ö£¬¿ÉÑ¡agent²¿·Ö»òÆäËûÌØ¶¨ÓÚstageµÄÖ¸Áʵ¼ÊÉÏ£¬PipelineÍê³ÉµÄËùÓÐʵ¼Ê¹¤×÷¶¼½«°üº¬ÔÚÒ»¸ö»ò¶à¸östageÖ¸ÁîÖС£

pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}¡¡

ͨ¹ýtools¿É×Ô¶¯°²×°¹¤¾ß£¬²¢·ÅÖû·¾³±äÁ¿µ½PATH¡£Èç¹ûagent none£¬Õ⽫±»ºöÂÔ¡£

pipeline {
agent any
tools {
//¹¤¾ßÃû³Æ±ØÐëÔÚJenkins ¹ÜÀíJenkins ¡ú È«¾Ö¹¤¾ßÅäÖÃÖÐÔ¤ÅäÖá£
maven 'apache-maven-3.0.1'
}
stages {
stage('Example') {
steps {
sh 'mvn --version'
}
}
}
}
¡¡¡¡

when

whenÖ¸ÁîÔÊÐíPipeline¸ù¾Ý¸ø¶¨µÄÌõ¼þÈ·¶¨ÊÇ·ñÖ´Ðиý׶Ρ£¸ÃwhenÖ¸Áî±ØÐëÖÁÉÙ°üº¬Ò»¸öÌõ¼þ¡£Èç¹ûwhenÖ¸Áî°üº¬¶à¸öÌõ¼þ£¬ÔòËùÓÐ×ÓÌõ¼þ±ØÐëΪstageÖ´Ðзµ»Øtrue¡£ÕâÓë×ÓÌõ¼þǶÌ×ÔÚÒ»¸öallOfÌõ¼þÖÐÏàͬ£¨¼ûÏÂÃæµÄÀý×Ó£©¡£

¸ü¸´ÔÓµÄÌõ¼þ½á¹¹¿ÉʹÓÃǶÌ×Ìõ¼þ½¨£ºnot£¬allOf»òanyOf¡£Ç¶Ì×Ìõ¼þ¿ÉÒÔǶÌ×µ½ÈÎÒâÉî¶È¡£

ÄÚÖÃÌõ¼þ

branch

µ±ÕýÔÚ¹¹½¨µÄ·ÖÖ§Óë¸ø³öµÄ·Ö֧ģʽƥÅäʱִÐУ¬ÀýÈ磺when { branch 'master' }¡£Çë×¢Ò⣬Õâ½öÊÊÓÃÓÚ¶à·ÖÖ§Pipeline¡£

environment

µ±Ö¸¶¨µÄ»·¾³±äÁ¿ÉèÖÃΪ¸ø¶¨ÖµÊ±Ö´ÐУ¬ÀýÈ磺 when { environment name: 'DEPLOY_TO', value: 'production' }

expression

µ±Ö¸¶¨µÄGroovy±í´ïʽÇóֵΪtrueʱִÐУ¬ÀýÈ磺 when { expression { return params.DEBUG_BUILD } }

not

µ±Ç¶Ì×Ìõ¼þΪfalseʱִÐС£±ØÐë°üº¬Ò»¸öÌõ¼þ¡£ÀýÈ磺when { not { branch 'master' } }

allOf

µ±ËùÓÐǶÌ×Ìõ¼þ¶¼ÎªÕæÊ±Ö´ÐС£±ØÐëÖÁÉÙ°üº¬Ò»¸öÌõ¼þ¡£ÀýÈ磺when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }

anyOf

µ±ÖÁÉÙÒ»¸öǶÌ×Ìõ¼þÎªÕæÊ±Ö´ÐС£±ØÐëÖÁÉÙ°üº¬Ò»¸öÌõ¼þ¡£ÀýÈ磺when { anyOf { branch 'master'; branch 'staging' } }

pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
allOf {
branch 'production'
environment name: 'DEPLOY_TO', value: 'production'
}
}
steps {
echo 'Deploying'
}
}
}
}

3.Parallel(²¢ÐÐ)

Declarative Pipeline½üÆÚÐÂÔöÁ˶Բ¢ÐÐǶÌ×stageµÄÖ§³Ö£¬¶ÔºÄʱ³¤£¬Ï໥²»´æÔÚÒÀÀµµÄstage¿ÉÒÔʹÓô˷½Ê½ÌáÉýÔËÐÐЧÂÊ¡£³ýÁËparallel stage£¬µ¥¸öparallelÀïµÄ¶à¸östepÒ²¿ÉÒÔʹÓò¢Ðеķ½Ê½ÔËÐС£

pipeline {
agent any
stages {
stage('Non-Parallel Stage') {
steps {
echo 'This stage will be executed first.'
}
}
stage('Parallel Stage') {
when {
branch 'master'
}
parallel {
stage('Branch A') {
agent {
label "for-branch-a"
}
steps {
echo "On Branch A"
}
}
stage('Branch B') {
agent {
label "for-branch-b"
}
steps {
echo "On Branch B"
}
}
}
}
}
}

4.Steps£¨²½Ö裩

Declarative Pipeline¿ÉÒÔʹÓà Pipeline Steps referenceÖеÄËùÓпÉÓò½Öè £¬²¢¸½¼ÓÒÔϽöÔÚDeclarative PipelineÖÐÖ§³ÖµÄ²½Öè¡£

script

script²½ÖèÐèÒªÒ»¸öscript Pipeline£¬²¢ÔÚDeclarative PipelineÖÐÖ´ÐС£¶ÔÓÚ´ó¶àÊýÓÃÀý£¬scriptÔÚDeclarative PipelineÖеIJ½Öè²»ÊDZØÐëµÄ£¬µ«Ëü¿ÉÒÔÌṩһ¸öÓÐÓõļÓÇ¿¡£

pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'

script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
}
}
}
}

ËÄ¡¢Scripted Pipeline

Groovy½Å±¾²»Ò»¶¨ÊʺÏËùÓÐʹÓÃÕߣ¬Òò´Ëjenkins´´½¨ÁËDeclarative pipeline£¬Îª±àдJenkins¹ÜµÀÌṩÁËÒ»ÖÖ¸ü¼òµ¥¡¢¸üÓÐÖ÷¼ûµÄÓï·¨¡£µ«ÊDz»¿É·ñÈÏ£¬ÓÉÓڽű¾»¯µÄpipelineÊÇ»ùÓÚgroovyµÄÒ»ÖÖDSLÓïÑÔ£¬ËùÒÔÓëDeclarative pipelineÏà±ÈΪjenkinsÓû§ÌṩÁ˸ü¾Þ´óµÄÁé»îÐԺͿÉÀ©Õ¹ÐÔ¡£

1.Á÷³Ì¿ØÖÆ

pipeline½Å±¾Í¬ÆäËü½Å±¾ÓïÑÔÒ»Ñù£¬´ÓÉÏÖÁÏÂ˳ÐòÖ´ÐУ¬ËüµÄÁ÷³Ì¿ØÖÆÈ¡¾öÓÚGroovy±í´ïʽ£¬Èçif/elseÌõ¼þÓï¾ä£¬¾ÙÀýÈçÏ£º

Jenkinsfile (Scripted Pipeline)
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}

pipeline½Å±¾Á÷³Ì¿ØÖƵÄÁíÒ»ÖÖ·½Ê½ÊÇGroovyµÄÒì³£´¦Àí»úÖÆ¡£µ±ÈκÎÒ»¸ö²½ÖèÒò¸÷ÖÖÔ­Òò¶ø³öÏÖÒ쳣ʱ£¬¶¼±ØÐëÔÚGroovyÖÐʹÓÃtry/catch/finallyÓï¾ä¿é½øÐд¦Àí£¬¾ÙÀýÈçÏ£º

Jenkinsfile (Scripted Pipeline)
node {
stage('Example') {
try {
sh 'exit 1'
}
catch (exc) {
echo 'Something failed, I should sound the klaxons!'
throw
}
}
}

2.Steps

pipeline×îºËÐĺͻù±¾µÄ²¿·Ö¾ÍÊÇ¡°step¡±£¬´Ó¸ù±¾ÉÏÀ´Ëµ£¬steps×÷ΪDeclarative pipelineºÍScripted pipelineÓï·¨µÄ×î»ù±¾µÄÓï¾ä¹¹½¨¿éÀ´¸æËßjenkinsÓ¦¸ÃÖ´ÐÐʲô²Ù×÷¡£

Scripted pipelineûÓÐרÃŽ«steps×÷ΪËüµÄÓï·¨µÄÒ»²¿·ÖÀ´½éÉÜ£¬µ«ÊÇÔÚPipeline Steps referenceÕâÆªÎĵµÖжÔpipeline¼°Æä²å¼þÉæ¼°µÄsteps×öÁ˺ÜÏêϸµÄ½éÉÜ¡£ÈçÓÐÐèÒª¿É²Î¿¼jenkins¹ÙÍø¶Ô¸Ã²¿·ÖµÄ½éÉÜPipeline Steps reference

3.Differences

from plain GroovyÓÉÓÚpipelineµÄһЩ¸öÐÔ»¯ÐèÇ󣬱ÈÈçÔÚÖØÐÂÆô¶¯jenkinsºóÒªÇópipeline½Å±¾ÈÔÈ»¿ÉÒÔÔËÐУ¬ÄÇôpipeline½Å±¾±ØÐ뽫Ïà¹ØÊý¾Ý×öÐòÁл¯£¬È»¶øÕâÒ»µã Groovy²¢²»ÄÜÍêÃÀµÄÖ§³Ö£¬ÀýÈçcollection.each { item -> /* perform operation */ }

4.Declarative

pipelineºÍScripted pipelineµÄ±È½Ï

¹²Í¬µã£º

Á½Õß¶¼ÊÇpipeline´úÂëµÄ³Ö¾ÃʵÏÖ£¬¶¼Äܹ»Ê¹ÓÃpipelineÄÚÖõIJå¼þ»òÕß²å¼þÌṩµÄsteps£¬Á½Õß¶¼¿ÉÒÔÀûÓù²Ïí¿âÀ©Õ¹¡£

Çø±ð£º

Á½Õß²»Í¬Ö®´¦ÔÚÓÚÓï·¨ºÍÁé»îÐÔ¡£Declarative pipeline¶ÔÓû§À´Ëµ£¬Óï·¨¸üÑϸñ£¬Óй̶¨µÄ×éÖ¯½á¹¹£¬¸üÈÝÒ×Éú³É´úÂë¶Î£¬Ê¹Æä³ÉΪÓû§¸üÀíÏëµÄÑ¡Ôñ¡£µ«ÊÇScripted pipeline¸ü¼ÓÁé»î£¬ÒòΪGroovy±¾ÉíÖ»ÄܶԽṹºÍÓï·¨½øÐÐÏÞÖÆ£¬¶ÔÓÚ¸ü¸´ÔÓµÄpipelineÀ´Ëµ£¬Óû§¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÒµÎñ½øÐÐÁé»îµÄʵÏÖºÍÀ©Õ¹¡£

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

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

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

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