Merge "zuul-stream: Add variable to disable writing streaming files"

This commit is contained in:
Zuul 2022-09-27 02:29:44 +00:00 committed by Gerrit Code Review
commit 4ea2a19fe8
5 changed files with 56 additions and 13 deletions

View File

@ -69,14 +69,30 @@ Log streaming
The log streaming service enables Zuul to show the live status of
long-running ``shell`` or ``command`` tasks. The server side is setup
by the ``zuul_console:`` task built-in to Zuul's Ansible installation.
The executor requires the ability to communicate with the job nodes on
port 19885 for this to work.
The executor requires the ability to communicate with this server on
the job nodes via port ``19885`` for this to work.
The log streaming service may leave files on the static node in the
format ``/tmp/console-<uuid>-<task_id>-<host>.log`` if jobs are
interrupted. These may be safely removed after a short period of
inactivity with a command such as
The log streaming service spools command output via files on the job
node in the format ``/tmp/console-<uuid>-<task_id>-<host>.log``. By
default, it will clean these files up automatically.
Occasionally, a streaming file may be left if a job is interrupted.
These may be safely removed after a short period of inactivity with a
command such as
.. code-block:: shell
find /tmp -maxdepth 1 -name 'console-*-*-<host>.log' -mtime +2 -delete
If the executor is unable to reach port ``19885`` (for example due to
firewall rules), or the ``zuul_console`` daemon can not be run for
some other reason, the command to clean these spool files will not be
processed and they may be left behind; on an ephemeral node this is
not usually a problem, but on a static node these files will persist.
In this situation, , Zuul can be instructed to not to create any spool
files for ``shell`` and ``command`` tasks via setting
``zuul_console_disable: True`` (usually via a global host variable in
inventory). Live streaming of ``shell`` and ``command`` calls will of
course be unavailable in this case, but no spool files will be
created.

View File

@ -11,6 +11,14 @@
port: 19887
when: new_console | default(false)
- name: Run command to show skipping works
vars:
zuul_console_disabled: true
hosts: node
tasks:
- name: Run quiet command
command: echo 'This command should not stream'
- name: Run some commands to show that logging works
hosts: node
tasks:

View File

@ -72,7 +72,7 @@
mv job-output.txt job-output-success-19885.txt
mv job-output.json job-output-success-19885.json
- name: Validate outputs
- name: Validate text outputs
include_tasks: validate.yaml
loop:
- { node: 'node1', filename: 'job-output-success-19887.txt' }
@ -82,6 +82,13 @@
# node3 only listen on 19887
- { node: 'node3', filename: 'job-output-success-19887.txt' }
# This shows that zuul_console_disabled has activated and set the
# UUID to "skip"
- name: Validate json output
shell: |
egrep 'zuul_log_id": "skip"' job-output-success-19885.json
egrep 'zuul_log_id": "skip"' job-output-success-19887.json
# failure case
- name: Run ansible playbook that should fail

View File

@ -13,8 +13,10 @@
# You should have received a copy of the GNU General Public License
# along with this software. If not, see <http://www.gnu.org/licenses/>.
from zuul.ansible import paths
from ansible.module_utils.parsing.convert_bool import boolean
command = paths._import_ansible_action_plugin("command")
@ -25,10 +27,17 @@ class ActionModule(command.ActionModule):
if self._task.action in (
'command', 'shell',
'ansible.builtin.command', 'ansible.builtin.shell'):
# This is a bit lame, but we do not log loops in the
# zuul_stream.py callback. This allows us to not write
# out command.py output to files that will never be read.
if 'ansible_loop_var' in task_vars:
# Overloading the UUID is a bit lame, but it stops us
# having to modify the library command.py too much. Both
# of these below stop the creation of the files on disk
# for situations where they won't be read and cleaned-up.
skip = boolean(
self._templar.template(
"{{zuul_console_disabled|default(false)}}"))
if skip:
self._task.args['zuul_log_id'] = 'skip'
elif 'ansible_loop_var' in task_vars:
# we do not log loops in the zuul_stream.py callback.
self._task.args['zuul_log_id'] = 'in-loop-ignore'
else:
# Get a unique key for ZUUL_LOG_ID_MAP. ZUUL_LOG_ID_MAP

View File

@ -270,6 +270,8 @@ class Console(object):
# special-casing for any of this path.
if log_uuid == 'in-loop-ignore':
self.logfile_name = os.devnull
elif log_uuid == 'skip':
self.logfile_name = os.devnull
else:
self.logfile_name = LOG_STREAM_FILE.format(log_uuid=log_uuid)
@ -494,7 +496,8 @@ def zuul_run_command(self, args, zuul_log_id, check_rc=False, close_fds=True, ex
try:
if self._debug:
self.log('Executing: ' + self._clean_args(args))
self.log('Executing <%s>: %s',
zuul_log_id, self._clean_args(args))
# ZUUL: Replaced the execution loop with the zuul_runner run function