前面一篇文章提到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界面上不会显示插件按钮,需要先构建一次任务