栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Jenkinsfile中的奇怪变量作用域行为

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Jenkinsfile中的奇怪变量作用域行为

TL; DR

  • 定义的变量
    def
    主脚本主体不能从其他方法来访问。
  • 定义的变量 ,而不
    def
    能够直接通过任何方法甚至从不同的脚本访问。这是一个坏习惯。
  • 使用
    def
    @Field
    注释定义的变量可以直接从同一脚本中定义的方法访问。

说明

当groovy编译该脚本时,它实际上将所有内容移动到一个 大致 类似于以下内容的类

class script1 {    def pr() {        def another_var = "another " + some_var        echo "${another_var}"    }    def run() {        def some_var = "some value"        pipeline { agent any stages {     stage ("Run") {         steps {  pr()         }     } }        }    }}

您可以看到这

some_var
显然超出了范围,因为
pr()
它是另一种方法中的局部变量。

在没有定义变量的 情况下

def
,实际上 没有 将该变量放入脚本的绑定中(所谓的 绑定变量 )。因此,当groovy
pr()
首先执行方法时,它将尝试查找具有名称的局部变量,
some_var
如果该变量不存在,则尝试在Binding中找到该变量(因为您没有定义便存在该变量
def
)。

绑定变量被认为是不好的做法,因为如果您加载多个脚本(

load
步骤),则在所有这些脚本中都可以访问绑定变量,因为Jenkins对所有脚本共享相同的绑定。更好的选择是使用
@Field


注释。这样,您可以使一个脚本中的所有方法都可以访问变量,而无需将其暴露给其他脚本。

import groovy.transform.Field@Field def some_var = "some value"def pr() {    def another_var = "another " + some_var    echo "${another_var}"}//your pipeline

当groovy将这个脚本编译成一个类时,它将看起来像这样

class script1 {    def some_var = "some value"    def pr() {        def another_var = "another " + some_var        echo "${another_var}"    }    def run() {        //your pipeline    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号