如何使用 Pipeline Utility Steps 插件更新现有 yaml 文件的内容

How to update the content of an existing yaml file with Pipeline Utility Steps plugin

在我的 jenkins 管道中,我正在使用 Pipeline Utility Steps 插件读取存储在 yaml 文件中的数据

我可以从文件中读取数据,现在我想更新值并将其写回文件,如下所示:

pipeline {
agent any

stages {

    stage('JOb B ....'){
        steps{
            script{
               def datas = readYaml file:"${WORKSPACE}/Version.yml"
               echo datas.MAJOR_VERSION //output is 111

               datas = ['MAJOR_VERSION': '222']
               writeYaml file:"${WORKSPACE}/Version.yml", data: datas
            }
        }//steps
    }//stage

}//stages

}//pipeline

但我收到错误 - Version.yml 已经存在:

java.nio.file.FileAlreadyExistsException: /var/lib/jenkins/workspace/t-cicd-swarm-example_hdxts-job-B/Version.yml already exist.
at org.jenkinsci.plugins.pipeline.utility.steps.conf.WriteYamlStep$Execution.run(WriteYamlStep.java:175)
at org.jenkinsci.plugins.pipeline.utility.steps.conf.WriteYamlStep$Execution.run(WriteYamlStep.java:159)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start[=11=](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)
Finished: FAILURE

好像只能写新文件,不能覆盖已有文件。如何从我上面显示的脚本更新现有 yaml 文件的内容?

您似乎需要在覆盖之前删除或重命名原始文件,因为 writeYaml 方法没有覆盖标志。

sh '''
  if [ -e Version.yaml ]; then
    rm -f Version.yaml
  fi
'''

根据最新文档。有一个参数可以用来覆盖指定文件的内容:

writeYaml: Write a yaml from an object.
...
overwrite (optional): Allow existing files to be overwritten. Defaults to false.

请参考:https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#writeyaml-write-a-yaml-from-an-object