如何在 Jenkins 中为工件添加时间戳

How to add timestamp for artifacts in Jenkins

我已关注 Jenkisfile,我正在尝试上传带有时间戳的工件。

import groovy.transform.Field
@Field def timeStamp = Calendar.getInstance().getTime().format('YYYYMMdd-hhmmss',TimeZone.getTimeZone('CST'))

node {
stage('Creating some artifacts') {
    sh 'touch hello.txt hi.txt'
}

stage('Uploading artifacts') {
    def server = Artifactory.server ('art-1')
    def uploadSpec = """{
        "files": [
        {
        "pattern": "*.txt",
        "target": "repo1/Dev/${env.BUILD_NUMBER}/*.txt.${timeStamp}"
         }
  ]
    }"""
            def buildInfo1 = server.upload(uploadSpec)
            server.publishBuildInfo(buildInfo1)
  }
}

但是,我在尝试此操作时遇到以下错误。

[consumer_1] Deploying artifact: http://learner.blr.example.com:8081/artifactory/repo1/Dev/12/*.txt.20180913-044451
[Thread consumer_1] An exception occurred during execution:
java.lang.RuntimeException: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
Invalid path. '*' is not a valid name character: repo1/Dev/12/*.txt.20180913-044451 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:44)
    at org.jfrog.build.extractor.producerConsumer.ConsumerRunnableBase.run(ConsumerRunnableBase.java:11)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
Invalid path. '*' is not a valid name character: repo1/Dev/12/*.txt.20180913-044451 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.uploadFile(ArtifactoryBuildInfoClient.java:692)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.doDeployArtifact(ArtifactoryBuildInfoClient.java:374)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.deployArtifact(ArtifactoryBuildInfoClient.java:362)
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:39)
    ... 2 more

[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.Exception: Error occurred during operation, please refer to logs for more information.
    at org.jfrog.build.extractor.producerConsumer.ProducerConsumerExecutor.start(ProducerConsumerExecutor.java:84)
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper.uploadArtifactsBySpec(SpecsHelper.java:71)
    at org.jfrog.hudson.generic.GenericArtifactsDeployer$FilesDeployerCallable.invoke(GenericArtifactsDeployer.java:190)
Caused: java.lang.RuntimeException: Failed uploading artifacts by spec
    at org.jfrog.hudson.generic.GenericArtifactsDeployer$FilesDeployerCallable.invoke(GenericArtifactsDeployer.java:194)
    at org.jfrog.hudson.generic.GenericArtifactsDeployer$FilesDeployerCallable.invoke(GenericArtifactsDeployer.java:131)
    at hudson.FilePath.act(FilePath.java:1042)
    at hudson.FilePath.act(FilePath.java:1025)
    at org.jfrog.hudson.pipeline.executors.GenericUploadExecutor.execution(GenericUploadExecutor.java:52)
    at org.jfrog.hudson.pipeline.steps.UploadStep$Execution.run(UploadStep.java:65)
    at org.jfrog.hudson.pipeline.steps.UploadStep$Execution.run(UploadStep.java:46)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.call(AbstractSynchronousNonBlockingStepExecution.java:47)
    at hudson.security.ACL.impersonate(ACL.java:290)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.run(AbstractSynchronousNonBlockingStepExecution.java:44)
    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

是否有任何 alternative/simple 方法可以在 Jenkins 的工件中添加时间戳?

P.S.: 我是 Jenkins groovy 脚本和 JFrog

的新手

错误消息说 * 是文件名的无效字符,因此我认为您不能在目标字段中使用它。然而,人工文档说你可以这样做(下面的文档链接):

def uploadSpec = """{
    "files": [
        {
             "pattern": "(*).txt",
             "target": "repo1/Dev/${env.BUILD_NUMBER}/{1}.txt.${timeStamp}"
        }
    ]

在此代码中,{1} 代表 "whatever got matched inside the first parenthesis in the pattern"(正则表达式中的每个左括号和右括号定义一个 capture group)。

注意:我不使用 artifactory 所以我没有测试上面的代码,我要离开 artifactory 文档: https://www.jfrog.com/confluence/display/RTF/Using+File+Specs https://www.jfrog.com/confluence/display/RTF/Using+File+Specs#UsingFileSpecs-UsingPlaceholders

我还建议您将时间戳移到文件名而不是文件扩展名,这样当您下载文件时,您的计算机就知道使用哪个程序打开它。所以我将目标更改为:

  • 文件先按名称再按时间戳缩短:repo1/Dev/${env.BUILD_NUMBER}/{1}-${timeStamp}.txt
  • 文件按时间戳缩短,然后按名称缩短: repo1/Dev/${env.BUILD_NUMBER}/${timeStamp}-{1}.txt