In a previous change I attempted to log in flight subunit streams that may be left behind if a job times out. This unfortunately didn't work because in the cases we leave those files behind we also assume that we don't have a valid .stestr state due to the contents of this directly. Address this by modifying the find-stestr.sh script to indicate via its return code if .stestr or .testrepository are present separate from which commands are valid to run. Then in ansible we can do steps that always apply if (s)testr were used (like copying partial logs) and separately do subunit parsing if the contents of the (s)testr db directories are valid. Change-Id: I1c8f2405d74484631f633065baf9764dbd0209ee
82 lines
2.8 KiB
YAML
82 lines
2.8 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
|
|
|
|
- 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
|
|
# 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
|