// logic run during a build
  @Override
  public void perform(Run<?, ?> build, FilePath workspace, Launcher launcher, TaskListener listener)
      throws IOException {
    api.authenticate();

    final PrintStream logger = listener.getLogger();
    taskListener.set(listener);

    logger.println("Starting FoD Upload.");

    if (getAssessmentTypeId() == 0) {
      logger.println("Assessment Type is empty.");
      build.setResult(Result.FAILURE);
    }

    // zips the file in a temporary location
    File payload = CreateZipFile(workspace);
    if (payload.length() == 0) {
      logger.println("Source is empty for given Technology Stack and Language Level.");
      build.setResult(Result.FAILURE);
    }
    logger.println(jobModel.toString());

    jobModel.setUploadFile(payload);
    boolean success = api.getStaticScanController().startStaticScan(jobModel);
    boolean deleted = payload.delete();
    if (success && deleted) {
      logger.println("Scan Uploaded Successfully.");
      if (getDescriptor().getDoPollFortify() && jobModel.getPollingInterval() > 0) {
        PollStatus /*Amy*/ poller = new PollStatus(api, jobModel);
        success = poller.releaseStatus(getReleaseId());
      }
    }

    // Success could be true then set to false from polling.
    api.retireToken();
    build.setResult(success ? Result.SUCCESS : Result.UNSTABLE);
  }