【Jenkins】Pipeline 简单使用

什么是Jenkins pipeline

Jenkins Pipeline是Jenkins的一个插件,它允许你以代码的方式定义和管理持续集成和交付流水线。通过Jenkins Pipeline,你可以将整个软件交付过程定义为一个可重复、可扩展和可管理的流水线。这个流水线可以包括构建、测试、部署和其他各种操作,使得软件交付过程更加自动化和可靠。Jenkins Pipeline支持使用Groovy语言编写流水线脚本,你可以通过代码的方式定义流水线的各个阶段和操作,以及它们的顺序和依赖关系。这使得流水线的定义更加灵活和可维护,同时也方便了版本控制和团队协作。

Pipeline 关键概念

以下是Jenkins Pipeline的关键概念,它们与Pipeline语法(请参阅下文概述)密切相关。

  • 管道(Pipeline):一个管道是一个用户定义的CD管道模型。管道的代码定义了整个构建过程,通常包括构建应用程序、测试应用程序以及部署应用程序的阶段。
  • 节点(Node):节点是一个属于Jenkins环境的机器,并且能够执行管道。
  • 阶段(Stage):阶段块定义了整个管道中执行的概念上不同的任务子集(例如"构建"、"测试"和"部署"阶段),许多插件使用它来可视化或呈现Jenkins Pipeline的状态/进度。
  • 步骤(Step):一个单独的任务。从根本上说,一个步骤告诉Jenkins在某个特定的时间点(或过程中的"步骤")做什么。例如,要执行shell命令make,请使用sh步骤:sh 'make'。当一个插件扩展Pipeline DSL时,1 这通常意味着该插件已经实现了一个新的步骤。

以下Pipeline代码框架说明了Declarative Pipeline语法和Scripted Pipeline语法之间的根本区别。

请注意,阶段和步骤(上文)是Declarative和Scripted Pipeline语法中都通用的元素。

Jenkins Pipeline 基础示例

Jenkins Pipeline 分声明式和脚本式两种,写法差不多。

1)声明式 Pipeline 示例

在声明式 Pipeline语法中,pipeline块定义了整个Pipeline中执行的所有工作。

python 复制代码
pipeline {
    agent any // 在任何可用的代理上执行此Pipeline或其任何阶段
    stages {
        stage('Build') {
            steps {
                 git branch: 'master', credentialsId: 'gitee_wlddhj', url: 'https://gitee.com/personal_practice/demo.git'
            }
        }
        stage('Test') {
            steps {
                sh label: '', script: '''
                mvn clean package  -Dmaven.test.skip=true -f pom.xml
                '''
            }
        }
        stage('Deploy') {
            steps {
                sh label: '', script: '''
                cp target/*.jar /data/product/deploy/
                '''
            }
        }
    }
}

2)脚本式 Pipeline 示例

在脚本式 Pipeline语法中,一个或多个node块在整个Pipeline中执行核心工作。虽然这不是脚本式 Pipeline语法的强制要求,但将Pipeline的工作限制在一个node块中可以做两件事:

  • 通过将项目添加到Jenkins队列来安排块中包含的步骤运行。一旦节点上的执行器空闲,步骤就会运行。
  • 创建一个工作区(特定于该特定Pipeline的目录),可以在其中对从源控制中检出的文件进行工作。
python 复制代码
node {
    stage("pull code") {
       git branch: 'master', credentialsId: 'gitee_wlddhj', url: 'https://gitee.com/personal_practice/demo.git'
    }
    stage("build") {
        sh label: '', script: '''
        mvn clean package  -Dmaven.test.skip=true -f pom.xml
        '''
    }    
    stage("release") {
        sh label: '', script: '''
        cp target/*.jar /data/product/deploy/
        '''
    }
    stage("start") {
        ansiColor('xterm') {
        sh "JENKINS_NODE_COOKIE=dontKillMe   nohup java -jar /data/product/deploy/spring-demo-0.0.1-SNAPSHOT.jar  > demo.log &"
        }
    }
}

注意:在shell环境中使用nohup,并且& 某个程序后,会后台执行,退出当前链接后程序依然可以执行。 但是在Jenkins pipeline中,nohup在Jenkins编译任务结束时,运行的程序会自动退出。针对该解决办法是设置系统环境变量JENKINS_NODE_COOKIE=dontKillMe

Jenkins 环境变量

Jenkins Pipeline通过全局变量env来公开环境变量,在Jenkinsfile的任何地方都可以使用。完整的可在Jenkins Pipeline中访问的环境变量列表在${YOUR_JENKINS_URL}/pipeline-syntax/globals#env中有详细说明,包括:

BUILD_ID

当前构建的ID,对于在Jenkins版本1.597+中创建的构建与BUILD_NUMBER相同

BUILD_NUMBER

当前构建的编号,例如"153"

BUILD_TAG

形如jenkins-${JOB_NAME}-${BUILD_NUMBER}的字符串,方便放入资源文件、jar文件等以便更容易识别

BUILD_URL

可以找到此构建结果的URL(例如http://buildserver/jenkins/job/MyJobName/17/)

EXECUTOR_NUMBER

标识当前执行器(在同一台机器上的执行器)执行此构建的唯一编号。这是您在"构建执行器状态"中看到的编号,只是编号从0开始,而不是1

JAVA_HOME

如果您的任务配置为使用特定的JDK,则此变量设置为指定JDK的JAVA_HOME。当设置了此变量时,PATH也会更新以包括JAVA_HOME的bin子目录

JENKINS_URL

Jenkins的完整URL,例如https://example.com:port/jenkins/(注意:仅当在"系统配置"中设置了Jenkins URL时可用)

JOB_NAME

此构建的项目名称,例如"foo"或"foo/bar"

NODE_NAME

当前构建正在运行的节点的名称。对于Jenkins控制器,设置为'master'。

WORKSPACE

工作空间的绝对路径

可以像访问Groovy Map中的任何键一样引用或使用这些环境变量,例如:

groovy 复制代码
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
            }
        }
    }
}

设置环境变量

在Jenkins Pipeline中设置环境变量的方法取决于使用的是声明式Pipeline还是脚本化Pipeline。

声明式Pipeline支持environment指令,而脚本化Pipeline的用户必须使用withEnv步骤。

1)声明式Pipeline

groovy 复制代码
pipeline {
    agent any
    environment {
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

2)脚本化Pipeline

groovy 复制代码
node {
    /* .. snip .. */
    withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
        sh 'mvn -B verify'
    }
}

参考

相关推荐
EMTime17 小时前
Docker运行OpenWRT
运维·docker·容器
lolo大魔王18 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器
zyl8372120 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry20 小时前
MGRE实验
运维·服务器
stolentime21 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
bush41 天前
嵌入式linux学习记录四
linux·运维·学习
lihao lihao1 天前
软硬链接
linux·运维·服务器
TOWE technology1 天前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子1 天前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构
大明者省1 天前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记