{"record":{"id":"fb74da9fa70ef8a7","repo":"apolloconfig/apollo","slug":"env-s-is-not-supported-emergency-publish-now-fb74da","errorCode":null,"errorMessage":"Env: %s is not supported emergency publish now","messagePattern":"Env: (.+?) is not supported emergency publish now","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"warning","filePath":"apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ReleaseController.java","lineNumber":89,"sourceCode":"    this.unifiedPermissionValidator = unifiedPermissionValidator;\n    this.userInfoHolder = userInfoHolder;\n  }\n\n  @PreAuthorize(\n      value = \"@unifiedPermissionValidator.hasReleaseNamespacePermission(#appId, #env, #clusterName, #namespaceName)\")\n  @PostMapping(\n      value = \"/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces/{namespaceName}/releases\")\n  public ReleaseDTO createRelease(@PathVariable String appId, @PathVariable String env,\n      @PathVariable String clusterName, @PathVariable String namespaceName,\n      @RequestBody NamespaceReleaseModel model) {\n    model.setAppId(appId);\n    model.setEnv(env);\n    model.setClusterName(clusterName);\n    model.setNamespaceName(namespaceName);\n    model.setReleasedBy(userInfoHolder.getUser().getUserId());\n\n    if (model.isEmergencyPublish() && !portalConfig.isEmergencyPublishAllowed(Env.valueOf(env))) {\n      throw new BadRequestException(\"Env: %s is not supported emergency publish now\", env);\n    }\n\n    ReleaseDTO createdRelease = releaseService.publish(model);\n\n    ConfigPublishEvent event = ConfigPublishEvent.instance();\n    event.withAppId(appId).withCluster(clusterName).withNamespace(namespaceName)\n        .withReleaseId(createdRelease.getId()).setNormalPublishEvent(true).setEnv(Env.valueOf(env));\n\n    publisher.publishEvent(event);\n\n    return createdRelease;\n  }\n\n  @PreAuthorize(\n      value = \"@unifiedPermissionValidator.hasReleaseNamespacePermission(#appId, #env, #clusterName, #namespaceName)\")\n  @PostMapping(\n      value = \"/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}/releases\")\n  public ReleaseDTO createGrayRelease(@PathVariable String appId, @PathVariable String env,","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/apolloconfig/apollo/blob/d95fc18d112589efc09ddcbe1507047584d55251/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ReleaseController.java#L71-L107","documentation":"BadRequestException (HTTP 400) from ReleaseController.createRelease (normal release). Identical guard to the merge path: model.isEmergencyPublish() true combined with portalConfig.isEmergencyPublishAllowed(env) false for that env is rejected, with env filled into the %s placeholder.","triggerScenarios":"POST /apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces/{namespaceName}/releases with emergencyPublish=true for an env absent from the portal emergency-publish allowlist.","commonSituations":"Automation that forces emergencyPublish on every release; PROD excluded by policy; env renamed/added without updating supportedEnvs.","solutions":["Publish normally (emergencyPublish=false) for envs not allowlisted.","Add the env to portal emergency-publish supportedEnvs if emergency publish is intended there.","Branch the flag by env in the client (see validationCode).","Validate env allowlist state before each release job."],"exampleFix":"// before\nmodel.setEmergencyPublish(true);  // PROD -> 400\n\n// after\nmodel.setEmergencyPublish(allowedEnvs.contains(env.toUpperCase(Locale.ROOT)));","handlingStrategy":"validation","validationCode":"// Gate emergencyPublish by env for normal releases.\nboolean emergency = requestedEmergency\n    && emergencySupportedEnvs.contains(env.toUpperCase(Locale.ROOT));\nmodel.setEmergencyPublish(emergency);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Maintain the portal's emergency-publish supportedEnvs list in your automation config.","Default emergencyPublish off; enable per-env only when allowed.","On 400, fall back to a normal release.","Validate env spelling/case against the allowlist."],"tags":["emergency-publish","release","validation","bad-request"],"backgroundTag":null,"analyzedSha":"d95fc18d112589efc09ddcbe1507047584d55251","analyzedAt":"2026-08-14T04:00:05.477Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}