【DevOps相关】Jenkins pipeline学习(流水线部署)

在之前的文章中,相当于Jenkins入门:


除了构建一个自由风格的软件项目外,今天这篇主要讲Jenkins pipeline:

image.png


【本文内容】

  • 如何使用Jenkinsfile来做类型是pipeline的Jenkins项目的build
  • Jenkinsfile语法学习:
    • post标签,在所有的stage执行完成之后执行。
    • 使用Conditionals / When表达式
    • 使用环境变量——Environmental Variables(包含Jenkins自带的和自定义的),简单介绍了credentialswithCredentials
    • 使用tools标签来激活build工具
    • 使用parameters
    • 引入额外的groovy scripts
  • 回放功能

网上也有很多文章写的很好:


1. Jenkinsfile

对于Jenkins的pipeline来说,Jenkinsfile很重要。它相当于是用code的形式来代替Jenkins GUI上创建jobs的功能。我们可以在自己的项目中创建Jenkinsfile,把jobs通过代码的形式来定义出来。

一个sample:
image.png
Jenkinsfile有两种语法形式:

一种是Scripted,是最开始就有的语法。用的是groovy引擎,类似:

node {
    // groovy script
}

这种语法的优势在于功能强大,自由度也很高,缺点是对于不会groovy的人不友好,上手难。

另一种是Declarative风格的,这种语法是后来新增的,比较容易上手,因为它会预定义好很多框框,我们只要按照一定的语法往里面填就行了。缺点是功能没有上面的强大。类似:

pipeline {
    agent any
    stages {
        stage("build") {
            steps {
                // todo
            }
        }
    }
}

node开头的语法,就相当于是pipeline + agent any开头,两者作用是一样的。

2. 学习Declarative风格的Jenkinsfile

  • pipeline:是必须有的语义结构,且必须在最前面。
  • agent:where to execute,any表示可在任何可用的机器上执行pipeline
  • stages:where the "work" happens,在它里面,可以定义很多个stage,比如定义build stage,test stage,deploy stage等。
  • steps:定义jenkins需要执行的逻辑。

3. 写一个demo

3.1 在项目中编写Jenkinsfile文件:
pipeline {
    agent any
    stages {
        stage("build") {
            steps {
                echo 'building the application...'
            }
        }
        stage("test") {
            steps {
                echo 'testing the application...'
            }
        }
        stage("deploy") {
            steps {
                echo 'deploying the application...'
            }
        }
    }
}
3.2 提交到git仓库:
image.png

我在git上有4个分支,我把Jenkinsfile推送至两个分支:

image.png

3.3 创建一个多分支流水线(Multibranch Pipeline)

image.png

添加Git:
关于凭据的添加,可以参考之前的博文:https://www.jianshu.com/p/533f15b25d42

image.png

这里选择的是所有的分支。

【点击确定后,查看日志】
可以看到只有两个branch下有Jenkinsfile,所以另外两个会skip:

image.png

点击左侧状态,可以看到两个分支:
这里为什么上次成功时间不一致主要是因为一开始我只在master分支下写了Jenkinsfile。

image.png

点击具体的名称后,如点击【master】,可以看到master分布的三个stage(我们在#3.1中定义的):

image.png

鼠标移上去可以查看每个stage的log:

image.png

具体的log:

image.png

3.4默认读取的配置是Jenkinsfile

如果想要改配置文件名,可以在Jenkins 项目详情左侧【配置】中,有个tab叫【Build Configuration】中改:
image.png
通过上述的例子,我们也发现,基于pipeline的Jenkins项目,脱离了原先的基于GUI的配置,而是使用Jenkinsfile来配置项目,重点就在于如何编写Jenkinsfile。

4. post标签介绍

在所有的stage执行完成之后,我们可以使用post标签来执行接下来的逻辑。
post包含了一些条件:

  • always:表示无论build成功还是失败,都会执行。比如发送邮件。
  • success:表示build成功后会执行的逻辑。
  • failure:表示build失败后会执行的逻辑。
pipeline {
    agent any
        states {
        }
        post {
            always {
                // 
            }
        }

5. 使用Conditionals / When表达式

另一个很有用的功能是,给每个stage定义Conditionals或expression。

5.1 比如我们的test stage只想在dev branch下跑。

展开来讲就是什么条件下,test stage才会生效。比如:

stage("test") {
    when {
        expression {
            BRANCH_NAME == 'dev' || BRANCH_NAME == 'master'
        }
        steps {
            echo 'testing the application...'
        }
    }
}
5.2 比如build stage只有在dev并且有code改动的时候跑。

这时候CODE_CHANGE的判断就需要使用groovy去写了。

CODE_CHANGE = getGitChange() // to-do, use groovy
pipeline {
    agent any
    stages {
        stage("build") {
            when {
                expression {
                    BRANCH_NAME == 'dev' && CODE_CHANGES == true
                }
            }
            steps {
                echo 'building the application...'
            }
        }
    }
}

6. 在Jensinsfile中使用环境变量(Environmental Variables)

6.1 使用Jenkins内置的环境变量
可以通过http://localhost:8080/env-vars.html/查看所有的已经预设的环境变量:

image.png

6.2 自定义环境变量

在定义的时候,使用标签environment定义,通常value可以从代码中拿,示例是hardcode。在使用的时候,可以通过${}拿。echo的时候需要使用双引号。

还可以通过方法credentials拿到Jenkins中认证,因为有些stage中的插件需要经过Credintials绑定后才可使用。详细参考博文:https://www.jianshu.com/p/6e1c33165af9

pipeline {
    agent any
    environment {
        CUSTOM_TAG = "tag 123"
        SERVER_CREDINTIALS = credentials('github')
    }
    stages {
        stage("build") {
            steps {
                echo 'building the application...'
                echo "get custom tag = ${CUSTOM_TAG}" 
            }
        }
    }
}

比如以下凭证,就可以通过credentials('github')拿到:
image.png

有时候针对不同的环境,需要更多用法,比用使用:withCredentials:

stage {
    steps {
        echo 'deploying the application...';
        withCredentials([
                usernamePassword(credentials: 'github', userVariable: USER, passwordVariable: PWD)
            ]) {
                sh "use the ${USER} and ${PWD} here "
            }
        ])
    }
}

注:想要使用方法credentials和withCredentials,需要在Jenkins安装以下插件:


image.png

7. 使用Tools标签来激活build tools(即:自动安装工具)

build tools可以有:build tools:js, jdk, maven, gradle, yarn等等。
比如在steps里可以使用sh "mvn clean package"这种命令,那么需要预先安装好maven(Jenkins支持在全局工具管理中自动安装:gradle, maven以及jdk)。

如何查看名字?
Jenkins首页,左侧【系统管理】-->【全局工具管理】:
比如这里我的maven name叫:maven 3.6.3,那么在Jenkinsfile里可以使用tools标签来声明:

image.png

在tools中声明,然后在steps中使用:

pipeline {
    agent any
    tools {
        maven 'maven 3.6.3'
    }
    stages {
        stage ("build") {
            steps {
                sh 'mvn clean package'
            }
        }
    }
}

8. 使用Parameters

可以在parameters标签中预定义一些参数,string表示需要输入的参考,如果是choice,表示可以进行select选择。
除了string,choice和booleanParam类型,还可以有text,file和password类型。

定义好的parameters,在stage里可以通过params.name来引用:

pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '', description: 'version to deploy')
        choice(name: 'SELECT_VERSION', choices: ['v1.0', 'v1.1'], description: 'select target version')
        booleanParam(name: 'TEST_FLAG', defaultValue: true, description: '')
    }
    stages {
        stage("test") {
            when {
                expression {
                    params.TEST_FLAG == true
                }
            }
            steps {
                echo 'testing the application...'
            }
        }
        stage ("deploy") {
            steps {
                echo 'deploying the application...'
                echo "deploying the version with: ${params.SELECT_VERSION}"
            }
        }
    }
}

choice和booleanParam放到Jenkinsfile中测试下,修改到master下的Jenkinsfile。在Jenkins pipeline master的页面,可以看到左侧多了【Build With Parameters】:

image.png

点进去可以看到我们预定义的choice和booleanParam:

image.png

选择v1.1和testFlag=true,开始构建:
可以看到build成功了,因为testFlag=true,所以test stage也会跑。


image.png

查看deploy的log,也能顺利打印出build页选择的version:
image.png

那么如果testFlag=false呢?这时候test stage就会跳过,即变成灰色:


image.png

9. 引入额外的Groovy scripts

我们可以在steps中引入groovy script,例如我们写一个sample groovy脚本,文件名叫:sample.groovy

def buildApp() {
    echo 'building the application...'
}

return this

如何在Jenkinsfile中引用:

def gv
stages {
    stage ("init") {
        steps {
            script {
                gv = load "sample.groovy"
            }
        }
    }
    stage ("build") {
        steps {
            script {
                gv.buildApp()
            }
        }
    }
}

注:在sample.groovy中,可以直接使用${params.TEST_FLAG}这样定义过的parameters。

10 回放功能

另外一个有用的功能叫回放。
image.png

比如我在回放中的脚本改了一些,点击运行,那么就会立马执行改过的脚本(我加了几个感叹号):
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容