【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'
    }
}

参考

相关推荐
SelectDB9 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉6 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造