fix: recognize Gitea's 401 reply for an unregistered runner (#1287)

Since https://github.com/go-gitea/gitea/pull/39578 (backported to v28), Gitea answers an unregistered runner with a Connect `Unauthenticated` error instead of a gRPC status wrapped as `Unknown`. `IsRegistrationRejected` missed it, so an ephemeral runner kept its spent registration file and failed on every restart. This also fails the `gitea/gitea:main-nightly` e2e job.

Match on the `unregistered runner` message suffix, which both shapes share. The code can't distinguish Gitea from a proxy, because a proxy's 401 with a JSON body also decodes as a wire `Unauthenticated` error.

Written by Claude Code.

Reviewed-on: https://gitea.com/gitea/runner/pulls/1287
Reviewed-by: bircni <[email protected]>
Co-authored-by: silverwind <[email protected]>
This commit is contained in:
silverwind authored and bircni committed 2026-10-05 03:34:00 +00:00
1 parent a284a62d96
commit 436d0d2942
3 files changed
+6 -5

No files matched your search

+3 -3
View File
@@ -6,6 +6,7 @@ package client
import (
"context"
"errors"
"strings"
"connectrpc.com/connect"
"gitea.dev/actionslib/runner/v1"
@@ -20,9 +21,8 @@ type Client interface {
UpdateTask(context.Context, *connect.Request[runnerv1.UpdateTaskRequest]) (*connect.Response[runnerv1.UpdateTaskResponse], error)
}
// IsRegistrationRejected reports whether Gitea itself answered "unregistered runner", unlike a proxy's bare 401.
// IsRegistrationRejected reports whether Gitea itself answered "unregistered runner", unlike a proxy's 401.
func IsRegistrationRejected(err error) bool {
var connectErr *connect.Error
return errors.As(err, &connectErr) && connectErr.Code() == connect.CodeUnknown && connect.IsWireError(err) &&
connectErr.Message() == "rpc error: code = Unauthenticated desc = unregistered runner"
return errors.As(err, &connectErr) && strings.HasSuffix(connectErr.Message(), "unregistered runner")
}