六、流水线简单使用

发布时间 2023-05-23 20:31:14作者: shigp1

一、简单例子

Jenkins流水线是通过Jenkinsfile配置文件配置的。Jenkinsfile文遵循Groovy风格的规范。项目从开发到部署一般都经历,构建,测试,部署三个阶段。现在用流水线模拟这个过程(使用上个例子的my_pipeline项目):
 

 

 

将Jenkinsfile改成:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

 

 

构建成功后,查看控制台输出。stages是一系列阶段,steps是每个阶段要执行的步骤。

二、如何创建Jenkins流水线

  1. 通过Blue Ocean -在Blue Ocean 中建立管道项目后,Blue Ocean UI可以帮助您编写管道的Jenkinsfile并将其提交给源代码管理。
  2. 通过经典UI,您可以通过经典UI直接在Jenkins中输入基本的Pipeline。
  3. 在SCM中,您可以手动编写Jenkinsfile,并将其提交到项目的源代码管理存储库中。

Blue Ocean是Jenkins 插件,后面再谈。上个例子就是通过经典UI创建的流水线。

三、使用环境变量

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

当前生成正在运行的节点的名称。

WORKSPACE

工作空间的绝对路径

例子:修改my_pipeline的Jenkinsfile为:
 

 

pipeline {
    agent any

    stages {
        stage('Example') {
            steps {
                echo "BUILD_ID is  ${env.BUILD_ID}"
                echo "BUILD_NUMBER is  ${env.BUILD_NUMBER}"
                echo "BUILD_TAG is  ${env.BUILD_TAG}"
                echo "BUILD_URL is  ${env.BUILD_URL}"
                echo "EXECUTOR_NUMBER is  ${env.EXECUTOR_NUMBER}"
                echo "JAVA_HOME is  ${env.JAVA_HOME}"
                echo "JENKINS_URL is  ${env.JENKINS_URL}"
                echo "JOB_NAME is  ${env.JOB_NAME}"
                echo "NODE_NAME is  ${env.NODE_NAME}"
                echo "WORKSPACE is  ${env.WORKSPACE}"
            }
        }
    }
}

构建完成后查看控制台输出:
 

 

上面的是内置的环境变量,现在来自定义环境变量,修改Jenkinsfile为:

pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            steps {
                echo "CC is ${env.CC}"
            }
        }
    }
}

构建成功后查看控制台输出:
 

 

环境变量可以在运行时设置,并且可以由shell脚本(sh)、Windows批处理脚本(bat)和PowerShell脚本(PowerShell)使用。每个脚本都可以是returnStatus或returnStdout。修改Jenkinsfile为:

pipeline {
    agent any
    environment { 
         CC = """${sh(
            returnStdout: true,
            script: 'echo "clang"'
        )}""" 
   
     EXIT_STATUS = """${sh(
            returnStatus: true,
            script: 'exit 1'
        )}"""
    }
    stages {
        stage('Example') {
            steps {
                echo "CC is ${env.CC}"
                echo "EXIT_STATUS is ${env.EXIT_STATUS}"
            }
        }
    }
}

构建成功后查看控制台输出:
 

 

字符串插值

Jenkins Pipeline使用与Groovy相同的规则进行字符串插值。Groovy支持用单引号或双引号声明字符串,例如:

def singlyQuoted = 'Hello'
def doublyQuoted = "World"

只有后一个字符串将支持基于美元符号($)的字符串插值,例如:

def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"

输出:

Hello Mr. ${username}
I said, Hello Mr. Jenkins
敏感环境变量的插值

Groovy字符串插值可能会泄露敏感的环境变量(即凭据)。这是因为敏感的环境变量将在Groovy评估期间进行插值,并且环境变量的值可能比预期的更早可用,从而导致敏感数据在各种上下文中泄漏。要避免字符串可以使用单引号。

通过插值注入

另一个注意事项。对用户控制的变量使用Groovy字符串插值,步骤将参数传递给命令解释器,如sh、bat、powershell或pwsh步骤,可能会导致类似于SQL注入的问题。当使用Groovy插值将包含特殊字符(例如/$&%^><|;)的用户控制变量(通常是环境变量,通常是传递给构建的参数)传递给sh、bat、powershell或pwsh步骤时,就会发生这种情况。举个简单的例子:

pipeline {
  agent any
  parameters {
    string(name: 'STATEMENT', defaultValue: 'hello; ls /', description: 'What should I say?')
  }
  stages {
    stage('Example') {
      steps {
        sh("echo ${params.STATEMENT}")
      }
    }
  }
}

执行sh时会执行echo hello; ls /。会输出hello,同时会将根目录列举出来。修改Jenkinsfile,构建项目查看控制台输出:
 

 

使用参数

声明性管道支持开箱即用的参数,允许管道在运行时通过parameters指令接受用户指定的参数。修改Jenkinsfile为:

pipeline {
    agent any
    parameters {
        string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
    }
    stages {
        stage('Example') {
            steps {
                echo "${params.Greeting} World!"
            }
        }
    }
}

构建成功后查看控制台输出: