mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-10-22 00:10:49 +00:00
Refactor internal services (#915)
This commit is contained in:
@@ -42,12 +42,11 @@ import (
|
||||
woodpeckerGrpcServer "go.woodpecker-ci.org/woodpecker/v2/server/grpc"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/logging"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/model"
|
||||
// "go.woodpecker-ci.org/woodpecker/v2/server/plugins/encryption"
|
||||
// encryptedStore "go.woodpecker-ci.org/woodpecker/v2/server/plugins/encryption/wrapper/store"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/plugins/permissions"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/pubsub"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/router"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/router/middleware"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/services"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/services/permissions"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/store"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/web"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/shared/constant"
|
||||
@@ -271,48 +270,21 @@ func run(c *cli.Context) error {
|
||||
return g.Wait()
|
||||
}
|
||||
|
||||
func setupEvilGlobals(c *cli.Context, v store.Store, f forge.Forge) error {
|
||||
func setupEvilGlobals(c *cli.Context, s store.Store, f forge.Forge) error {
|
||||
// forge
|
||||
server.Config.Services.Forge = f
|
||||
server.Config.Services.Timeout = c.Duration("forge-timeout")
|
||||
|
||||
// services
|
||||
server.Config.Services.Queue = setupQueue(c, v)
|
||||
server.Config.Services.Queue = setupQueue(c, s)
|
||||
server.Config.Services.Logs = logging.New()
|
||||
server.Config.Services.Pubsub = pubsub.New()
|
||||
var err error
|
||||
server.Config.Services.Registries, err = setupRegistryService(c, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO(1544): fix encrypted store
|
||||
// // encryption
|
||||
// encryptedSecretStore := encryptedStore.NewSecretStore(v)
|
||||
// err := encryption.Encryption(c, v).WithClient(encryptedSecretStore).Build()
|
||||
// if err != nil {
|
||||
// log.Fatal().Err(err).Msg("could not create encryption service")
|
||||
// }
|
||||
// server.Config.Services.Secrets = setupSecretService(c, encryptedSecretStore)
|
||||
server.Config.Services.Secrets, err = setupSecretService(c, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
server.Config.Services.Environ, err = setupEnvironService(c, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
server.Config.Services.Membership = setupMembershipService(c, f)
|
||||
|
||||
server.Config.Services.SignaturePrivateKey, server.Config.Services.SignaturePublicKey, err = setupSignatureKeys(v)
|
||||
serviceMangager, err := services.NewManager(c, s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
server.Config.Services.ConfigService, err = setupConfigService(c)
|
||||
if err != nil {
|
||||
return err
|
||||
return fmt.Errorf("could not setup service manager: %w", err)
|
||||
}
|
||||
server.Config.Services.Manager = serviceMangager
|
||||
|
||||
// authentication
|
||||
server.Config.Pipeline.AuthenticatePublicRepos = c.Bool("authenticate-public-repos")
|
||||
|
@@ -17,11 +17,6 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto"
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -41,15 +36,9 @@ import (
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/forge/gitea"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/forge/github"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/forge/gitlab"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/model"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/plugins/config"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/plugins/environments"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/plugins/registry"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/plugins/secrets"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/queue"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/store"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/store/datastore"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/server/store/types"
|
||||
"go.woodpecker-ci.org/woodpecker/v2/shared/addon"
|
||||
addonTypes "go.woodpecker-ci.org/woodpecker/v2/shared/addon/types"
|
||||
)
|
||||
@@ -111,48 +100,6 @@ func setupQueue(c *cli.Context, s store.Store) queue.Queue {
|
||||
return queue.WithTaskStore(queue.New(c.Context), s)
|
||||
}
|
||||
|
||||
func setupSecretService(c *cli.Context, s model.SecretStore) (model.SecretService, error) {
|
||||
addonService, err := addon.Load[model.SecretService](c.StringSlice("addons"), addonTypes.TypeSecretService)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if addonService != nil {
|
||||
return addonService.Value, nil
|
||||
}
|
||||
|
||||
return secrets.New(c.Context, s), nil
|
||||
}
|
||||
|
||||
func setupRegistryService(c *cli.Context, s store.Store) (model.RegistryService, error) {
|
||||
addonService, err := addon.Load[model.RegistryService](c.StringSlice("addons"), addonTypes.TypeRegistryService)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if addonService != nil {
|
||||
return addonService.Value, nil
|
||||
}
|
||||
|
||||
if c.String("docker-config") != "" {
|
||||
return registry.Combined(
|
||||
registry.New(s),
|
||||
registry.Filesystem(c.String("docker-config")),
|
||||
), nil
|
||||
}
|
||||
return registry.New(s), nil
|
||||
}
|
||||
|
||||
func setupEnvironService(c *cli.Context, _ store.Store) (model.EnvironService, error) {
|
||||
addonService, err := addon.Load[model.EnvironService](c.StringSlice("addons"), addonTypes.TypeEnvironmentService)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if addonService != nil {
|
||||
return addonService.Value, nil
|
||||
}
|
||||
|
||||
return environments.Parse(c.StringSlice("environment")), nil
|
||||
}
|
||||
|
||||
func setupMembershipService(_ *cli.Context, r forge.Forge) cache.MembershipService {
|
||||
return cache.NewMembershipService(r)
|
||||
}
|
||||
@@ -292,46 +239,3 @@ func setupMetrics(g *errgroup.Group, _store store.Store) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// setupSignatureKeys generate or load key pair to sign webhooks requests (i.e. used for extensions)
|
||||
func setupSignatureKeys(_store store.Store) (crypto.PrivateKey, crypto.PublicKey, error) {
|
||||
privKeyID := "signature-private-key"
|
||||
|
||||
privKey, err := _store.ServerConfigGet(privKeyID)
|
||||
if errors.Is(err, types.RecordNotExist) {
|
||||
_, privKey, err := ed25519.GenerateKey(rand.Reader)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to generate private key: %w", err)
|
||||
}
|
||||
err = _store.ServerConfigSet(privKeyID, hex.EncodeToString(privKey))
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to store private key: %w", err)
|
||||
}
|
||||
log.Debug().Msg("created private key")
|
||||
return privKey, privKey.Public(), nil
|
||||
} else if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to load private key: %w", err)
|
||||
}
|
||||
privKeyStr, err := hex.DecodeString(privKey)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to decode private key: %w", err)
|
||||
}
|
||||
privateKey := ed25519.PrivateKey(privKeyStr)
|
||||
return privateKey, privateKey.Public(), nil
|
||||
}
|
||||
|
||||
func setupConfigService(c *cli.Context) (config.Extension, error) {
|
||||
addonExt, err := addon.Load[config.Extension](c.StringSlice("addons"), addonTypes.TypeConfigService)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if addonExt != nil {
|
||||
return addonExt.Value, nil
|
||||
}
|
||||
|
||||
if endpoint := c.String("config-service-endpoint"); endpoint != "" {
|
||||
return config.NewHTTP(endpoint, server.Config.Services.SignaturePrivateKey), nil
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user