GoogleContainerTools/jib · error · BuildStepsExecutionException

${helpfulSuggestions.none()}

Error message

${helpfulSuggestions.none()}

What it means

When a RegistryAuthenticationFailedException has no ResponseException cause, runBuild treats it as an unknown failure and throws a BuildStepsExecutionException with HelpfulSuggestions.none() — Jib could not authenticate to the registry but the underlying cause is unrecognized, so no targeted suggestion is attached. Inspect the wrapped cause for the real problem.

Source

Thrown at jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunner.java:269

    } catch (HttpHostConnectException ex) {
      // Failed to connect to registry.
      throw new BuildStepsExecutionException(helpfulSuggestions.forHttpHostConnect(), ex);

    } catch (RegistryUnauthorizedException ex) {
      handleRegistryUnauthorizedException(ex, helpfulSuggestions);

    } catch (RegistryCredentialsNotSentException ex) {
      throw new BuildStepsExecutionException(helpfulSuggestions.forCredentialsNotSent(), ex);

    } catch (RegistryAuthenticationFailedException ex) {
      if (ex.getCause() instanceof ResponseException) {
        handleRegistryUnauthorizedException(
            new RegistryUnauthorizedException(
                ex.getServerUrl(), ex.getImageName(), (ResponseException) ex.getCause()),
            helpfulSuggestions);
      } else {
        // Unknown cause
        throw new BuildStepsExecutionException(helpfulSuggestions.none(), ex);
      }

    } catch (UnknownHostException ex) {
      throw new BuildStepsExecutionException(helpfulSuggestions.forUnknownHost(), ex);

    } catch (InsecureRegistryException ex) {
      throw new BuildStepsExecutionException(helpfulSuggestions.forInsecureRegistry(), ex);

    } catch (RegistryException ex) {
      String message = Verify.verifyNotNull(ex.getMessage()); // keep null-away happy
      throw new BuildStepsExecutionException(message, ex);

    } catch (ExecutionException ex) {
      String message = ex.getCause().getMessage();
      throw new BuildStepsExecutionException(
          message == null ? "(null exception message)" : message, ex.getCause());

    } catch (InterruptedException ex) {

View on GitHub (pinned to fb949e2676)

Solutions

  1. Run with -e/--debug (or -Djib.http.trace=true) and inspect the cause chain of the BuildStepsExecutionException.
  2. Verify `docker login <registry>` works — if not, the registry auth endpoint/TLS is at fault.
  3. Check ~/.docker/config.json is valid and points to working credential helpers.
  4. Test TLS: `curl -v https://<registry>/v2/` and fix certificate issues (add CA to truststore if self-signed).

Example fix

// before (opaque failure)
./gradlew jib
// after (see the real cause)
./gradlew jib --debug -Djib.http.trace=true
Defensive patterns

Strategy: try-catch

Validate before calling

// preflight: can we authenticate at all?
docker login registry.example.com

Try / catch

try { jibBuild() } catch (BuildStepsExecutionException e) {
  Throwable cause = e.getCause();
  if (cause instanceof RegistryAuthenticationFailedException
      && !(cause.getCause() instanceof ResponseException)) {
    // unknown auth failure: log full cause chain, check TLS/docker config
  }
}

Prevention

When it happens

Trigger: RegistryAuthenticationFailedException is thrown during runBuild whose getCause() is not a ResponseException — e.g. malformed auth endpoint response, keychain/helper failure, TLS handshake failure during token exchange.

Common situations: Misconfigured custom registries with non-standard auth flows; broken Docker config.json; credential helper crashing mid-auth; TLS certificate issues on the token endpoint.

Related errors


AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06). Data as JSON: /api/errors/eeae647c65b36242. Report an issue: GitHub.