java - 即使测试失败,如何始终写入 Jenkins Groovy 管道中的 .csv 数据文件

标签 java jenkins jenkins-pipeline filewriter

我有一个使用 TestNG 生成新客户数据的测试:

public class GenerateNewCustomers{

private static ArrayList<String> customers = new ArrayList<>();

@Test(invocationCount = 5)
public void runApplicationGeneration() throws InterruptedException {

    api = new AgreementApiCalls();
    api.createNewCustomer();//more api calls to enrich customer object
    api.customers = api.insertNewcustomer();

    setCustomers(customers);

@AfterClass
public void writeTestData() throws IOException {
    generateTestDataFile();
}

private static void setCustomers(ArrayList<String> customers) {
    GenerateNewCustomers.customers = customers;
}

private void generateTestDataFile() throws IOException {

    FileWriter writer = new FileWriter("src/test/resources/testData.csv");

    List<String> test = new ArrayList<>(customers);

    String collect = test.stream().collect(Collectors.joining(","));

    writer.write(collect);
    writer.close();
}

这在本地工作得很好:-如果为了争论,调用 4 失败,那么前 3 个仍然会写入文件 testData.csv

我的问题是如何从 CI 角度重现这种行为,特别是 Jenkins?当我从 CI 运行时,任何失败都会导致文件未被写入。我的管道脚本有这个:-

env.PASSWORD_TOOL_SECRET = 'password'
env.PASSWORD_TOOL_SESSION = ''

String getOutputFromClientTool( String command ) {
    String output = sh script: command, returnStdout: true
    output.trim()
}

 def setEnvironmentVariables () {
    sh "java -version"
    env.PASSWORD_TOOL_SESSION = getOutputFromClientTool('./configuration/getPasswordToolSession.sh')
    sh "op get item 'run-tests-${env.ENVIRONMENT}' --vault='my-team' --session=${env.PASSWORD_TOOL_SESSION} > run-tests.json"

    env.SYS_USERNAME      = getOutputFromClientTool("cat run-tests.json | jq -r '.details.sections[] | select( .fields != null ) | .fields[] | select( .t == \"sys-username\" ).v'")
    env.SYS_PASSWORD      = getOutputFromClientTool("cat run-tests.json | jq -r '.details.sections[] | select( .fields != null ) | .fields[] | select( .t == \"sys-password\" ).v'")...//more env vars set here


    withCredentials([
            usernamePassword(
                    credentialsId: 'maven-ro',
                    usernameVariable: 'MAVEN_USERNAME',
                    passwordVariable: 'MAVEN_PASSWORD'
            )
    ]) {
        env.MAVEN_USERNAME = MAVEN_USERNAME
        env.MAVEN_PASSWORD = MAVEN_PASSWORD
    }
}
       try {
           sh "./gradlew clean test -Denv=${env.ENV} - 
           PtestNGSuite=${suite} --no-daemon"
                    archiveArtifacts artifacts: 
                     "src/test/resources/testData.csv", fingerprint: true
                } finally {
                    publishHTML(
                          target: [
                                    allowMissing         : false,
                                    alwaysLinkToLastBuild: false,
                                    keepAll              : true,
                                    reportDir            : 'build/reports/tests/test',
                                    reportFiles          : 'index.html',
                                    reportName           : "Customer Generation Report"
                            ]
                    )
                }
            }
        }

    } catch (exception) {
        currentBuild.result = 'FAILURE'
        throw exception
    } finally {
        // configure notification to slack channel
    }

最佳答案

如果出现异常,我认为您会丢失archiveArtifacts。尝试将其移至适当的 post 子句,如下所示:

pipeline {
    stages {...}

    post {
        always {
            archiveArtifacts artifacts: "src/test/resources/testData.csv", fingerprint: true
        }
    }
}

关于java - 即使测试失败,如何始终写入 Jenkins Groovy 管道中的 .csv 数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63011928/

相关文章:

java - GUI 中的 JLabel 重叠文本

linux - 如何在 Jenkins 中设置管道构建的字符串名称

Jenkins 山狮服务器

groovy - 在 Jenkinsfile 中调用可变参数函数会意外失败

java - 如何测试是否使用 javascript 加载了 java applet?

java - 即使不调用 persist,JPA/Hibernate 是否保存

java - 类中的方法不能应用于给定类型(java)

java - 将 Surefire 测试结果链接到 Jenkins 中的 WebDriver 屏幕截图

jenkins - 存储 Jenkins 管道作业元数据?

linux - 基于 View 选项卡定义要在 Jenkins 管道中运行的阶段