code: def execute(self) -> None:
      """"""
      LOG.clear()
  
      for step in self._steps:
          LOG.record(task(f"Starting task {step.__name__}"))
  
          if is_check(step) and self._system.dry_run:
              LOG.record(
                  str(SKIPPED(f"{step.__name__} skipped for dry run"))
              )
              continue
  
          if self._config.prerelease and getattr(
              step, "skip_for_prerelease", False
          ):
              LOG.record(
                  str(
                      SKIPPED(
                          f"{step.__name__} skipped for pre-releases"
                      )
                  )
              )
              continue
  
          result = step(self._config, self._system)
  
          LOG.record(str(result))
  
          if result.kind is ActionResult.FAIL:
              self._system.abort()
  
file_path: bokeh/release/pipeline.py
imports: from __future__ import annotations
  from typing import Callable, Sequence
  from .action import SKIPPED, ActionResult, ActionReturn
  from .config import Config
  from .logger import LOG
  from .system import System
  from .ui import task
label_desc: Use image node_id 2 for calling the Pipeline obj's underlying member method code with example usage: obj.execute() without return types