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

参考

相关推荐
神奇侠20248 分钟前
基于Centos7.X系统端口占用处理
linux·运维·服务器
阿智@112 小时前
Node.js 助力前端开发:自动化操作实战
运维·前端·node.js·自动化
万万君2 小时前
Linux 更改Jenkins使用其他账户启动
linux·jenkins
赤叶丶秋枫2 小时前
Jenkins入门使用
运维·jenkins
紫菜(Nori)2 小时前
Jenkins Api Token 访问问题
运维·jenkins
love530love2 小时前
Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
linux·运维·windows
冷曦_sole2 小时前
linux-22 目录管理(二)rmdir命令,删除目录
linux·运维·服务器
群联云防护小杜2 小时前
服务器被攻击怎么办
运维·服务器·网络·网络协议·安全·web安全
IT 古月方源3 小时前
ospf 的 状态机详解
运维·网络·tcp/ip·智能路由器
九河云3 小时前
Amazon Bedrock Claude 3 在客户服务自动化中的应用方法
运维·人工智能·自动化·aws