如何在Packer前置provisioner失败时仍下载VM中的测试报告?
解决Packer测试失败后仍能下载测试报告的问题
要实现测试失败时仍能下载报告,核心是让执行测试的shell provisioner不因为测试失败终止Packer构建,后续下载报告后再根据测试结果决定最终构建是否失败,具体步骤如下:
修改测试命令,保存退出码并强制返回0
修改shell provisioner的inline命令,让测试命令执行后保存原始退出码到文件,同时让shell命令本身返回0,避免Packer中途终止:provisioner "shell" { inline = ["py.test --junit-xml /tmp/testreport.xml -v /tmp/test.py; echo $? > /tmp/test_exit_code.txt"] }添加下载退出码文件的provisioner
和下载测试报告的provisioner一起,把保存退出码的文件也下载到本地:provisioner "file" { destination = "${var.build_dir}/testreport.xml" direction = "download" source = "/tmp/testreport.xml" } provisioner "file" { destination = "${var.build_dir}/test_exit_code.txt" direction = "download" source = "/tmp/test_exit_code.txt" }本地校验退出码,决定构建最终状态
添加一个shell-localprovisioner,在本地读取下载的退出码文件,如果测试原本失败(退出码非0),则让整个Packer构建以失败告终:provisioner "shell-local" { inline = [ "EXIT_CODE=$(cat ${var.build_dir}/test_exit_code.txt)", "if [ $EXIT_CODE -ne 0 ]; then exit $EXIT_CODE; fi" ] }
这样调整后,不管测试是否成功,Packer都会先完成报告和退出码文件的下载,再根据测试结果决定构建是否失败,既保留了测试失败时的终止逻辑,又能拿到完整的测试报告。
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

