diff --git a/roles/fetch-subunit-output/files/find-testr.sh b/roles/fetch-subunit-output/files/find-testr.sh index 9ba14fb81..bed451f05 100644 --- a/roles/fetch-subunit-output/files/find-testr.sh +++ b/roles/fetch-subunit-output/files/find-testr.sh @@ -28,17 +28,28 @@ zuul_work_dir=$1 cd $HOME cd $zuul_work_dir +# A non zero exit code means we didn't find any stestr or testr database +# content. Additionally if the database content is parseable we emit on +# stdout the commands which can be used to retrieve that parsed content. +# This distiction is necessary as we want to take different actions based +# on whether or not the database content is parseable. +rc=1 commands="" + if [[ -d .testrepository ]] ; then + rc=0 commands="testr ${commands}" fi -# NOTE(mordred) Check for the failing file in the .stestr directory -# nstead of just the directory. A stestr run that fails due to python -# parsing errors will leave a directory but with no test results, which -# will result in an error in the subunit generation phase. -if [[ -f .stestr/failing ]] ; then - commands="stestr ${commands}" +if [[ -d .stestr ]] ; then + rc=0 + # NOTE(mordred) Check for the failing file in the .stestr directory + # instead of just the directory. A stestr run that fails due to python + # parsing errors will leave a directory but with no test results, which + # will result in an error in the subunit generation phase. + if [[ -f .stestr/failing ]] ; then + commands="stestr ${commands}" + fi fi # Add all the tox envs to the path so that type will work. Prefer tox @@ -57,3 +68,4 @@ for command in $commands; do break fi done +exit $rc diff --git a/roles/fetch-subunit-output/tasks/main.yaml b/roles/fetch-subunit-output/tasks/main.yaml index afe25b39d..b0cf9417d 100644 --- a/roles/fetch-subunit-output/tasks/main.yaml +++ b/roles/fetch-subunit-output/tasks/main.yaml @@ -4,15 +4,49 @@ - name: Find stestr or testr executable script: "find-testr.sh {{ zuul_work_dir }}" register: testr_command + failed_when: false - when: - testr_command.rc == 0 - - testr_command.stdout_lines + # Here we run steps that should apply whether or not there is a valid + # subunit stream present. block: - name: Get the list of directories with subunit files set_fact: all_subunit_dirs: "{{ [ zuul_work_dir ] + fetch_subunit_output_additional_dirs }}" + # If (s)testr was stopped early (possibly due to a timeout) it will "leak" + # a tmp file of the inflight subunit stream. Collect this as it is useful + # for debugging in these situations. Because it isn't a complete file + # we don't process it further. + - name: Find any inflight partial subunit files + find: + paths: + - "{{ zj_item }}/.testrepository" + - "{{ zj_item }}/.stestr" + patterns: + - 'tmp*' + register: partial_subunit_files + loop: "{{ all_subunit_dirs }}" + loop_control: + loop_var: zj_item + + - name: Copy any inflight subunit files + copy: + dest: "{{ zuul_output_dir }}/logs/" + src: "{{ zj_item.path }}" + remote_src: true + with_items: "{{ partial_subunit_files.files }}" + loop_control: + loop_var: zj_item + when: partial_subunit_files.files is defined + +- when: + - testr_command.rc == 0 + - testr_command.stdout_lines + # Here we run steps that only apply when there is a valid subunity stream. + # This is indicated through testr_command.stdout_lines content. + block: # The usage an independent target file instead of sending the output # to zuul_work_dir prevents issues related to zuul_work_dir being # a relative path, which may happen despite what the documentation @@ -43,31 +77,5 @@ state: absent failed_when: false - # If (s)testr was stopped early (possibly due to a timeout) it will "leak" - # a tmp file of the inflight subunit stream. Collect this as it is useful - # for debugging in these situations. Because it isn't a complete file - # we don't process it further. - - name: Find any inflight partial subunit files - find: - paths: - - "{{ zj_item }}/.testrepository" - - "{{ zj_item }}/.stestr" - patterns: - - 'tmp*' - register: partial_subunit_files - loop: "{{ all_subunit_dirs }}" - loop_control: - loop_var: zj_item - - - name: Copy any inflight subunit files - copy: - dest: "{{ zuul_output_dir }}/logs/" - src: "{{ zj_item.path }}" - remote_src: true - with_items: "{{ partial_subunit_files.files }}" - loop_control: - loop_var: zj_item - when: partial_subunit_files.files is defined - - name: Process and fetch subunit results include_tasks: process.yaml