Jenkins Pipeline语法_猛男代码的博客-程序员宅基地_jenkins pipeline 语法

技术标签: github  jenkins  

       前面一篇文章提到Jenkins Pipeline任务的定义、用处和创建方法,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界面如下所示:

3、总结 

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45979623/article/details/124108615

智能推荐

自定义圆环progressbar_weixin_33670786的博客-程序员宅基地

RoundProgressBar.java/** * RoundProgressBar.java [v1.0.0] * classes: com.example.audiorecordingtest.RoundProgressBar * Amanda Create at 2014年10月10日 下午4:16:45 * Copyright 阳光健康信息技术有限公司 */package com.exa...

java uuid 生成 策略_java 类设置id生成策略_吴佳晗的博客-程序员宅基地

public class Data_Brand implements Serializable {//[email protected]@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;//自序ID,默认生成策略private String Brand_Name;//品牌名称brandName brand_name}@Enti...

Android多媒体学习日记(一)_ekenlinbing的博客-程序员宅基地

知识归纳:             多媒体框架是由第三方PacketVideo提供的OpenCore实现的,它支持播放和录音许多的音频和视频格式,以及静态图像文件,包括MPEG4、MP3、H.264、AMR、AAC、AMR、JPG、PNG。             多媒体核心OpenCore,它的另外的一个称呼是PacketVideo,是按Android的多媒体核心,基于C++实现的,定义

hdu5114Collision_GAUSS_CLB的博客-程序员宅基地

CollisionTime Limit: 15000/15000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 26    Accepted Submission(s): 8Problem DescriptionMatt is playing a

随便推点

七上八下猜数字_六一儿童节游园活动的项目和游戏规则.doc_阿野与阿厉的博客-程序员宅基地

“六一儿童节”游园活动的项目及游戏规则在纸上画一个人头,游戏者蒙上双眼,原地转五圈,而后让游戏者走向指定的位置,把“鼻子”贴到人头上,贴中者得奖。二、夹珠在一个大桶内装满水,再往桶中放入较多得玻璃珠。游戏者手拿一双筷子向桶中夹珠。在指定时间内(一分钟),夹起指定个数(十五个)得奖。? 三、妙接对联或歇后语主持人要准备好较多的对联或歇后语。主持人说出上联或下联,让参赛者来接,对的就得奖。参赛者在接...

Hadoop之MapReduce 根据用户流量日志文件数据统计每个用户流量总和_一粒尘埃zc的博客-程序员宅基地

文章目录1.实现需求2.MapReduce编程模型1.实现需求2.MapReduce编程模型input读取文件splitting分割文件,框架自动完成mapping处理文件,以key,value的方式存储 ,需要自己实现shuffing把相同的key归类到一起,框架自动完成Reducing处理相同的key的数据,需要自己实现Final result处理最后结果...

HTML按钮的风格,7种Material Design风格打开菜单按钮特效_医学科普联盟的博客-程序员宅基地

这是一款效果非常炫酷的Material Design风格打开菜单按钮特效。该特效有7种不同的效果,每一种效果中都可以通过点击主菜单按钮来打开一组主菜单按钮,各种打开子菜单的动画效果各不相同。使用方法HTML结构这7种打开菜单按钮特效的基本HTML结构都非常相似:使用一个来作为包裹元素,里面使用一个div元素来作为按钮组包裹元素。然后在其里面放置一个button元素作为主菜单按钮,在用一个div包裹...

java页面响应太慢,求JSP页面访问过慢的解决办法_彼一暝的博客-程序员宅基地

当前位置:我的异常网» Java Web开发»求JSP页面访问过慢的解决办法求JSP页面访问过慢的解决办法www.myexceptions.net网友分享于:2015-08-26浏览:54次求JSP页面访问过慢的解决方法在把作好的项目部署到服务器上去后可以运行,但是响应速度实在太慢,随便开个页面要等个半天,实在是受不了服务器的配置大致是:CPU 2G,内存 2G。操作系统是wi...

C语言中的time函数总结_带你去网吧里偷耳机的博客-程序员宅基地_c语言中time函数

编程中经常用到时间表达及转换的函数,它们都定义在time.h库函数中,在此做一下总结,以方便后续查看使用。几个时间概念:1:Coordinated Universal Time(UTC): 协调世界时,又称世界标准时间,也即格林威治标准时间(Greenwich Mean Time,GMT),中国内地的时间与UTC得时差为+8,也即UTC+8,美国为UTC-5。2:Calendar Time...

10. xxl-job原理---回调_Gavin_Alison的博客-程序员宅基地_xxljob回调

xxl-job: v2.0.2 原理 目录学习0. xxl-job原理1. xxl-job原理—定时任务架构2. xxl-job原理-- 调度中心3. xxl-job原理-- 执行器注册4. xxl-job原理-- 执行器注册问题5 xxl-job原理-- 执行器注册问题6. xxl-job原理-- 调度中心注册7. xxl-job原理-- 任务管理8. xxl-job原理--...

推荐文章

热门文章

相关标签