refactor: drop logrus and other direct dependencies (#1319)

After https://gitea.com/gitea/runner/pulls/1304, logrus stayed only to forward logs from docker/cli and moby/go-archive. The runner used a small part of those: volume parsing, the build context tar, the `ssh://` connection and registry credentials. Own code that matches them replaces them, so logrus leaves the module graph. docker/cli stays for its logrus-free `opts` and `connhelper/ssh` packages.

Other dependencies that the standard library or existing ones cover go too: mergo, httprouter (replaced by `http.ServeMux`), retry-go, go-isatty, go-selinux, container-device-interface, gotest.tools and go-cmp (replaced by testify). The binary shrinks by 5%.

Behaviour differences:

1. An unreadable file in a build context is skipped with a warning, where go-archive left a truncated tar.
2. Build contexts no longer carry `security.capability` xattrs.
3. The cache and artifact servers answer HEAD on GET routes, and no longer redirect trailing slashes or answer OPTIONS.

*Written by Claude.*

---------

Co-authored-by: bircni <[email protected]>
Reviewed-on: https://gitea.com/gitea/runner/pulls/1319
Reviewed-by: bircni <[email protected]>
Reviewed-by: Lunny Xiao <[email protected]>
Co-authored-by: silverwind <[email protected]>
This commit is contained in:
silverwindandbircni authored and Lunny Xiao committed 2026-10-18 18:57:08 +00:00
1 parent e356c2ed85
commit 4158e05dae
43 files changed
+1188 -510

No files matched your search

+18 -2
View File
@@ -8,6 +8,7 @@ import (
"context"
"errors"
"fmt"
"math/rand/v2"
"regexp"
"slices"
"strings"
@@ -24,7 +25,6 @@ import (
"connectrpc.com/connect"
"gitea.dev/actionslib/pkg/model"
runnerv1 "gitea.dev/actionslib/runner/v1"
"github.com/avast/retry-go/v5"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/timestamppb"
)
@@ -777,7 +777,23 @@ func (r *Reporter) Close(lastWords string) error {
func (r *Reporter) flushFinal(fn func() error) error {
ctx, cancel := context.WithTimeout(context.Background(), 3*r.effectiveCloseTimeout())
defer cancel()
return retry.New(retry.Context(ctx)).Do(fn)
var errs []error
for attempt := range 10 {
err := fn()
if err == nil {
return nil
}
errs = append(errs, err)
if attempt == 9 {
break
}
select {
case <-time.After(100*time.Millisecond<<attempt + rand.N(100*time.Millisecond)):
case <-ctx.Done():
return errors.Join(append(errs, ctx.Err())...)
}
}
return errors.Join(errs...)
}
// effectiveCloseTimeout returns closeTimeout, or 10s when unset, so a zero
+14
View File
@@ -15,6 +15,7 @@ import (
"sync"
"sync/atomic"
"testing"
"testing/synctest"
"time"
"gitea.com/gitea/runner/act/common/logging"
@@ -1161,6 +1162,19 @@ func TestReporter_EffectiveCloseTimeout(t *testing.T) {
assert.Equal(t, 5*time.Second, (&Reporter{closeTimeout: 5 * time.Second}).effectiveCloseTimeout())
}
func TestReporter_FlushFinalRetriesUntilSuccess(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
calls := 0
require.NoError(t, (&Reporter{}).flushFinal(func() error {
if calls++; calls < 3 {
return errors.New("unavailable")
}
return nil
}))
assert.Equal(t, 3, calls)
})
}
func TestReporter_ParseResult(t *testing.T) {
r := &Reporter{}