我的要求很简单,我只是想外部化一些“值”以使我的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}'
}
}
}
}
使用“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}
}
}
}
感谢您的回答#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”插件
我想出了两种在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目标的输出属性