如何编写jenkins的流水线

如何编写jenkins的流水线

我们为什么需要编写流水线?

这里假如你已经安装了好了jenkins,并且能够正常启动它。

通常情况下,jenkins提供的构建模板已经适应大部分项目了,例如单SpringBoot的项目,或者纯粹的Maven项目。但是不排除一些比较恶心的项目,比如:前端单独开发,但是部署的时候需要和后端的jar包一起发布,如果玩过Maven前后端不分离的项目的同学应该知道,就是把静态资源放到源码文件夹的static和templates目录下,从而实现前后端的部署。基于上述的原因,这时候我们就需要用到流水线了。

新建一个jenkins pipeline的item

输入完名字,点击OK,一个pipeline就算创建完成了

初识pipeline界面

general部分可以理解为这个pipeline的全局属性配置,比如是不是参数化的

我们需要着重关注下这个选项

比如:boolean,只有两个选项,true或者false

choice,通过一个定义的表示,来支持页面上的下拉选择,更像html的select标签

git支持从远端仓库下选择分支或者标签名,这里注意:jenkins自身提供的git下载插件不支持下载标签(流水线中)

string输入一串字符,通过定义的参数key来取值

这里选择完成,注意点击保存,jenkins会自动生成相关的流水线代码,后续要变更参数化的内容,也需要通过页面选择,不要通过直接修改代码的方式,否则这样的化会第一次修改的代码不生效。

pipeline代码

groovy 复制代码
import java.text.SimpleDateFormat

def createDir(folderPath) {
    if (!fileExists("$folderPath")) {
        sh "mkdir -p $folderPath"
        echo "文件夹:$folderPath 创建完成!"
    } else {
        echo "文件夹:$folderPath 已经存在!"
    }
}

def removeFile(folderPath) {
    if (fileExists("$folderPath")) {
        sh "rm -r ${folderPath}"
        echo "成功删除文件:${folderPath}"
    }
}

pipeline {
    agent any
    environment {
        MY_MAVEN_SETTING = "xxx.xml"
        CURRENT_PATH = pwd()
        
    }
    parameters {
        // 准备部署的分支名,可以改成从Git上获取分支名
        choice(name: 'DEPLOY_BRANCH', choices: ['deploy_sit'], description: '选择需要的分支')
        booleanParam(name: 'DEPLOY_FRONT_FLAG', description: '是否发布前端')
        string description: '''需要发布的前端项目
1.a
2.b
4.b
多选输入编码,用逗号分隔,全部输入*号''', name: 'DEPLOY_FRONT_PROJECT'
    }

    tools {
        maven "my-maven"
        nodejs "node14"
        jdk "my-jdk1.8"
    }

    stages {
        stage('拉取后端代码') {
            steps {
                script {
                    echo "开始删除Java父项目代码:${env.JAVA_PARENT_PROJECT_PATH}"
                    removeFile("${env.JAVA_PARENT_PROJECT_PATH}")
                    // 定义下载地址
                    def url = "${env.GIT_REPO_URL}xxx.git"
                    echo "开始拉后端代码,分支为:${params.DEPLOY_BRANCH}"
                    git branch: "${params.DEPLOY_BRANCH}", credentialsId: "${env.GIT_AUTH_ID}", url: "${url}"
                }
            }
        }
        

    }


}

代码解释:

import java.text.SimpleDateFormat。引入Java中的一些类,在jenkins的pipeline中是支持Java的类和方法引入的

定义方法:

groovy 复制代码
def createDir(folderPath) {
    if (!fileExists("$folderPath")) {
        sh "mkdir -p $folderPath"
        echo "文件夹:$folderPath 创建完成!"
    } else {
        echo "文件夹:$folderPath 已经存在!"
    }
}
// 关于参数的取值,写$param_name或者 ${param_name} 效果是一样的

pipeline的结构呢,是固定的,比如tools,parameters,environment都是固定的

如果说流水线有多个步骤,就写多个,比如这样,但是一定要包裹在stages{}里面

groovy 复制代码
stages {
        stage('A') {
            steps {
                script {
                }
            }
        stage('B') {
            steps {
                
            }    
        }
// 看到这里,你会发现为什么 stage A和B差异在script,如果你的代码里面没有调用Linux的命令地方,可以不用写script       

关于取值

取environment的值,env.xxx

取parameters的值,params.xxx

局部变量,比如定义为A,取值:${A}或者 $A

声明和定义工具

groovy 复制代码
environment {
        MY_MAVEN_SETTING = "xxx.xml"
        CURRENT_PATH = pwd()
        
    }
    parameters {
        // 准备部署的分支名,可以改成从Git上获取分支名
        choice(name: 'DEPLOY_BRANCH', choices: ['deploy_sit'], description: '选择需要的分支')
        booleanParam(name: 'DEPLOY_FRONT_FLAG', description: '是否发布前端')
        string description: '''需要发布的前端项目
1.a
2.b
4.b
多选输入编码,用逗号分隔,全部输入*号''', name: 'DEPLOY_FRONT_PROJECT'
    }
    tools {
        maven "my-maven"
        nodejs "node14"
        jdk "my-jdk1.8"
    }
    // 这里注意,tools下声明的 maven和nodejs的变量名是固定的,值是活动的,以实际为准

使用数据结构

定义类似与字典的数据结构

groovy 复制代码
def dict = [
                                'key1': 'value1',
                                'key2': 'values'
                        ]
// 遍历
dict.each{key,value->
                            echo "key:$key,value:$value"
                        }   
相关推荐
技术小齐4 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风4 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
落幕4 小时前
C语言-进程
linux·运维·服务器
chenbin5205 小时前
Jenkins 自动构建Job
运维·jenkins
java 凯5 小时前
Jenkins插件管理切换国内源地址
运维·jenkins
AI服务老曹5 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
sszdzq6 小时前
Docker
运维·docker·容器
book01216 小时前
MySql数据库运维学习笔记
运维·数据库·mysql
bugtraq20217 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
xmweisi7 小时前
【华为】报文统计的技术NetStream
运维·服务器·网络·华为认证