如何编写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"
                        }   
相关推荐
dntktop30 分钟前
隐私保护+性能优化,RyTuneX 让你的电脑更快更安全
运维·windows
fajianchen1 小时前
大厂案例——腾讯蓝鲸DevOps类应用的设计与实践
运维·devops
黯然~销魂1 小时前
root用户Linux银河麒麟服务器安装vnc服务
linux·运维·服务器
huaweichenai2 小时前
windows下修改docker的镜像存储地址
运维·docker·容器
�时过境迁,物是人非3 小时前
ECS中实现Nginx四层和七层负载均衡以及ALB/NLB实现负载均衡
运维·nginx·负载均衡
Zfox_3 小时前
【Linux】进程间关系与守护进程
linux·运维·服务器·c++
大新新大浩浩3 小时前
jenkins平台使用Login Theme、Customizable Header插件定制修改登陆页图片文字及首页标题
运维·servlet·jenkins
laimaxgg3 小时前
Linux关于华为云开放端口号后连接失败问题解决
linux·运维·服务器·网络·tcp/ip·华为云
浪小满3 小时前
linux下使用脚本实现对进程的内存占用自动化监测
linux·运维·自动化·内存占用情况监测
艾杰Hydra4 小时前
LInux配置PXE 服务器
linux·运维·服务器