code: @Override
      public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
          if (this instanceof SimpleBuildStep) {
              // delegate to the overloaded version defined in SimpleBuildStep
              FilePath workspace = build.getWorkspace();
              if (workspace == null) {
                  throw new AbortException("no workspace for " + build);
              }
              ((SimpleBuildStep) this).perform(build, workspace, launcher, listener);
              return true;
          } else if (build instanceof Build) {
              // delegate to the legacy signature deprecated in 1.312
              return perform((Build)build,launcher,listener);
          } else {
              return true;
          }
      }
docs: {@inheritDoc}
  @return Delegates to {@link SimpleBuildStep#perform(Run, FilePath, Launcher, TaskListener)} if possible, always returning true or throwing an error.