±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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À´Ëµ£¬Óû§¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÒµÎñ½øÐÐÁé»îµÄʵÏÖºÍÀ©Õ¹¡£ |