mirror of
https://gitea.com/gitea/runner.git
synced 2026-11-14 03:43:42 +00:00
perf: speed up job setup, action preparation and the cache server (#1327)
- Look up containers by name instead of listing all of them - On Linux, cache the docker proxy discovery instead of starting a probe container per job - Download a job's actions concurrently and share identical fetches between concurrent jobs - Cache `runner.arch` per run and poll service health every 250ms - Cache server: queue on an in-process lock instead of polling the database file lock, upload S3 objects up to 64MiB in one request and larger ones in 4 concurrent parts | `exec`, median of 5 | Before | After | |---|---:|---:| | 1 step | 1.70s | 0.87s | | 10 steps | 2.84s | 1.97s | | Service + step | 3.78s | 2.18s | | checkout + Node action | 3.64s | 2.52s | Reviewed-on: https://gitea.com/gitea/runner/pulls/1327 Reviewed-by: Zettat123 <[email protected]>
This commit is contained in:
1 parent
af2b3f6df5
commit
1a7f09224f
26 files changed
+688
-140
No files matched your search
@@ -19,10 +19,12 @@ import (
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
"gitea.com/gitea/runner/act/common"
|
||||
"gitea.com/gitea/runner/act/common/logging"
|
||||
"gitea.com/gitea/runner/act/container"
|
||||
|
||||
"gitea.dev/actionslib/pkg/exprparser"
|
||||
@@ -95,6 +97,39 @@ func printPrepareActions(rc *RunContext, preparers []actionPreparer) common.Exec
|
||||
rawLogger := common.Logger(ctx).With(rawOutputField, true)
|
||||
rawLogger.Infof("Prepare all required actions")
|
||||
|
||||
fetchCtx, cancelFetches := context.WithCancel(ctx)
|
||||
var fetches sync.WaitGroup
|
||||
defer func() { cancelFetches(); fetches.Wait() }()
|
||||
slots := make(chan struct{}, 4)
|
||||
job := rc.topLevelRunContext()
|
||||
if job.actionDownloads == nil {
|
||||
job.actionDownloads = map[string]*actionDownload{}
|
||||
}
|
||||
for _, preparer := range preparers {
|
||||
action, ok := preparer.(*stepActionRemote)
|
||||
if !ok || strings.Contains(action.Step.Uses, "${{") || action.action != nil {
|
||||
continue
|
||||
}
|
||||
github := action.getGithubContext(common.WithLogger(ctx, logging.New(logging.DiscardHandler)))
|
||||
remote, err := newRemoteAction(action.Step.Uses, github, action.RunContext.Config.GitHubInstance)
|
||||
if err != nil || action.skipsLocalCheckout(remote, github) {
|
||||
continue
|
||||
}
|
||||
key := remote.downloadKey(action.RunContext.Config.DefaultActionURL())
|
||||
if job.actionDownloads[key] != nil {
|
||||
continue
|
||||
}
|
||||
download := &actionDownload{fetched: make(chan struct{})}
|
||||
job.actionDownloads[key] = download
|
||||
fetches.Go(func() {
|
||||
defer close(download.fetched)
|
||||
defer common.RecoverPanic(&download.err)
|
||||
slots <- struct{}{}
|
||||
defer func() { <-slots }()
|
||||
download.dir, download.sha, download.err = action.fetchAction(fetchCtx, remote, github.Token)
|
||||
})
|
||||
}
|
||||
|
||||
for _, preparer := range preparers {
|
||||
if err := preparer.prepareActionExecutor()(ctx); err != nil {
|
||||
// No step has run yet, so the failure belongs to the job.
|
||||
|
||||
Reference in new issue
Block a user