前面一篇文章提到Jenkins Pipeline任务的定义、用处和创建方法,这时只是搭建起流水线框架,因为还没有编写流水线语法,所以还不能实现任何功能,下面将介绍流水线语法的规则及Jenkins file。

1、Jenkins Pipeline语法分类

        根据Jenkins官网Pipeline给出的解释, 流水线语法分为两种,一种是声明式流水线(Declarative Pipeline),另一种是脚本式流水线(Scripted Pipeline)。

1)声明式流水线

声明式流水线脚本的基本框架如下,需要注意的地方有:

        ①最外层的pipeline{} 表示整个流水线,包含所有的具体实现。

        ②agent 字段必不可少

        ③stages{}结构只能有一个,但一个stages{}结构能包含多个stage{}

        ④每个stage{}都必须有特定名称,每个stage{}有且只能包含一个steps{}

pipeline {
    agent any //agent 后面指定此流水线任务的运行节点,一般为固定节点的ip地址
              //agent any表示指定在任何节点上运行此流水线任务
    stages {
        stage('Build') { //定义构建阶段
            steps {
                // 执行具体构建任务...
            }
        }
        stage('Test') { //定义单元测试阶段
            steps {
                // 执行具体测试内容...
            }
        }
        stage('Deploy') { //定义部署阶段
            steps {
                // 执行具体部署操作。。。
            }
        }
    }
}

2)脚本式流水线


        不像声明式Pipeline,脚本式流水线是一个基于Groovy构建的,通用、高效的DSL。由Groovy语言提供的大多数功能都提供给脚本式流水线的用户,这意味着它是一个非常富有表现力和灵活性的工具,可以通过这些工具来创建持续构建的Pipeline。


node {  
    stage('Build') { //定义构建阶段
        // 执行具体构建任务...
    }
    stage('Test') { //定义单元测试阶段
        // 执行具体测试内容...
    }
    stage('Deploy') { 定义部署阶段
        // 执行具体部署操作。。。
    }
}


2、项目示例

结合具体项目,以声明式流水线为例,如下:

pipeline {
    
    agent 
    {
        node('Build-Pipeline-11.11.11.11')
    }
    
    parameters 
    {
        gitParameter name: 'BRANCH_TAG', 
                     type: 'PT_BRANCH_TAG',
                     branchFilter: 'origin/(.*)',
                     defaultValue: 'master',
                     selectedValue: 'DEFAULT',
                     sortMode: 'DESCENDING_SMART',
    				 description: 'Select your branch.'
    }    

    stages {
        
        stage('Git Source') 
        {
			steps 
			{
		          checkout([$class: 'GitSCM', 
                  branches: [[name: "${params.BRANCH_TAG}"]], 
                  doGenerateSubmoduleConfigurations: false, 
                  extensions: [], 
                  gitTool: 'Default', 
                  submoduleCfg: [],
                  userRemoteConfigs: [[url: 'https://xxxxxxxxx',
                  credentialsId: '123456']]
                ])
			}
        }

        stage('version + 1')
        {
            steps
            {
                script
                {
                    sh '''
                    cat ./core/common/include/version.hpp
                    version=`cat ./core/common/include/version.hpp |grep "^#define"|grep 
                    "HRA_VER_BUILD"|awk '($1="#define")($2="HRA_VER_BUILD"){print $3}'`

                    version=$newVersion

                    echo "the new version is $version"
                    sed -i '/#define HRA_VER_BUILD 7/a#define HRA_VER_BUILD '$version'' 
                    ./core/common/include/version.hpp
                    sed -i '/#define HRA_VER_BUILD 7/d' ./core/common/include/version.hpp
                    cat ./core/common/include/version.hpp
                    '''
                }
            }
        }

		stage('Compile') 
		{
			steps 
			{
				sh '''if [ "$ReleaseFlag" == "Release" ];then
					echo "[ build Release ]"
					sh build_release.sh
				else
					echo "[ build Debug ]"
                    sh build_debug.sh
				fi'''
			}
		}

		stage('UnitTest') 
		{
			steps 
			{
				script
                {
                    sh 'cd test && sh runtest.sh'
                    findText(textFinders: [textFinder(regexp: '^(\\[)[\\s]*FAILED[\\s]* 
                                           (\\])', 
                                           buildResult: 'ABORTED', 
                                          alsoCheckConsoleOutput: true)])
                }
			}
		}		

		stage('Coverage Report')
		{
		    steps
		    {
		        publishHTML (target: [
                        allowMissing: false,
                        alwaysLinkToLastBuild: false,
                        keepAll: true,
                        reportDir: './test/coverage/code_coverage_result',
                        reportFiles: 'index.html',
                        reportName: "Coverage Report"
                    ])
		    }
		}
		
		stage('Cppcheck') 
		{
			steps 
			{
				sh 'cppcheck --inline-suppr --enable=all --xml --xml-version=2 ./core 2> cppcheck.xml'
            }
	    }
	    
	    stage('Cppcheck Result')
	    {
	        steps
	        {
                publishCppcheck pattern:'cppcheck.xml'
	            findText(textFinders: [textFinder(regexp: '^core.*[:][\\s]warning[:]', 
                                      buildResult: 'ABORTED', 
                                      alsoCheckConsoleOutput: true),

	                                   textFinder(regexp: '^core.*[:][\\s]error[:]', 
                                       buildResult: 'ABORTED', 
                                      alsoCheckConsoleOutput: true)])
	        }
	    }

    	stage('UploadOverFtp') 
    	{
            steps 
            {
                ftpPublisher    alwaysPublishFromMaster: false,
                                continueOnError: false,
                                failOnError: false,
                                masterNodeName: '',
                                paramPublish: null,
                                publishers: [[
                                    configName: 'FTP_Build_KSP',
                                    transfers: [[
                                        asciiMode: false,
                                        cleanRemote: false,
                                        excludes: '',
                                        flatten: false,
                                        makeEmptyDirs: false,
                                        noDefaultExcludes: false,
                                        patternSeparator: '[, ]+',
                                        remoteDirectory: 
                                             'Pipeline/$ReleaseFlag-$COMPILE_TIMESTAMP',
                                        remoteDirectorySDF: false,
                                        removePrefix: 'output',
                                        sourceFiles: 'output/**'
                                    ]],
                                    usePromotionTimestamp: false,
                                    useWorkspaceInPromotion: false,
                                    verbose: false
                                ]]
            }
        }
	}
}

        ①在agent{}中指定工作节点为Build-Pipeline-11.11.11.11

        ②parameters中增加gitParameter插件,支持Git仓库分支选择

        ③stage('Git Source') ,从指定Git仓库分支拉取代码

        ④stage('version + 1'),构建版本自动加1

        ⑤stage('Compile') ,根据不同的编译参数选择编译方式

        ⑥stage('UnitTest') ,编译完成后进行单元测试

        ⑦stage('Coverage Report'),生成单元测试html报告

        ⑧stage('Cppcheck') ,静态代码检查

        ⑨stage('Cppcheck Result'), 生成静态代码检查报告

        ⑩stage('UploadOverFtp') , 通过FTP服务器上传构建结果

配置完成jenkins界面如下所示:

jenkins流水线很慢 jenkins 流水线语法_Jenkins

jenkins流水线很慢 jenkins 流水线语法_github_02

jenkins流水线很慢 jenkins 流水线语法_github_03

3、总结 

1)jenkins上支持的插件数量非常多,可以查阅官网关于每种插件的用法Jenkins Plugins

2) 初次配置完成时在jenkins界面上不会显示插件按钮,需要先构建一次任务