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

2022-06-13  本文已影响0人  伊丽莎白2015

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


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

image.png

【本文内容】


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


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

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包含了一些条件:

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
上一篇下一篇

猜你喜欢

热点阅读