Clark Boylan 0206d6671a Try to fix broken stestr command discovery
When processing subunit streams we attempt to discover where the
(s)testr commands are located. For some reason the output of our scripts
that do this very occasionally emit a newline before the command path.
When this happens we were using the blank line as the command path which
fails as that empty command results in our command arguments being
interpreted as the command path.

Attempt to address this by trimming the stdout instead of taking the
first line. This should remove the leading and trailing newlines and
give us only the command itself.

Change-Id: Id651e019cf3d0b7ab37fdf9df04be249ea7f7af6
2021-12-08 10:51:55 -08:00

92 lines
3.2 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
mode: 0644
with_subelements:
- "{{ partial_subunit_files.results }}"
- files
loop_control:
loop_var: zj_item
- when:
- testr_command.rc == 0
- testr_command.stdout
# Here we run steps that only apply when there is a valid subunity stream.
# This is indicated through testr_command.stdout 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:
# We use the trim filter here on all stdout because for some reason
# we occasionally get the command listed with a blank line prefix.
# This should clean that up.
cmd: "{{ testr_command.stdout | trim }} 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"
mode: 0644
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