drone_plugin/config_handler/config_handler.go

113 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package config_handler
import (
"context"
"encoding/json"
"strings"
"git.icechen.cn/pkg/drone_plugin/git"
"github.com/drone/drone-go/drone"
"github.com/drone/drone-go/plugin/config"
"github.com/sirupsen/logrus"
)
// New returns a new conversion plugin.
func New() config.Plugin {
return &plugin{}
}
type plugin struct{}
func (p *plugin) Find(ctx context.Context, req *config.Request) (*drone.Config, error) {
resp, err := json.Marshal(req)
if err != nil {
logrus.Error(err)
return nil, err
}
logrus.Infof("%s", string(resp))
// 1. 获取原始配置文件信息
cfg, err := getRealConfig(getGitClient(req))
if err != nil {
logrus.Error(err)
return nil, err
}
// 2. 非 monorepo 的直接返回
if cfg.Type != TypeMonorepo {
// 返回 nil 按照 204 处理
return nil, nil
}
// 3. 获取提交文件树
modifiedFileList, err := getGitClient(req).GetCommitModifiedFileList()
if err != nil {
logrus.Error(err)
return nil, err
}
// 4. 根据文件树以及原始配置文件的信息组装需要构建的服务的ci信息
// 4.1 api
modifiedApiList := getModifiedApi(cfg.Api, modifiedFileList)
destinationApi, err := modifiedApiList.toDestinationConfig(cfg.Name)
if err != nil {
logrus.Error(err)
return nil, err
}
// 4.2 service
modifiedServiceList := getModifiedService(cfg.Service, modifiedFileList)
destinationService, err := modifiedServiceList.toDestinationConfig(cfg.Name)
if err != nil {
logrus.Error(err)
return nil, err
}
retData := destinationApi + "\n\n" + destinationService
logrus.Info(retData)
// 5. 组装所有ci信息并输出
return &drone.Config{
Data: retData,
Kind: "pipeline",
}, nil
}
func getGitClient(req *config.Request) git.Client {
return git.New(req.Repo.Namespace, req.Repo.Name, req.Build.After, req.Repo.Config)
}
func getModifiedApi(api ApiList, modifiedFileList []string) ApiList {
ret := make(ApiList, 0)
tempIndex := NewSet()
for i, a := range api {
for _, file := range modifiedFileList {
if strings.HasPrefix(file, a.Root) {
tempIndex.Add(i)
}
}
}
for _, i := range tempIndex.ToSlice() {
ret = append(ret, api[i])
}
return ret
}
func getModifiedService(service ServiceList, modifiedFileList []string) ServiceList {
ret := make(ServiceList, 0)
tempIndex := NewSet()
for i, s := range service {
for _, file := range modifiedFileList {
if strings.HasPrefix(file, s.Root) {
tempIndex.Add(i)
}
}
}
for _, i := range tempIndex.ToSlice() {
ret = append(ret, service[i])
}
return ret
}