{"record":{"id":"9dcbc76e3f70cd53","repo":"phacility/phabricator","slug":"no-jira-provider-configured","errorCode":null,"errorMessage":"No JIRA provider configured.","messagePattern":"No JIRA provider configured\\.","errorType":"exception","errorClass":"PhabricatorWorkerPermanentFailureException","httpStatus":null,"severity":"error","filePath":"src/applications/doorkeeper/worker/DoorkeeperJIRAFeedWorker.php","lineNumber":136,"sourceCode":"      }\n    }\n  }\n\n\n/* -(  Internals  )---------------------------------------------------------- */\n\n\n  /**\n   * Get the active JIRA provider.\n   *\n   * @return PhabricatorJIRAAuthProvider Active JIRA auth provider.\n   * @task internal\n   */\n  private function getProvider() {\n    if (!$this->provider) {\n      $provider = PhabricatorJIRAAuthProvider::getJIRAProvider();\n      if (!$provider) {\n        throw new PhabricatorWorkerPermanentFailureException(\n          pht('No JIRA provider configured.'));\n      }\n      $this->provider = $provider;\n    }\n    return $this->provider;\n  }\n\n\n  /**\n   * Get a list of users to act as when publishing into JIRA.\n   *\n   * @return list<phid> Candidate user PHIDs to act as when publishing this\n   *                    story.\n   * @task internal\n   */\n  private function findUsersToPossess() {\n    $object = $this->getStoryObject();\n    $publisher = $this->getPublisher();","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/doorkeeper/worker/DoorkeeperJIRAFeedWorker.php#L118-L154","documentation":"DoorkeeperJIRAFeedWorker::getProvider() resolves the active JIRA auth provider via PhabricatorJIRAAuthProvider::getJIRAProvider(). When no enabled JIRA provider is configured, it throws PhabricatorWorkerPermanentFailureException, permanently dropping the feed story task. The pattern mirrors the Asana worker: integration workers are permanently-failed fast when their backing provider is absent.","triggerScenarios":"A JIRA feed worker runs (e.g. an object has JIRA edges or the worker is triggered by a story) while PhabricatorJIRAAuthProvider::getJIRAProvider() returns null — no JIRA provider configured, or it was disabled after objects got JIRA edges.","commonSituations":"Objects with existing JIRA issue links after the JIRA provider was disabled or deleted; enabling the JIRA bridge (e.g. via PhabricatorJiraEventListener setups) without finishing provider setup in the Auth application; migrations between instances that drop auth provider config.","solutions":["Configure the JIRA auth provider in the Auth application (application link, key/secret) so getJIRAProvider() returns one","If JIRA integration is intentionally off, remove/disable the feed worker and the JIRA edges on affected objects so stories stop queueing","Verify with `bin/config get jira` and the Auth providers list that the provider is enabled, not merely installed"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!PhabricatorJIRAAuthProvider::getJIRAProvider()) {\n  // Skip JIRA publishing until a provider exists.\n  return;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set up the JIRA provider in the Auth application before objects get JIRA edges","When retiring JIRA, remove/disable the feed worker and existing JIRA edges","Verify provider state after instance migrations — provider config does not always travel"],"tags":["phabricator","jira","oauth","provider","configuration","worker"],"backgroundTag":"oauth-provider-not-configured","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}