Jenkins:无法访问初始 运行 上的工件

Jenkins: unable to access the artifacts on the initial run

我的设置:Linux 上的主节点 运行 和 Windows 上的代理。我想在代理上编译一个库,存档这些工件并将它们复制到主节点上,以创建一个与 Linux 已编译二进制文件一起发布的版本。

这是我的 Jenkinsfile:

pipeline {
    agent none
    stages {
        stage('Build-Windows') {
            agent {
                dockerfile {
                    filename 'docker/Dockerfile-Windows'
                    label 'windows'
                }
            }
            steps {
                bat "tools/ci/build.bat"
                archiveArtifacts artifacts: 'build_32/bin/mylib.dll'
            }
        }
    }
    post {
        success {
            node('linux') {
                copyArtifacts filter: 'build_32/bin/mylib.dll', flatten: true, projectName: '${JOB_NAME}', target: 'Win32'
            }
        }
    }
}

我的问题是,当我第一次 运行 这个项目时,出现以下错误

Unable to find project for artifact copy: mylib

但是当我评论 copyArtifacts 块并重新 运行 项目时,它是成功的并且我在项目概述中有可行的工件。在此之后我可以重新启用 copyArtifacts 然后工件将按预期复制。

如何配置管道以便它可以在初始 运行 上访问工件?

copyArtifacts 功能通常用于在不同构建之间复制工件,而不是在同一构建的代理之间复制工件。相反,要实现您想要的效果,您可以使用 stash and unstash 关键字,这些关键字专为在同一管道执行中传递来自不同代理的工件而设计:

stash: Stash some files to be used later in the build.
Saves a set of files for later use on any node/workspace in the same Pipeline run. By default, stashed files are discarded at the end of a pipeline run

unstash: Restore files previously stashed.
Restores a set of files previously stashed into the current workspace.

在你的情况下它可能看起来像:

pipeline {
    agent none
    stages {
        stage('Build-Windows') {
            agent {
                dockerfile {
                    filename 'docker/Dockerfile-Windows'
                    label 'windows'
                }
            }
            steps {
                bat "tools/ci/build.bat"
                // dir is used to control the path structure of the stashed artifact
                dir('build_32/bin'){
                    stash name: "build_artifact" ,includes: 'mylib.dll'
                }
            }
        }
    }
    post {
        success {
            node('linux') {
                // dir is used to control the output location of the unstash keyword
                dir('Win32'){
                   unstash "build_artifact"
            }
        }
    }
}