我有一个groovy文件,我想从Jenkinsfile运行。
即加载脚本。groovy
但是,我不确定如何引用这个文件,如果它存储在与Jenkinsfile相同的目录中。我正在从git加载Jenkinsfile。我注意到它创建了一个名为workspace@script
的文件夹。它没有将其放在工作区目录中。我可以对文件夹进行硬编码,但我不确定这方面的规则,再次签出代码似乎有点多余。
java.io.FileNotFoundException: /opt/jenkins_home/jobs/my_job/workspace/script.groovy (No such file or directory)
默认情况下,它从工作区加载,而不是workspace@script
我正在尝试将BuildFlow脚本转换为管道(工作流)脚本。但我发现,这并不像复制和粘贴那么容易。
詹金斯档案
node {
//get parameters from Job
def builds = builds.tokenize(",")
def ip_address_node = ip_address_node.trim()
def port_node = port_node.trim()
def branch = branch.trim()
def workspace = pwd()
stage 'Checking out code from esb repository'
git branch: branch, url: 'ssh://git@giturl/integration_bus.git'
load '../workspace@script/esb_deploybar_pipeline/deploy_esb.groovy'
}
部署esb。groovy(这来自旧的buildflow,试图在管道中运行)
import groovy.transform.ToString
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
@ToString
class BarDeploy {
String barFile
String app
String integrationServer
}
//parse csv
def csvItemsApps = new HashSet<BarDeploy>();
def csvItemsLibs = new HashSet<BarDeploy>();
def deploymentMapFile = new File(workspace + "/ESB_Deployment_Map.csv")
def isFirstLine = true
stage 'Parsing ESB Deployment CSV'
deploymentMapFile.withReader { reader ->
while(line = reader.readLine()) {
if(isFirstLine)
{
isFirstLine = false
continue
}
csvLine = line.split(",")
app = csvLine[0]
intServer = csvLine[1]
def barDeploy = new BarDeploy()
barDeploy.app = app
barDeploy.integrationServer = intServer
csvItemsApps.add(barDeploy)
//get shared libs
if(csvLine.length > 2 && csvLine[2] != null)
{
def sharedLibs = csvLine[2].split(";")
sharedLibs.each { libString ->
if(!libString.isAllWhitespace())
{
def lib = new BarDeploy()
lib.app = libString
lib.integrationServer = intServer
csvItemsLibs.add(lib)
}
};
}
}
};
//get list of bar files to deploy from html and consolidate bar files to deploy with apps in csv
for (int i = 0; i < builds.size(); i+=3)
{
if(builds[i].equals("false"))
{
//Don't deploy bar if checkbox isn't selected
continue
}
foundInCSV = false
appToDeploy = builds[i + 1]
barFileToDeploy = builds[i + 2]
iterator = csvItemsApps.iterator()
while (iterator.hasNext())
{
barDeploy = iterator.next()
if(appToDeploy.equalsIgnoreCase(barDeploy.app))
{
barDeploy.barFile = barFileToDeploy
foundInCSV = true
}
}
iterator = csvItemsLibs.iterator()
while (iterator.hasNext())
{
barDeploy = iterator.next()
if(appToDeploy.equalsIgnoreCase(barDeploy.app))
{
barDeploy.barFile = barFileToDeploy
foundInCSV = true
}
}
if(foundInCSV == false)
{
throw new RuntimeException("App: " + appToDeploy + " not found in ESB_Deployment_Map.csv. Please add CSV Entry.")
}
}
//Do deploy, deploy shared libs first
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsLibs)
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsApps)
def deploy(ip_address_node,port_node,branch,deployItem,env_key)
{
def integrationServer = deployItem.integrationServer
def app = deployItem.app
def barFile = deployItem.barFile
if(barFile == null)
{
return;
}
println("Triggering Build -> ESB App = " + app + ", Branch = "
+ branch + ", Barfile: " + barFile + ", Integration Server = " + integrationServer + ", IP Address: " + ip_address_node
+ ", Port: " + port_node + ", Env_Key: " + env_key)
build_closure = { ->
build("esb_deploybar",
ip_address_node: ip_address_node, port_node: port_node,
integrationServer: integrationServer, branch: branch, app: app, barFile: barFile, env_key: env_key)
}
return build_closure
}
def deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItems)
{
def build_closures = []
iterator = csvItems.iterator()
while (iterator.hasNext())
{
barDeploy = iterator.next()
def build_closure = deploy(ip_address_node,port_node,branch,barDeploy,env_key)
if(build_closure != null)
{
build_closures.add(build_closure)
}
}
if(build_closures?.size() > 0)
{
parallel(build_closures)
}
}
如果此脚本。groovy文件与Jenkinsfile一样位于项目的根目录中,它将从git中提取到与Jenkinsfile相同的文件夹中。因此,您使用的命令应该可以正常工作。
您是否收到一些错误?如果是,请提供更多详细信息。
编辑:现在我可以看到您的Jenkinsfile中有什么,我可以看到您正在签出一个名为integration\u bus的git项目,它是groovy脚本所在的位置。您可以如下所示指定检出的位置:
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'esb_deploy']], submoduleCfg: [], userRemoteConfigs: [[url: 'ssh://git@giturl/integration_bus.git']]])
而不是你所拥有的
git branch: branch, url: 'ssh://git@giturl/integration_bus.git'
然后,您应该能够像下面这样引用esb\u deploy文件夹中的groovy脚本
load 'esb_deploy/esb_deploybar_pipeline/deploy_esb.groovy'
如果部署esb。groovy文件存储在与Jenkinsfile相同的SCM中,您可以执行以下操作:
node {
def workspace = pwd()
load "${workspace}@script/esb_deploybar_pipeline/deploy_esb.groovy"
}
有一种情况我没有看到任何人提到。这就是当作业应该在Jenkins代理/从机上运行而不是在主机上运行时,如何加载Groovy脚本。
由于master是从SCM签出Jenkins管道项目的,因此Groovy脚本只能在master的文件系统中找到。因此,虽然这可以工作:
node {
def workspace = pwd()
def Bar = load "${workspace}@script/Bar.groovy"
Bar.doSomething()
}
这只是一个巧合,因为从SCM克隆管道的节点与尝试在其中加载groovy脚本的节点是同一个节点。但是,只需添加要在其上执行的其他代理的名称:
node("agent1"){
def workspace = pwd()
def Bar = load "${workspace}@script/Bar.groovy"
Bar.doSomething()
}
将失败,导致:
java.io.IOException: java.io.FileNotFoundException: /Jenkins/workspace/Foo_Job@script/Bar.groovy (No such file or directory)
这是因为这条路径:
/Jenkins/workspace/Foo_Job@script/
只存在于Jenkins大师的盒子上。不在运行agent1的框中。
因此,如果您面临此问题,请确保将groovy脚本从master加载到全局声明的变量中,以便代理可以使用它们:
def Bar
node {
def workspace = pwd()
if(isUnix()){
Bar = load "${workspace}@script/Bar.groovy"
}
else{
Bar = load("..\\workspace@script\\Bar.groovy")
}
}
node("agent1"){
Bar.doSomething()
}
注意:用于在节点之间传递模块的变量必须在节点块之外声明。
问题内容: 我在詹金斯中使用管道插件。我有,但我想致电以获取值列表。 如何在Jenkinsfile中调用myNumbers()Java函数? 还是我需要有一个单独的Groovy脚本文件,然后将该文件放置在具有Test类的java jar中? 我的Jenkinsfile: 问题答案: 您可以将逻辑编写在Groovy文件中,该文件可以保存在Git存储库,管道共享库或其他地方。 例如,如果您的存储库中有
我有一个用于多分支管道作业的声明性管道,并且我对创建一个 cron 触发器感兴趣。目前,我已经使用以下cron字符串为主分支提供了cron触发器: 我对修改cron字符串感兴趣,这样当分支名称是master或者分支名称包含字符串release时,就会触发cron 我想知道我如何才能做到这一点,将感谢您的帮助。提前谢谢你,阿龙
java.lang.NoSuchMethodError:在步骤中找不到这样的DSL方法“PublishOversh”[archive,bat,build,catchError,checkout,deleteDir,dir,dockerFingerprintFrom,Docker FingerPrintRun,echo,emailext,EmailExtrecients,envVarsForTool
问题内容: 对于多分支项目,我有一个声明性管道脚本,在该脚本中,我想读取文本文件并将结果存储为字符串变量,以供管道的后续步骤访问。使用摘要生成器,我尝试执行以下操作: 为此,这将是我的字符串。 在Jenkins控制台输出中出现错误: 我是否需要使用一个步骤来将Jenkins环境变量的输出设置为?如果是这样,怎么办? 谢谢 问题答案: 该错误是由于只允许您在指令中使用管道步骤。我知道一种解决方法是使
问题内容: 我正在研究Jenkins Pipeline:Multibranch的功能。据说最近采取的步骤可能有用,但是我无法了解它的工作原理和目的。 它的提示消息似乎不太清楚: 更新运行此步骤的作业的属性。多分支工作流主要有用,因此Jenkinsfile本身可以编码静态作业配置。 因此,我以此为脚本创建了一个新管道(直接粘贴到Jenkins中而不是SCM中): 我运行了它,但没有任何反应,作业没有
问题内容: 在安装了“版本号插件”的Jenkinsfile中尝试此步骤: 并得到此错误: 在Jenkinsfile中使用此插件的正确方法是什么? 问题答案: 您需要使用它作为步骤。 看一看https://your_jenkins_url.com/pipeline- syntax/ 并检查已剪切生成器中VersionNumber步骤的所有选项。