【Jenkins】Pipeline 简单使用

发布时间:2023年12月18日

什么是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中执行的所有工作。

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的目录),可以在其中对从源控制中检出的文件进行工作。
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中的任何键一样引用或使用这些环境变量,例如:

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

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

2)脚本化Pipeline

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

参考

文章来源:https://blog.csdn.net/wlddhj/article/details/135070031
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。