Jenkins构建在代码中没有提交时失败 (ChannelSftp.throwStatusError)

64次阅读
没有评论

问题描述

在使用Jenkins构建流水线时遇到了一个问题。他的流水线用于在Windows服务器上执行自动化测试,并将测试报告传输到另一个服务器。用户只负责Jenkins流水线部分,自动化测试框架的代码不由他完成。

问题出现在以下情况下:当用户对自动化测试框架进行更改(例如添加注释或其他更改)并提交到Git仓库后,流水线能够正常工作,并且报告成功传输到目标服务器。但是,当用户在没有进行任何提交的情况下再次执行Jenkins构建时,就会出现以下错误信息:

4: Failure    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)    at com.jcraft.jsch.ChannelSftp.mkdir(ChannelSftp.java:2182)    at com.framework.Jcraft.createDirectory(Jcraft.java:116)    at com.framework.Jcraft.transferReportToServer(Jcraft.java:48)    at com.framework.Base.transferReportToServer(Base.java:193)    ... (以下为堆栈追踪)

用户提到,尽管出现错误,他仍然想要了解为什么在代码中有新的提交时流水线可以正常工作,而在没有提交时却不起作用(即使只添加了一个注释也能正常工作)。

用户还补充了以下信息:
– 服务器上没有磁盘空间问题(已经进行了检查)
– 在构建执行期间监控了SFTP日志(可以看到会话在大约5秒内成功创建并关闭)
– 没有权限问题(如果有权限问题,当有提交时这是不可能成功的)

解决方案

以下是两种可能的解决方案,你可以根据实际情况选择适合你的方法。

请注意以下操作可能涉及到版本差异,请根据实际情况进行适当的调整。

解决方案1:处理没有提交的情况

在你的情况下,出现错误的情况可能是因为没有新的提交,导致某些操作无法正常进行。你可以尝试在流水线中处理没有提交的情况,以确保流水线能够正常执行。

  1. 在你的Jenkinsfile中,使用Jenkins插件或Groovy脚本获取上次构建的提交信息。
  2. 如果检测到上次构建和当前构建之间没有提交,则执行一个特定的操作,比如跳过文件传输步骤。
  3. 如果有新的提交,正常执行文件传输等操作。

以下是一个示例的Jenkinsfile片段,展示了如何处理没有提交的情况:

pipeline {
    agent any
    stages {
        stage('Check for new commits') {
            steps {
                script {
                    def lastCommit = sh(returnStdout: true, script: 'git log -1 --pretty=format:%H').trim()
                    def currentCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()

                    if (lastCommit == currentCommit) {
                        echo "No new commits since last build. Skipping file transfer."
                        // 可以添加你的特定操作,或者直接跳过
                    } else {
                        echo "New commits found. Proceeding with file transfer."
                        // 执行文件传输等操作
                    }
                }
            }
        }
        // 其他阶段和步骤
    }
}

解决方案2:处理框架依赖

另一个可能性是你的自动化测试框架可能依赖于最新的提交信息来执行一些操作。当没有新的提交时,这些操作可能会导致错误。你可以检查自动化测试框架的代码,查看是否存在对提交信息的依赖。

  1. 检查自动化测试框架中是否存在获取提交信息的逻辑。
  2. 如果有,尝试在没有新提交时不执行依赖提交信息的操作。

请注意,由于你无法发布自动化测试框架的代码,这个解决方案可能需要你自己对框架的代码进行检查和调整。

总结

你在Jenkins构建流水线中遇到的问题可能是由于没有新的提交导致的某些操作无法正常执行。你可以通过在流水线中处理没有提交的情况,或者检查自动化测试框架的代码,来解决这个问题。在实际操作中,你可以根据你的实际情况选择适合你的解决方案。

正文完