【发布时间】:2020-05-23 14:32:01
【问题描述】:
在我的管道中,我使用 Pipeline Utility Step 插件的 readJSON 和 writeJSON 方法在管道阶段读取/写入文件。 对于普通管道,一切正常。但是,当我创建“多分支管道”时,同一管道会失败。当后续阶段尝试使用 readJSON 读取应该由前一阶段生成的文件时,会发生故障。奇怪的部分是:在一个阶段内,生成的文件可供命令使用(命令 aws ecs register-task-definition 成功)BUT 不存在于节点上的工作区 /var/jenkins_home/workspace/TestPipeline然后。
为了关注失败,我只粘贴管道的相关阶段。
stage('RegisterTaskDefinition') {
agent any
steps {
sh 'printenv'
script {
def templateFile = env.TEMPLATE_BASE_PATH +'/' + TASK_DEF_TEMPLATE
def taskDefinitionTemplate = readJSON(file: templateFile)
taskDefinitionTemplate.taskRoleArn = env.TASK_ROLE_ARN
taskDefinitionTemplate.executionRoleArn = env.EXECUTION_ROLE_ARN
taskDefinitionTemplate.containerDefinitions[0].image = "NewImage"
taskDefinitionTemplate.containerDefinitions[0].portMappings[0].containerPort = env.APP_PORT.toInteger()
taskDefFile = env.TEMPLATE_BASE_PATH + '/' + env.TASK_DEFINITION_FILE
writeJSON(file: taskDefFile, json: taskDefinitionTemplate)
def registerTaskDefinitionOutput = sh (
script: "aws ecs register-task-definition --cli-input-json file://${taskDefFile}",
returnStdout: true
).trim()
echo "Register Task Def result: ${registerTaskDefinitionOutput}"
def registerTaskDefOutputFile = env.TEMPLATE_BASE_PATH + '/registerTaskDefOutput.json'
echo "********************************"
sh 'pwd'
writeJSON(file: registerTaskDefOutputFile, json: registerTaskDefinitionOutput, pretty: 2)
echo "********************************${registerTaskDefOutputFile}"
}
}
}
stage('CreateTaskSet') {
agent any
steps{
script{
def registerTaskDefOutputFile = env.TEMPLATE_BASE_PATH + '/' + env.REGISTER_TASK_DEF_OUTPUT
def taskSetTemplateFile = env.TEMPLATE_BASE_PATH + '/' + env.TASK_SET_TEMPLATE_FILE
def taskSetFile = env.TEMPLATE_BASE_PATH + '/' + env.TASK_SET_FILE
def registerTaskDefinitionOutput = readJSON(file: registerTaskDefOutputFile)
def taskSetTemplateJson = readJSON(file: taskSetTemplateFile)
taskSetTemplateJson.taskDefinition = registerTaskDefinitionOutput.taskDefinition.taskDefinitionArn
taskSetTemplateJson.loadBalancers[0].containerPort = env.APP_PORT.toInteger()
taskSetTemplateJson.loadBalancers[0].targetGroupArn = targetGroupArn
writeJSON(file: taskSetFile, json: taskSetTemplateJson, pretty: 2)
}
}
}
澄清一下,RegisterTaskDefinition 阶段成功,CreateTaskSet 阶段失败。
产生的异常是:
java.io.FileNotFoundException: /var/jenkins_home/workspace/TestPipeline/infrastructure/registerTaskDefOutput.json does not exist.
at org.jenkinsci.plugins.pipeline.utility.steps.json.ReadJSONStepExecution.doRun(ReadJSONStepExecution.java:82)
at org.jenkinsci.plugins.pipeline.utility.steps.AbstractFileOrTextStepExecution.run(AbstractFileOrTextStepExecution.java:32)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我有以下问题:
- 什么解释了两种管道类型的行为差异?
- 对于普通的管道,我可以在节点上的
/var/jenkins_home/workspace/TestPipeline下看到管道产生的文件。对于“多分支管道”,情况并非如此。 Jenkins 将哪个目录用于“多分支管道”? - 哪些日志可以帮助我诊断问题?
我找不到任何文档来解释这两种管道类型的行为差异。如有任何建议,我将不胜感激。
【问题讨论】:
标签: jenkins jenkins-pipeline jenkins-plugins jenkins-groovy multibranch-pipeline