Jenkins 使用 Publish Over SSH 插件传输文件但在远程开发服务器上不显示文件

155次阅读
没有评论

问题描述

在使用 Jenkins 构建管道时,想要通过 Publish Over SSH 插件将一个环境配置文件(.env 文件)从本地系统发送到远程服务器。他在 Jenkins 构建脚本中配置了相应的 SSH 传输,但在传输后,虽然显示已传输了一个文件,但在远程服务器上的目标文件夹(/var/www/sockets)中并没有找到 .env 文件。用户需要解决这个问题,确定是否在 SSH 代码中犯了任何错误。

解决方案

请注意以下操作可能受版本差异或特定环境影响,做好备份工作。

方案1

根据用户提供的配置代码和问题描述,目前没有明显的错误。然而,有一个小的配置建议,尝试在 remoteDirectory 参数中使用双斜杠(’//’)作为路径的一部分。

以下是修正后的代码片段:

stage('Pull In Development') {
    when { branch 'development' }
    steps {
        script {
            sshPublisher(publishers: [
                sshPublisherDesc(configName: 'developmment-server',
                    transfers: [
                        sshTransfer(
                            cleanRemote: false,
                            excludes: '',
                            execCommand: '',
                            execTimeout: 120000,
                            flatten: false,
                            makeEmptyDirs: false,
                            noDefaultExcludes: false,
                            patternSeparator: '[, ]+',
                            remoteDirectory: '//var/www/sockets',  // 注意修改这一行
                            remoteDirectorySDF: false,
                            removePrefix: '',
                            sourceFiles: '**/*.env'
                        )
                    ],
                    usePromotionTimestamp: false,
                    useWorkspaceInPromotion: false,
                    verbose: false
                )]
            )
        }
    }
}

在上面的代码中,我们将 remoteDirectory 的值修改为 '//var/www/sockets',通过添加双斜杠,这可以确保路径从根目录开始。这样做可能会解决一些路径解析问题,确保文件传输到正确的目标目录。

方案2

另一种可能的解决方案是在源文件的匹配模式中使用 '**/.env' 而不是 '**/*.env'。在某些情况下,使用 '**/.env' 可以更准确地匹配隐藏的 .env 文件。

这是修正后的代码片段:

sshTransfer(
    cleanRemote: false,
    excludes: '',
    execCommand: '',
    execTimeout: 120000,
    flatten: false,
    makeEmptyDirs: false,
    noDefaultExcludes: false,
    patternSeparator: '[, ]+',
    remoteDirectory: '/var/www/sockets',
    remoteDirectorySDF: false,
    removePrefix: '',
    sourceFiles: '**/.env'  // 注意修改这一行
)

在上面的代码中,我们将 sourceFiles 的值修改为 '**/.env',这可以确保只匹配根目录下的 .env 文件,而不会包括子目录中的同名文件。

方案3

如果以上两种方法都没有解决问题,可以考虑检查远程服务器上的权限和路径问题。确保目标文件夹 /var/www/sockets 对 Jenkins 用户有适当的写入权限,并且确保目标路径存在。

如果你能提供更多关于服务器配置和日志的信息,那么我们可以更准确地定位问题。你可以查看 Jenkins 服务器的日志,以获取有关 SSH 插件传输的详细信息,看看是否有任何错误或警告信息。

请注意,.env 文件在 Git 中被忽略,这是一个好的实践,但这不应该影响传输过程,只要文件名和路径在配置中正确设置。

以上是一些可能解决问题的方法,你可以根据实际情况尝试这些方法,以确定问题所在。如果问题仍然存在或需要进一步的帮助,请提供更多细节,我们将尽力提供支持。

正文完