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 n := strings.LastIndex(retData, "---") if n > 0 { retData = retData[:n] } 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 }