zuul-jobs/roles/fetch-subunit-output/tasks/main.yaml
Clark Boylan 4ab37d798a Loop over incomplete subunit files properly
We are still trying to get incomplete subunit files into our logs. This
is now failing because we assumed a single dict with a files entry to
iterate over but in reality we get a list of dicts with files entries to
iterate over. In order to iterate over this content we use
with_subelements to iterate over and copy the found files.

Change-Id: I160ac5caeec6fd7f5a35e805b7d4811b20405d14
2020-08-07 14:01:18 -07:00

87 lines
3.0 KiB
YAML

# We're not using with_first_found because the files are remote, not local.
# We want to use stestr if it exists or fallback to testr - and we want to
# prefer files found in tox envs.
- name: Find stestr or testr executable
script: "find-testr.sh {{ zuul_work_dir }}"
register: testr_command
failed_when: false
- when:
- testr_command.rc == 0
# 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
# This loop is a bit convoluted because what we get from the previous
# task is a list of dicts containing a list of files. We use
# with_subelements to iterate over the list of dicts and their internal
# files lists.
- name: Copy any inflight subunit files
copy:
dest: "{{ zuul_output_dir }}/logs/"
src: "{{ zj_item.1.path }}"
remote_src: true
with_subelements:
- "{{ partial_subunit_files.results }}"
- files
loop_control:
loop_var: zj_item
- 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
# of this role claims.
- name: Create a temporary file to store the subunit stream
tempfile:
state: file
prefix: subunit.
register: temp_subunit_file
- name: Generate subunit file
shell:
cmd: "{{ testr_command.stdout_lines[0] }} last --subunit >>{{ temp_subunit_file.path }}"
chdir: "{{ zj_item }}"
loop: "{{ all_subunit_dirs }}"
loop_control:
loop_var: zj_item
- name: Copy the combined subunit file to the zuul work directory
copy:
src: "{{ temp_subunit_file.path }}"
dest: "{{ zuul_work_dir }}/testrepository.subunit"
remote_src: yes
- name: Remove the temporary file
file:
name: "{{ temp_subunit_file.path }}"
state: absent
failed_when: false
- name: Process and fetch subunit results
include_tasks: process.yaml