一、环境变量

1.1 静态变量

Jenkins 有许多内置变量可以直接在 Jenkinsfile 中使用,可以通过 JENKINS_URL/pipeline-syntax/globals#env 获取完整列表。目前比较常用的环境变量如下:

  • BUILD_ID:当前构建的 ID,与 Jenkins 版本 1.597+中的 BUILD_NUMBER 完全相同;
  • BUILD_NUMBER:当前构建的ID,和 BUILD_ID一致;
  • BUILD_TAG:用来标识构建的版本号,格式为:jenkins-${JOB_NAME}-${BUILD_NUMBER}, 可以对产物进行命名,比如生产的 jar 包名字、镜像的TAG 等;
  • BUILD_URL:本次构建的完整 URL,比如:http://buildserver/jenkins/job/MyJobName/17/;
  • JOB_NAME:本次构建的项目名称;
  • NODE_NAME:当前构建节点的名称;
  • JENKINS_URL:Jenkins 完整的URL,需要在 System Configuration 中设置;
  • WORKSPACE:执行构建的工作目录。

上述变量会保存在一个 Map 中,可以使用 env.BUILD_ID 或 env.JENKINS_URL 引用某个内置变量:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any

    stages {
        stage('Example') {
            steps {
                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
            }
        }
    }
}

对应的脚本式流水线如下:

// Jenkinsfile (Scripted Pipeline)
node {
    echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
}

除了上述默认的环境变量,也可以手动配置一些环境变量:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any

    environment {
        CC = 'clang'
    }

    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

上述配置了两个环境变量,一个 CC 值为 clang,另一个是 DEBUG_FLAGS 值为-g。但是两者定义的位置不一样,CC 位于顶层,适用于整个流水线,而 DEBUG_FLAGS 位于 stage 中,只 适用于当前 stage。

1.2 动态变量

动态变量是根据某个指令的结果进行动态赋值,变量的值根据指令的执行结果而不同。如下所示:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any

    environment {
        // 使用 returnStdout
        CC = """${sh(
                returnStdout: true,
                script: 'echo "clang"'
            )}"""

        // 使用 returnStatus
        EXIT_STATUS = """${sh(
                returnStatus: true,
                script: 'exit 1'
            )}"""
    }

    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
  • returnStdout:将命令的执行结果赋值给变量,比如上述的命令返回的是 clang,此时 CC 的值为“clang ”。注意后面多了一个空格,可以用.trim()将其删除;
  • returnStatus:将命令的执行状态赋值给变量,比如上述命令的执行状态为 1,此时 EXIT_STATUS 的值为 1。

二、凭证管理

Jenkins 的声明式流水线语法有一个 credentials()函数,它支持 secret text(加密文本)、username 和 password(用户名和密码)以及 secret file(加密文件)等。

2.1 加密文本

本实例演示将两个 Secret 文本凭证分配给单独的环境变量来访问 Amazon Web 服务,需要提前创建这两个文件的 credentials,Jenkinsfile 文件的内容如下:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent {
        // Define agent details here
    }

    environment {
        AWS_ACCESS_KEY_ID = credentials('jenkins-aws-secret-key-id')
        AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
    }

    stages {
        stage('Example stage 1') {
            steps {
                // Add steps here
            }
        }

        stage('Example stage 2') {
            steps {
                // Add steps here
            }
        }
    }
}

说明: 上述示例定义了两个全局变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY, 这两个变量引用的是 credentials 的两个加密文本,并且这两个变量均可以在 stages 直接引用(通 过$AWS_SECRET_ACCESS_KEY 和$AWS_ACCESS_KEY_ID)。

注意:如果在 steps 中使用 echo $AWS_ACCESS_KEY_ID,此时返回的是****,加密内容不 会被显示出来。

2.2 用户名和密码

本示例用来演示 credentials 账号密码的使用,比如使用一个公用账户访问 Bitbucket、GitLab、 Harbor 等。假设已经配置完成了用户名密码形式的 credentials,凭证 ID 为 jenkins-bitbucketcommon-creds。

可以用以下方式设置凭证环境变量(BITBUCKET_COMMON_CREDS 名称可以自定义)

environment {
    BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
}

上述的配置会自动生成 3 个环境变量:

  • BITBUCKET_COMMON_CREDS:包含一个以冒号分隔的用户名和密码,格式为 username:password;
  • BITBUCKET_COMMON_CREDS_USR:仅包含用户名的附加变量;
  • BITBUCKET_COMMON_CREDS_PSW:仅包含密码的附加变量。

此时,调用用户名密码的 Jenkinsfile 如下:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent {
        // Define agent details here
    }

    stages {
        stage('Example stage 1') {
            environment {
                BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
            }
            steps {
                // Add steps here
            }
        }

        stage('Example stage 2') {
            steps {
                // Add steps here
            }
        }
    }
}

注意:此时环境变量的凭证仅作用于 stage 1,也可以配置在顶层对全局生效

2.3 加密文件

需要加密保存的文件,也可以使用 credential,比如链接到 Kubernetes 集群的 kubeconfig 文件等。

假如已经配置好了一个kubeconfig文件,此时可以在Pipeline中引用该文件:

// Jenkinsfile (Declarative Pipeline)
pipeline {
    agent {
        // Define agent details here
    }

    environment {
        MY_KUBECONFIG = credentials('my-kubeconfig')
    }

    stages {
        stage('Example stage 1') {
            steps {
                sh "kubectl --kubeconfig $MY_KUBECONFIG get pods"
            }
        }
    }
}