当前位置: 首页 > 知识库问答 >
问题:

从属性文件加载属性并使其在整个作业/管道中可用-Jenkins声明性语法

晏正豪
2023-03-14

我的要求很简单,我只是想外部化一些“值”以使我的Jenkinsfile更可重用,为此我需要从Jenkinsfile旁边的文件中加载属性,并确保这些属性在管道中的任何地方都可用。我对groovy和Jenkins代码仍然是新手,但从未想过如此简单的事情会如此困难。我在脚本安全插件中启用了一些方法,但以下代码(以及我尝试过的几种变体)总是会导致错误或打印null或给我NPE。我尝试了多种组合,下面的代码只是其中之一。

properties = null

@NonCPS
def loadProperties() {
    checkout scm
    File propertiesFile = new File('${workspace}/pipeline.properties')
    propertiesFile.withInputStream {
            properties.load(propertiesFile)
    }
}

pipeline {
    agent none

    stages {

        stage ('prepare') {
            agent any

            steps {
                script {
                loadProperties()
                echo "${properties['repo']}"
                }
            }
        }
        stage('Build') {

            agent any

            steps {
                sh 'echo ${properties.repo}'
            }

        }
    }
}

共有3个答案

凌通
2023-03-14

使用“pipeline utility steps”插件,可以定义可用于所有阶段的常规变量。例如,让道具。txt格式:

version=1.0
fix=alfa

并将脚本和声明性Jenkins管道混合为:

def props
def VERSION
def FIX
def RELEASE

node {
   props = readProperties file:'props.txt'
   VERSION = props['version']
   FIX = props['fix']
   RELEASE = VERSION + "_" + FIX
}

pipeline {
   stages {
      stage('Build') {
         echo ${RELEASE}
      }
   }
}
齐意致
2023-03-14

感谢您的回答#1。这很有帮助,我使用了选项2。我遇到了一些问题,希望与大家分享我的解决方案:

1) 我在声明性管道的管道部分添加了一个“准备”阶段:

stage ('Prepare') {
   steps {
      script {
         properties = readProperties file: 'scripts/jenkins-pipelines/branch-specific.properties'
         echo "Running build ${JOB_NAME} # ${BUILD_NUMBER} on git repo ${properties.GitURL} branch ${properties.nextBranchName}"
       }
     }
   }
}

属性文件的格式为:

nextBranchName=next
stableBranchName=master
GitURL=git@github.com:foo.git

请注意,属性上没有报价。

我在其他步骤、阶段和post中也使用了${properties.nextBranchName}属性。如回答1所述:需要安装“pipeline utility steps”插件

孔华池
2023-03-14

我想出了两种在Jenkins管道中实现属性外部化的方法。您可以根据主要差异选择您的选择。

1) 完全使用groovy代码。此代码段要求您在脚本安全插件附带的“过程中脚本审批”中启用多个方法签名,因此只有在适当考虑后才能执行此操作。

properties = null     

def loadProperties() {
    node {
        checkout scm
        properties = new Properties()
        File propertiesFile = new File("${workspace}/pipeline.properties")
        properties.load(propertiesFile.newDataInputStream())
        echo "Immediate one ${properties.repo}"
    }
}

pipeline {
    agent none

    stages {
        stage ('prepare') {
            agent any

            steps {
                script {
                    loadProperties()
                    echo "Later one ${properties.branch}"
                }
            }
        }
        stage('Build') {
            agent { label 'master'  }

            steps {
                // works fine. properties is available everywhere
                echo properties.branch
            }           
        }
    }
}

2) 使用管道实用程序步骤插件-管道插件套件默认包括这一点,它允许以更好的方式加载属性,而无需启用安全异常。我推荐这种方法。

properties = null

def loadProperties() {
    node {
        checkout scm
        properties = readProperties file: 'pipeline.properties'
        echo "Immediate one ${properties.repo}"
    }
}

pipeline {
    agent none

    stages {           
        stage ('prepare') {
            agent any

            steps {
                script {
                    loadProperties()
                    echo "Later one ${properties.ansible}"
                }
            }
        }
        stage('Build') {

            agent any

            steps {
                echo properties.branch
            }

        }
    }
}
 类似资料:
  • 问题内容: 我的要求很简单,我只想外部化一些“值”以使我的Jenkinsfile更可重用,为此,我需要从一个文件中加载属性,该文件将紧挨Jenkinsfile,并确保这些属性是在管道中的任何地方都可用。我仍然对groovy和Jenkins代码不熟悉,但是从未想到过如此简单的事情会如此困难。我在脚本安全性插件中启用了一些方法,但是以下代码(以及我尝试过的几种变体)始终会引起错误或显示null或给我N

  • 问题内容: 我的Jenkins 2.19.4使用管道:声明式代理程序API 1.0.1。如果您无法定义变量来分配读取的属性,那么如何使用readProperties? 例如,要捕获SVN版本号,我目前以脚本样式使用以下代码捕获它: 然后我可以使用: 由于以声明式定义svnProp是不合法的,因此如何使用readProperties? 问题答案: 您可以使用标记内的步骤来运行任意管道代码。 所以符合

  • 我在尝试添加

  • 我已经在Jenkins上创建了一个基本的声明性管道。当我运行构建时,它会抛出以下错误 Jenkins服务器使用最新版本的默认插件设置为默认。Jenkinsfile如下所示 当Jenkins读取Jenkinsfile时,看起来块失败了,这在Jenkinsfile看起来很混乱。

  • 我有一个Jenkins声明性管道,我一直在Jenkins master上运行,它工作得很好。但是,现在我已经开始尝试在从属节点上执行此操作,管道中调用的groovy脚本无法访问工作区中的文件。 我的文件看起来像这样。。。 我可以在从机上看到它正在创建工作区,从git执行签出,并正确执行脚本。但是,如果脚本中的某些内容尝试与工作区中的文件交互,则会失败。 如果我有像这样简单的东西... ...它说找

  • 问题内容: 我正在尝试从ANT任务编写脚本。这个脚本做了一些svn-stuff,然后应该设置outputproperty : 我想使用此属性在jenkins的构建后步骤中通过电子邮件将其发送给某些收件人,但是我似乎无法在Jenkins中使用它。我从中收到的邮件仅作为内容。 不知道这是否有帮助,但是在我的ANT脚本的顶部,我用 我做过的另一种方法是通过将我的属性声明为并分别设置exec目标的输出属性