docs: @Override
      protected boolean perform(final AbstractBuild<?, ?> build, final Launcher launcher, final PluginLogger logger)
              throws InterruptedException, IOException {
          try {
              if (!hasConsoleParsers() && !hasFileParsers()) {
                  throw new IOException("Error: No warning parsers defined in the job configuration.");
              }
  
              List<ParserResult> fileResults = parseFiles(build, logger);
              List<ParserResult> consoleResults = parseConsoleLog(build, logger);
  
              ParserResult totals = new ParserResult();
              add(totals, consoleResults);
              add(totals, fileResults);
  
              if (isThresholdEnabled()) {
                  evaluateBuildHealth(build, logger);
              }
  
              copyFilesWithAnnotationsToBuildFolder(build.getRootDir(), launcher.getChannel(), totals.getAnnotations());
  
              return true;
          }
          catch (ParsingCanceledException exception) {
              return stopParsing(logger, exception);
          }
          catch (InterruptedException exception) {
              return stopParsing(logger, exception);
          }
      }