support set maven user setting config

This commit is contained in:
barnettZQG 2020-09-11 21:21:19 +08:00
parent 8c47cf8b28
commit 8c912b2b22
10 changed files with 480 additions and 138 deletions

View File

@ -25,6 +25,11 @@ import (
// ClusterInterface - // ClusterInterface -
type ClusterInterface interface { type ClusterInterface interface {
GetClusterInfo(w http.ResponseWriter, r *http.Request) GetClusterInfo(w http.ResponseWriter, r *http.Request)
MavenSettingList(w http.ResponseWriter, r *http.Request)
MavenSettingAdd(w http.ResponseWriter, r *http.Request)
MavenSettingUpdate(w http.ResponseWriter, r *http.Request)
MavenSettingDelete(w http.ResponseWriter, r *http.Request)
MavenSettingDetail(w http.ResponseWriter, r *http.Request)
} }
//TenantInterface interface //TenantInterface interface

View File

@ -82,6 +82,11 @@ func (v2 *V2) eventsRouter() chi.Router {
func (v2 *V2) clusterRouter() chi.Router { func (v2 *V2) clusterRouter() chi.Router {
r := chi.NewRouter() r := chi.NewRouter()
r.Get("/", controller.GetManager().GetClusterInfo) r.Get("/", controller.GetManager().GetClusterInfo)
r.Get("/builder/mavensetting", controller.GetManager().MavenSettingList)
r.Post("/builder/mavensetting", controller.GetManager().MavenSettingAdd)
r.Get("/builder/mavensetting/{name}", controller.GetManager().MavenSettingDetail)
r.Put("/builder/mavensetting/{name}", controller.GetManager().MavenSettingUpdate)
r.Delete("/builder/mavensetting/{name}", controller.GetManager().MavenSettingDelete)
return r return r
} }

View File

@ -22,6 +22,7 @@ import (
"net/http" "net/http"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/go-chi/chi"
"github.com/goodrain/rainbond/api/handler" "github.com/goodrain/rainbond/api/handler"
httputil "github.com/goodrain/rainbond/util/http" httputil "github.com/goodrain/rainbond/util/http"
@ -42,3 +43,61 @@ func (t *ClusterController) GetClusterInfo(w http.ResponseWriter, r *http.Reques
httputil.ReturnSuccess(r, w, nodes) httputil.ReturnSuccess(r, w, nodes)
} }
//MavenSettingList maven setting list
func (t *ClusterController) MavenSettingList(w http.ResponseWriter, r *http.Request) {
httputil.ReturnSuccess(r, w, handler.GetClusterHandler().MavenSettingList())
}
//MavenSettingAdd maven setting add
func (t *ClusterController) MavenSettingAdd(w http.ResponseWriter, r *http.Request) {
var set handler.MavenSetting
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &set, nil); !ok {
return
}
if err := handler.GetClusterHandler().MavenSettingAdd(&set); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, &set)
}
//MavenSettingUpdate maven setting file update
func (t *ClusterController) MavenSettingUpdate(w http.ResponseWriter, r *http.Request) {
type SettingUpdate struct {
Content string `json:"content" validate:"required"`
}
var su SettingUpdate
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &su, nil); !ok {
return
}
set := &handler.MavenSetting{
Name: chi.URLParam(r, "name"),
Content: su.Content,
}
if err := handler.GetClusterHandler().MavenSettingUpdate(set); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, set)
}
//MavenSettingDelete maven setting file delete
func (t *ClusterController) MavenSettingDelete(w http.ResponseWriter, r *http.Request) {
err := handler.GetClusterHandler().MavenSettingDelete(chi.URLParam(r, "name"))
if err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
//MavenSettingDetail maven setting file delete
func (t *ClusterController) MavenSettingDetail(w http.ResponseWriter, r *http.Request) {
c, err := handler.GetClusterHandler().MavenSettingDetail(chi.URLParam(r, "name"))
if err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, c)
}

View File

@ -3,11 +3,16 @@ package handler
import ( import (
"fmt" "fmt"
"runtime" "runtime"
"strings"
"time"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/goodrain/rainbond/api/model" "github.com/goodrain/rainbond/api/model"
"github.com/goodrain/rainbond/api/util"
"github.com/goodrain/rainbond/builder/parser/code"
"github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/disk"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
@ -16,16 +21,23 @@ import (
// ClusterHandler - // ClusterHandler -
type ClusterHandler interface { type ClusterHandler interface {
GetClusterInfo() (*model.ClusterResource, error) GetClusterInfo() (*model.ClusterResource, error)
MavenSettingAdd(ms *MavenSetting) *util.APIHandleError
MavenSettingList() (re []MavenSetting)
MavenSettingUpdate(ms *MavenSetting) *util.APIHandleError
MavenSettingDelete(name string) *util.APIHandleError
MavenSettingDetail(name string) (*MavenSetting, *util.APIHandleError)
} }
// NewClusterHandler - // NewClusterHandler -
func NewClusterHandler(clientset *kubernetes.Clientset) ClusterHandler { func NewClusterHandler(clientset *kubernetes.Clientset, RbdNamespace string) ClusterHandler {
return &clusterAction{ return &clusterAction{
namespace: RbdNamespace,
clientset: clientset, clientset: clientset,
} }
} }
type clusterAction struct { type clusterAction struct {
namespace string
clientset *kubernetes.Clientset clientset *kubernetes.Clientset
} }
@ -184,3 +196,120 @@ func (c *clusterAction) listPods(nodeName string) (pods []corev1.Pod, err error)
return podList.Items, nil return podList.Items, nil
} }
//MavenSetting maven setting
type MavenSetting struct {
Name string `json:"name" validate:"required"`
CreateTime string `json:"create_time"`
UpdateTime string `json:"update_time"`
Content string `json:"content" validate:"required"`
}
//MavenSettingList maven setting list
func (c *clusterAction) MavenSettingList() (re []MavenSetting) {
cms, err := c.clientset.CoreV1().ConfigMaps(c.namespace).List(metav1.ListOptions{
LabelSelector: "configtype=mavensetting",
})
if err != nil {
logrus.Errorf("list maven setting config list failure %s", err.Error())
}
for _, sm := range cms.Items {
info := strings.Split(sm.Name, "-")
if len(info) > 0 {
re = append(re, MavenSetting{
Name: info[len(info)-1],
CreateTime: sm.CreationTimestamp.Format(time.RFC3339),
UpdateTime: sm.Labels["updateTime"],
Content: sm.Data["mavensetting"],
})
}
}
return
}
//MavenSettingAdd maven setting add
func (c *clusterAction) MavenSettingAdd(ms *MavenSetting) *util.APIHandleError {
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, ms.Name))
config := &corev1.ConfigMap{}
config.Name = realName
config.Namespace = c.namespace
config.Labels = map[string]string{
"creator": "Rainbond",
"configtype": "mavensetting",
}
config.Annotations = map[string]string{
"updateTime": time.Now().Format(time.RFC3339),
}
config.Data = map[string]string{
"mavensetting": ms.Content,
}
_, err := c.clientset.CoreV1().ConfigMaps(c.namespace).Create(config)
if err != nil {
if apierrors.IsAlreadyExists(err) {
return &util.APIHandleError{Code: 400, Err: fmt.Errorf("setting name is exist")}
}
logrus.Errorf("create maven setting configmap failure %s", err.Error())
return &util.APIHandleError{Code: 500, Err: fmt.Errorf("create setting config failure")}
}
ms.CreateTime = time.Now().Format(time.RFC3339)
ms.UpdateTime = time.Now().Format(time.RFC3339)
return nil
}
//MavenSettingUpdate maven setting file update
func (c *clusterAction) MavenSettingUpdate(ms *MavenSetting) *util.APIHandleError {
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, ms.Name))
sm, err := c.clientset.CoreV1().ConfigMaps(c.namespace).Get(realName, metav1.GetOptions{})
if err != nil {
if apierrors.IsNotFound(err) {
return &util.APIHandleError{Code: 404, Err: fmt.Errorf("setting name is not exist")}
}
logrus.Errorf("get maven setting config list failure %s", err.Error())
return &util.APIHandleError{Code: 400, Err: fmt.Errorf("get setting failure")}
}
if sm.Data == nil {
sm.Data = make(map[string]string)
}
if sm.Annotations == nil {
sm.Annotations = make(map[string]string)
}
sm.Data["mavensetting"] = ms.Content
sm.Annotations["updateTime"] = time.Now().Format(time.RFC3339)
if _, err := c.clientset.CoreV1().ConfigMaps(c.namespace).Update(sm); err != nil {
logrus.Errorf("update maven setting configmap failure %s", err.Error())
return &util.APIHandleError{Code: 500, Err: fmt.Errorf("update setting config failure")}
}
ms.UpdateTime = sm.Annotations["updateTime"]
ms.CreateTime = sm.CreationTimestamp.Format(time.RFC3339)
return nil
}
//MavenSettingDelete maven setting file delete
func (c *clusterAction) MavenSettingDelete(name string) *util.APIHandleError {
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
err := c.clientset.CoreV1().ConfigMaps(c.namespace).Delete(realName, &metav1.DeleteOptions{})
if err != nil {
if apierrors.IsNotFound(err) {
return &util.APIHandleError{Code: 404, Err: fmt.Errorf("setting not found")}
}
logrus.Errorf("delete maven setting config list failure %s", err.Error())
return &util.APIHandleError{Code: 500, Err: fmt.Errorf("setting delete failure")}
}
return nil
}
//MavenSettingDetail maven setting file delete
func (c *clusterAction) MavenSettingDetail(name string) (*MavenSetting, *util.APIHandleError) {
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
sm, err := c.clientset.CoreV1().ConfigMaps(c.namespace).Get(realName, metav1.GetOptions{})
if err != nil {
logrus.Errorf("get maven setting config failure %s", err.Error())
return nil, &util.APIHandleError{Code: 404, Err: fmt.Errorf("setting not found")}
}
return &MavenSetting{
Name: sm.Name,
CreateTime: sm.CreationTimestamp.Format(time.RFC3339),
UpdateTime: sm.Annotations["updateTime"],
Content: sm.Data["mavensetting"],
}, nil
}

View File

@ -68,7 +68,7 @@ func InitHandle(conf option.Config,
batchOperationHandler = CreateBatchOperationHandler(mqClient, operationHandler) batchOperationHandler = CreateBatchOperationHandler(mqClient, operationHandler)
defaultAppRestoreHandler = NewAppRestoreHandler() defaultAppRestoreHandler = NewAppRestoreHandler()
defPodHandler = NewPodHandler(statusCli) defPodHandler = NewPodHandler(statusCli)
defClusterHandler = NewClusterHandler(kubeClient) defClusterHandler = NewClusterHandler(kubeClient, conf.RbdNamespace)
defaultVolumeTypeHandler = CreateVolumeTypeManger(statusCli) defaultVolumeTypeHandler = CreateVolumeTypeManger(statusCli)
defaultEtcdHandler = NewEtcdHandler(etcdcli) defaultEtcdHandler = NewEtcdHandler(etcdcli)

View File

@ -33,11 +33,11 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/eapache/channels" "github.com/eapache/channels"
"github.com/fsnotify/fsnotify" "github.com/fsnotify/fsnotify"
"github.com/goodrain/rainbond/builder" "github.com/goodrain/rainbond/builder"
jobc "github.com/goodrain/rainbond/builder/job" jobc "github.com/goodrain/rainbond/builder/job"
"github.com/goodrain/rainbond/builder/parser/code"
"github.com/goodrain/rainbond/builder/sources" "github.com/goodrain/rainbond/builder/sources"
"github.com/goodrain/rainbond/event" "github.com/goodrain/rainbond/event"
"github.com/goodrain/rainbond/util" "github.com/goodrain/rainbond/util"
@ -277,23 +277,6 @@ func (s *slugBuild) runBuildJob(re *Request) error {
}() }()
name := fmt.Sprintf("%s-%s", re.ServiceID, re.DeployVersion) name := fmt.Sprintf("%s-%s", re.ServiceID, re.DeployVersion)
namespace := re.RbdNamespace namespace := re.RbdNamespace
envs := []corev1.EnvVar{
{Name: "SLUG_VERSION", Value: re.DeployVersion},
{Name: "SERVICE_ID", Value: re.ServiceID},
{Name: "TENANT_ID", Value: re.TenantID},
{Name: "LANGUAGE", Value: re.Lang.String()},
}
for k, v := range re.BuildEnvs {
envs = append(envs, corev1.EnvVar{Name: k, Value: v})
if k == "PROC_ENV" {
var mapdata = make(map[string]interface{})
if err := json.Unmarshal([]byte(v), &mapdata); err == nil {
if runtime, ok := mapdata["runtimes"]; ok {
envs = append(envs, corev1.EnvVar{Name: "RUNTIME", Value: runtime.(string)})
}
}
}
}
job := corev1.Pod{ job := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: name, Name: name,
@ -304,7 +287,35 @@ func (s *slugBuild) runBuildJob(re *Request) error {
}, },
}, },
} }
envs := []corev1.EnvVar{
{Name: "SLUG_VERSION", Value: re.DeployVersion},
{Name: "SERVICE_ID", Value: re.ServiceID},
{Name: "TENANT_ID", Value: re.TenantID},
{Name: "LANGUAGE", Value: re.Lang.String()},
}
var mavenSettingName string
for k, v := range re.BuildEnvs {
if k == "MAVEN_SETTING_NAME" {
mavenSettingName = v
continue
}
if k == "PROCFILE" {
if !strings.HasPrefix(v, "web:") {
v = "web: " + v
} else if v[4] != ' ' {
v = "web: " + v[4:]
}
}
envs = append(envs, corev1.EnvVar{Name: k, Value: v})
if k == "PROC_ENV" {
var mapdata = make(map[string]interface{})
if err := json.Unmarshal([]byte(v), &mapdata); err == nil {
if runtime, ok := mapdata["runtimes"]; ok {
envs = append(envs, corev1.EnvVar{Name: "RUNTIME", Value: runtime.(string)})
}
}
}
}
podSpec := corev1.PodSpec{RestartPolicy: corev1.RestartPolicyOnFailure} // only support never and onfailure podSpec := corev1.PodSpec{RestartPolicy: corev1.RestartPolicyOnFailure} // only support never and onfailure
// schedule builder // schedule builder
if re.CacheMode == "hostpath" { if re.CacheMode == "hostpath" {
@ -337,10 +348,14 @@ func (s *slugBuild) runBuildJob(re *Request) error {
VolumeSource: re.CacheVolumeSource(), VolumeSource: re.CacheVolumeSource(),
}, },
} }
container := corev1.Container{
container := corev1.Container{Name: name, Image: builder.BUILDERIMAGENAME, Stdin: true, StdinOnce: true} Name: name,
container.Env = envs Image: builder.BUILDERIMAGENAME,
container.Args = []string{"local"} Stdin: true,
StdinOnce: true,
Env: envs,
Args: []string{"local"},
}
slugSubPath := strings.TrimPrefix(re.TGZDir, "/grdata/") slugSubPath := strings.TrimPrefix(re.TGZDir, "/grdata/")
logrus.Debugf("sourceTarFileName is: %s", sourceTarFileName) logrus.Debugf("sourceTarFileName is: %s", sourceTarFileName)
sourceTarPath := strings.TrimPrefix(sourceTarFileName, "/cache/") sourceTarPath := strings.TrimPrefix(sourceTarFileName, "/cache/")
@ -362,6 +377,38 @@ func (s *slugBuild) runBuildJob(re *Request) error {
SubPath: sourceTarPath, SubPath: sourceTarPath,
}, },
} }
//set maven setting
if mavenSettingName != "" && re.Lang.String() == code.JavaMaven.String() {
if setting := jobc.GetJobController().GetLanguageBuildSetting(code.JavaMaven, mavenSettingName); setting != "" {
podSpec.Volumes = append(podSpec.Volumes, corev1.Volume{
Name: "mavensetting",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{
Name: setting,
},
},
},
})
mountPath := "/etc/maven/setting.xml"
container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{
MountPath: mountPath,
SubPath: "mavensetting",
Name: "mavensetting",
})
container.Env = append(container.Env, corev1.EnvVar{
Name: "MAVEN_SETTINGS_PATH",
Value: mountPath,
})
container.Env = append(container.Env, corev1.EnvVar{
Name: "MAVEN_MIRROR_DISABLE",
Value: "true",
})
logrus.Infof("set maven setting config %s success", mavenSettingName)
} else {
logrus.Warnf("maven setting config %s not found", mavenSettingName)
}
}
podSpec.Containers = append(podSpec.Containers, container) podSpec.Containers = append(podSpec.Containers, container)
for _, ha := range re.HostAlias { for _, ha := range re.HostAlias {
podSpec.HostAliases = append(podSpec.HostAliases, corev1.HostAlias{IP: ha.IP, Hostnames: ha.Hostnames}) podSpec.HostAliases = append(podSpec.HostAliases, corev1.HostAlias{IP: ha.IP, Hostnames: ha.Hostnames})
@ -425,116 +472,6 @@ func (s *slugBuild) waitingComplete(re *Request, reChan *channels.RingChannel) (
} }
} }
//runBuildContainer The deprecated
func (s *slugBuild) runBuildContainer(re *Request) error {
envs := []*sources.KeyValue{
&sources.KeyValue{Key: "SLUG_VERSION", Value: re.DeployVersion},
&sources.KeyValue{Key: "SERVICE_ID", Value: re.ServiceID},
&sources.KeyValue{Key: "TENANT_ID", Value: re.TenantID},
&sources.KeyValue{Key: "LANGUAGE", Value: re.Lang.String()},
}
for k, v := range re.BuildEnvs {
envs = append(envs, &sources.KeyValue{Key: k, Value: v})
if k == "PROC_ENV" {
var mapdata = make(map[string]interface{})
if err := json.Unmarshal([]byte(v), &mapdata); err == nil {
if runtime, ok := mapdata["runtimes"]; ok {
envs = append(envs, &sources.KeyValue{Key: "RUNTIME", Value: runtime.(string)})
}
}
}
}
containerConfig := &sources.ContainerConfig{
Metadata: &sources.ContainerMetadata{
Name: re.ServiceID[:8] + "_" + re.DeployVersion,
},
Image: &sources.ImageSpec{
Image: builder.BUILDERIMAGENAME,
},
Mounts: []*sources.Mount{
&sources.Mount{
ContainerPath: "/tmp/cache",
HostPath: re.CacheDir,
Readonly: false,
},
&sources.Mount{
ContainerPath: "/tmp/slug",
HostPath: s.tgzDir,
Readonly: false,
},
},
Envs: envs,
Stdin: true,
StdinOnce: true,
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
NetworkConfig: &sources.NetworkConfig{
NetworkMode: "host",
},
Args: []string{"local"},
ExtraHosts: re.ExtraHosts,
}
sourceTarFileName, err := s.getSourceCodeTarFile(re)
if err != nil {
return fmt.Errorf("create source code tar file error:%s", err.Error())
}
reader, err := os.OpenFile(sourceTarFileName, os.O_RDONLY, 0755)
if err != nil {
return fmt.Errorf("open source code tar file error:%s", err.Error())
}
defer func() {
reader.Close()
os.Remove(reader.Name())
}()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
containerService := sources.CreateDockerService(ctx, re.DockerClient)
containerID, err := containerService.CreateContainer(containerConfig)
if err != nil {
if client.IsErrNotFound(err) {
// we don't want to write to stdout anything apart from container.ID
if _, err = sources.ImagePull(re.DockerClient, containerConfig.Image.Image, builder.REGISTRYUSER, builder.REGISTRYPASS, re.Logger, 20); err != nil {
return fmt.Errorf("pull builder container image error:%s", err.Error())
}
// Retry
containerID, err = containerService.CreateContainer(containerConfig)
}
//The container already exists.
if err != nil && strings.Contains(err.Error(), "is already in use by container") {
//remove exist container
containerService.RemoveContainer(containerID)
// Retry
containerID, err = containerService.CreateContainer(containerConfig)
}
if err != nil {
return fmt.Errorf("create builder container failure %s", err.Error())
}
}
errchan := make(chan error, 1)
writer := re.Logger.GetWriter("builder", "info")
close, err := containerService.AttachContainer(containerID, true, true, true, reader, writer, writer, &errchan)
if err != nil {
containerService.RemoveContainer(containerID)
return fmt.Errorf("attach builder container error:%s", err.Error())
}
defer close()
statuschan := containerService.WaitExitOrRemoved(containerID, true)
//start the container
if err := containerService.StartContainer(containerID); err != nil {
containerService.RemoveContainer(containerID)
return fmt.Errorf("start builder container error:%s", err.Error())
}
if err := <-errchan; err != nil {
logrus.Debugf("Error hijack: %s", err)
}
status := <-statuschan
if status != 0 {
return &ErrorBuild{Code: status}
}
return nil
}
func (s *slugBuild) setImagePullSecretsForPod(pod *corev1.Pod) { func (s *slugBuild) setImagePullSecretsForPod(pod *corev1.Pod) {
imagePullSecretName := os.Getenv("IMAGE_PULL_SECRET") imagePullSecretName := os.Getenv("IMAGE_PULL_SECRET")
if imagePullSecretName == "" { if imagePullSecretName == "" {

View File

@ -21,12 +21,15 @@ package job
import ( import (
"bufio" "bufio"
"context" "context"
"fmt"
"io" "io"
"strings"
"sync" "sync"
"time" "time"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/eapache/channels" "github.com/eapache/channels"
"github.com/goodrain/rainbond/builder/parser/code"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
k8sErrors "k8s.io/apimachinery/pkg/api/errors" k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -43,6 +46,7 @@ type Controller interface {
GetJob(string) (*corev1.Pod, error) GetJob(string) (*corev1.Pod, error)
GetServiceJobs(serviceID string) ([]*corev1.Pod, error) GetServiceJobs(serviceID string) ([]*corev1.Pod, error)
DeleteJob(job string) DeleteJob(job string)
GetLanguageBuildSetting(lang code.Lang, name string) string
} }
type controller struct { type controller struct {
KubeClient kubernetes.Interface KubeClient kubernetes.Interface
@ -228,3 +232,15 @@ func (c *controller) DeleteJob(job string) {
c.jobContainerStatus.Delete(job) c.jobContainerStatus.Delete(job)
logrus.Infof("delete job %s finish", job) logrus.Infof("delete job %s finish", job)
} }
func (c *controller) GetLanguageBuildSetting(lang code.Lang, name string) string {
cname := strings.ToLower(fmt.Sprintf("%s-%s", lang, name))
config, err := c.KubeClient.CoreV1().ConfigMaps(c.namespace).Get(cname, metav1.GetOptions{})
if err != nil {
logrus.Errorf("get configmap %s failure %s", cname, err.Error())
}
if config != nil {
return cname
}
return ""
}

View File

@ -59,6 +59,7 @@ type Config struct {
LogPath string LogPath string
KuberentesDashboardAPI string KuberentesDashboardAPI string
KubeConfigPath string KubeConfigPath string
RbdNamespace string
} }
//APIServer apiserver server //APIServer apiserver server
@ -109,6 +110,7 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&a.LogPath, "log-path", "/grdata/logs", "Where Docker log files and event log files are stored.") fs.StringVar(&a.LogPath, "log-path", "/grdata/logs", "Where Docker log files and event log files are stored.")
fs.StringVar(&a.KubeConfigPath, "kube-config", "", "kube config file path, No setup is required to run in a cluster.") fs.StringVar(&a.KubeConfigPath, "kube-config", "", "kube config file path, No setup is required to run in a cluster.")
fs.StringVar(&a.KuberentesDashboardAPI, "k8s-dashboard-api", "kubernetes-dashboard.rbd-system:443", "The service DNS name of Kubernetes dashboard. Default to kubernetes-dashboard.kubernetes-dashboard") fs.StringVar(&a.KuberentesDashboardAPI, "k8s-dashboard-api", "kubernetes-dashboard.rbd-system:443", "The service DNS name of Kubernetes dashboard. Default to kubernetes-dashboard.kubernetes-dashboard")
fs.StringVar(&a.RbdNamespace, "rbd-namespace", "rbd-system", "rbd component namespace")
} }
//SetLog 设置log //SetLog 设置log

View File

@ -21,18 +21,24 @@ package cmd
import ( import (
"context" "context"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path" "path"
"strings" "strings"
"time"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/apcera/termtables"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/goodrain/rainbond/builder" "github.com/goodrain/rainbond/builder"
"github.com/goodrain/rainbond/builder/parser/code" "github.com/goodrain/rainbond/builder/parser/code"
"github.com/goodrain/rainbond/builder/sources" "github.com/goodrain/rainbond/builder/sources"
"github.com/goodrain/rainbond/grctl/clients"
"github.com/goodrain/rainbond/util" "github.com/goodrain/rainbond/util"
"github.com/urfave/cli" "github.com/urfave/cli"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
//NewSourceBuildCmd cmd for source build test //NewSourceBuildCmd cmd for source build test
@ -106,6 +112,189 @@ func NewSourceBuildCmd() cli.Command {
cmd.Run() cmd.Run()
}, },
}, },
cli.Command{
Name: "maven-setting",
Usage: "maven setting config file manage",
Subcommands: []cli.Command{
cli.Command{
Name: "list",
Flags: []cli.Flag{
cli.StringFlag{
Name: "namespace,ns",
Usage: "rainbond default namespace",
Value: "rbd-system",
},
},
Usage: "list maven setting config file manage",
Action: func(ctx *cli.Context) {
Common(ctx)
namespace := ctx.String("namespace")
cms, err := clients.K8SClient.CoreV1().ConfigMaps(namespace).List(metav1.ListOptions{
LabelSelector: "configtype=mavensetting",
})
if err != nil {
showError(err.Error())
}
runtable := termtables.CreateTable()
runtable.AddHeaders("Name", "CreateTime", "UpdateTime")
for _, cm := range cms.Items {
info := strings.Split(cm.Name, "-")
var updateTime = "-"
if cm.Annotations != nil {
updateTime = cm.Annotations["updateTime"]
}
if len(info) > 0 {
runtable.AddRow(info[len(info)-1], cm.CreationTimestamp.Format(time.RFC3339), updateTime)
}
}
fmt.Println(runtable.Render())
},
},
cli.Command{
Name: "get",
Flags: []cli.Flag{
cli.StringFlag{
Name: "namespace,ns",
Usage: "rainbond default namespace",
Value: "rbd-system",
},
},
Usage: "get maven setting config file manage",
Action: func(ctx *cli.Context) {
Common(ctx)
name := ctx.Args().First()
if name == "" {
showError("Please specify the task pod name")
}
namespace := ctx.String("namespace")
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
cm, err := clients.K8SClient.CoreV1().ConfigMaps(namespace).Get(realName, metav1.GetOptions{})
if err != nil {
showError(err.Error())
}
fmt.Println(cm.Data["mavensetting"])
},
},
cli.Command{
Name: "update",
Usage: "update maven setting config file manage",
Flags: []cli.Flag{
cli.StringFlag{
Name: "file,f",
Usage: "define maven setting file",
Value: "./setting.xml",
},
cli.StringFlag{
Name: "namespace,ns",
Usage: "rainbond default namespace",
Value: "rbd-system",
},
},
Action: func(ctx *cli.Context) {
Common(ctx)
name := ctx.Args().First()
if name == "" {
showError("Please specify the task pod name")
}
namespace := ctx.String("namespace")
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
cm, err := clients.K8SClient.CoreV1().ConfigMaps(namespace).Get(realName, metav1.GetOptions{})
if err != nil {
showError(err.Error())
}
body, err := ioutil.ReadFile(ctx.String("f"))
if err != nil {
showError(err.Error())
}
if cm.Data == nil {
cm.Data = make(map[string]string)
}
if cm.Annotations == nil {
cm.Annotations = make(map[string]string)
}
cm.Data["mavensetting"] = string(body)
cm.Annotations["updateTime"] = time.Now().Format(time.RFC3339)
_, err = clients.K8SClient.CoreV1().ConfigMaps(namespace).Update(cm)
if err != nil {
showError(err.Error())
}
fmt.Println("Update Success")
},
},
cli.Command{
Name: "add",
Usage: "add maven setting config file manage",
Flags: []cli.Flag{
cli.StringFlag{
Name: "file,f",
Usage: "define maven setting file",
Value: "./setting.xml",
},
cli.StringFlag{
Name: "namespace,ns",
Usage: "rainbond default namespace",
Value: "rbd-system",
},
},
Action: func(ctx *cli.Context) {
Common(ctx)
name := ctx.Args().First()
if name == "" {
showError("Please specify the task pod name")
}
namespace := ctx.String("namespace")
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
body, err := ioutil.ReadFile(ctx.String("f"))
if err != nil {
showError(err.Error())
}
config := &corev1.ConfigMap{}
config.Name = realName
config.Namespace = namespace
config.Labels = map[string]string{
"creator": "Rainbond",
"configtype": "mavensetting",
}
config.Annotations = map[string]string{
"updateTime": time.Now().Format(time.RFC3339),
}
config.Data = map[string]string{
"mavensetting": string(body),
}
_, err = clients.K8SClient.CoreV1().ConfigMaps(namespace).Create(config)
if err != nil {
showError(err.Error())
}
fmt.Println("Add Success")
},
},
cli.Command{
Name: "delete",
Usage: "delete maven setting config file manage",
Flags: []cli.Flag{
cli.StringFlag{
Name: "namespace,ns",
Usage: "rainbond default namespace",
Value: "rbd-system",
},
},
Action: func(ctx *cli.Context) {
Common(ctx)
name := ctx.Args().First()
if name == "" {
showError("Please specify the task pod name")
}
namespace := ctx.String("namespace")
realName := strings.ToLower(fmt.Sprintf("%s-%s", code.JavaMaven, name))
err := clients.K8SClient.CoreV1().ConfigMaps(namespace).Delete(realName, &metav1.DeleteOptions{})
if err != nil {
showError(err.Error())
}
fmt.Println("Delete Success")
},
},
},
},
}, },
Name: "build", Name: "build",
Usage: "Commands related to building source code", Usage: "Commands related to building source code",

View File

@ -23,7 +23,7 @@ function localbuild() {
for item in "${build_items[@]}" for item in "${build_items[@]}"
do do
echo "build local ${item}" echo "build local ${item}"
go build -ldflags "-w -s -X github.com/goodrain/rainbond/cmd.version=${release_desc}" -o _output/${GOOS}/${VERSION}/rainbond-$item ./cmd/$item go build -ldflags "-X github.com/goodrain/rainbond/cmd.version=${release_desc}" -o _output/${GOOS}/${VERSION}/rainbond-$item ./cmd/$item
done done
else else
echo "build local $1 ${VERSION}" echo "build local $1 ${VERSION}"
@ -32,11 +32,11 @@ function localbuild() {
if [ "$GOOS" = "windows" ];then if [ "$GOOS" = "windows" ];then
outputname="_output/${GOOS}/${VERSION}/rainbond-$1.exe" outputname="_output/${GOOS}/${VERSION}/rainbond-$1.exe"
fi fi
ldflags="-w -s -X github.com/goodrain/rainbond/cmd.version=${release_desc}" ldflags="-X github.com/goodrain/rainbond/cmd.version=${release_desc}"
if [ "$STATIC" = "true" ];then if [ "$STATIC" = "true" ];then
ldflags="${ldflags} -extldflags '-static'" ldflags="${ldflags} -extldflags '-static'"
fi fi
CGO_ENABLED=1 go build -v -ldflags "${ldflags}" -o ${outputname} ./cmd/$1 go build -v -ldflags "${ldflags}" -o ${outputname} ./cmd/$1
fi fi
} }