mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2026-04-15 01:41:56 +00:00
RWX volume provided by storageclass
This commit is contained in:
@@ -517,10 +517,24 @@ var flags = []cli.Flag{
|
||||
Name: "kubernetes",
|
||||
Usage: "Kubernetes backend is enabled",
|
||||
},
|
||||
cli.StringFlag{
|
||||
EnvVar: "DRONE_KUBERNETES_NAMESPACE",
|
||||
Name: "namespace",
|
||||
Usage: "Kubernetes namespace to create resource in",
|
||||
},
|
||||
cli.StringFlag{
|
||||
EnvVar: "DRONE_KUBERNETES_STORAGECLASS",
|
||||
Name: "storageclass",
|
||||
Usage: "Kubernetes storageclass to use for volumes",
|
||||
},
|
||||
cli.StringFlag{
|
||||
EnvVar: "DRONE_KUBERNETES_VOLUME_SIZE",
|
||||
Name: "volumesize",
|
||||
Usage: "Size of the volume available for the pipeline",
|
||||
},
|
||||
}
|
||||
|
||||
func server(c *cli.Context) error {
|
||||
|
||||
// debug level if requested by user
|
||||
if c.Bool("debug") {
|
||||
logrus.SetLevel(logrus.DebugLevel)
|
||||
@@ -601,7 +615,7 @@ func server(c *cli.Context) error {
|
||||
}
|
||||
log.Printf("pipeline: received next execution: %s", work.ID)
|
||||
|
||||
engine, err := kubernetes.New()
|
||||
engine, err := kubernetes.New(c.String("namespace"), c.String("storageclass"), c.String("volumesize"))
|
||||
if err != nil {
|
||||
logrus.Error(err)
|
||||
return err
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -25,13 +24,15 @@ import (
|
||||
)
|
||||
|
||||
type engine struct {
|
||||
logs *bytes.Buffer
|
||||
kubeClient kubernetes.Interface
|
||||
namespace string
|
||||
logs *bytes.Buffer
|
||||
kubeClient kubernetes.Interface
|
||||
namespace string
|
||||
storageClass string
|
||||
volumeSize string
|
||||
}
|
||||
|
||||
// New returns a new Kubernetes Engine.
|
||||
func New() (backend.Engine, error) {
|
||||
func New(namespace1 string, storageClass1 string, size string) (backend.Engine, error) {
|
||||
var kubeClient kubernetes.Interface
|
||||
_, err := rest.InClusterConfig()
|
||||
if err != nil {
|
||||
@@ -45,9 +46,11 @@ func New() (backend.Engine, error) {
|
||||
}
|
||||
|
||||
return &engine{
|
||||
logs: new(bytes.Buffer),
|
||||
kubeClient: kubeClient,
|
||||
namespace: "default",
|
||||
logs: new(bytes.Buffer),
|
||||
kubeClient: kubeClient,
|
||||
namespace: namespace1,
|
||||
storageClass: storageClass1,
|
||||
volumeSize: size,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -55,38 +58,9 @@ func New() (backend.Engine, error) {
|
||||
func (e *engine) Setup(ctx context.Context, conf *backend.Config) error {
|
||||
e.logs.WriteString("Setting up Kubernetes primitives\n")
|
||||
|
||||
// We don't need to create a PVC if no volumes are requested
|
||||
if len(conf.Volumes) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
nodeList, err := e.kubeClient.CoreV1().Nodes().List(metav1.ListOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var nodeNames []string
|
||||
for _, n := range nodeList.Items {
|
||||
nodeNames = append(nodeNames, n.Name)
|
||||
}
|
||||
|
||||
// Pick random node for now.
|
||||
var node string
|
||||
if len(nodeNames) == 1 {
|
||||
node = nodeNames[0]
|
||||
} else {
|
||||
node = nodeNames[rand.Intn(len(nodeNames)-1)]
|
||||
}
|
||||
|
||||
for _, vol := range conf.Volumes {
|
||||
pv := PersistentVolume(node, e.namespace, vol.Name)
|
||||
_, err := e.kubeClient.CoreV1().PersistentVolumes().Create(pv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pvc := PersistentVolumeClaim(e.namespace, vol.Name)
|
||||
_, err = e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc)
|
||||
pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize)
|
||||
_, err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -264,17 +238,11 @@ func (e *engine) Destroy(ctx context.Context, conf *backend.Config) error {
|
||||
}
|
||||
|
||||
for _, vol := range conf.Volumes {
|
||||
pvc := PersistentVolumeClaim(e.namespace, vol.Name)
|
||||
pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize)
|
||||
err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Delete(pvc.Name, deleteOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pv := PersistentVolume("", e.namespace, vol.Name)
|
||||
err = e.kubeClient.CoreV1().PersistentVolumes().Delete(pv.Name, deleteOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -8,46 +8,7 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
var (
|
||||
volumeSize = resource.MustParse("1Gi")
|
||||
)
|
||||
|
||||
func PersistentVolume(node, namespace, name string) *v1.PersistentVolume {
|
||||
return &v1.PersistentVolume{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: volumeName(name),
|
||||
Namespace: namespace,
|
||||
},
|
||||
Spec: v1.PersistentVolumeSpec{
|
||||
Capacity: v1.ResourceList{
|
||||
v1.ResourceStorage: volumeSize,
|
||||
},
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
|
||||
PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimRetain,
|
||||
StorageClassName: "local-storage",
|
||||
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||
Local: &v1.LocalVolumeSource{
|
||||
Path: "/tmp/drone",
|
||||
},
|
||||
},
|
||||
NodeAffinity: &v1.VolumeNodeAffinity{
|
||||
Required: &v1.NodeSelector{
|
||||
NodeSelectorTerms: []v1.NodeSelectorTerm{{
|
||||
MatchExpressions: []v1.NodeSelectorRequirement{{
|
||||
Key: "kubernetes.io/hostname",
|
||||
Operator: v1.NodeSelectorOpIn,
|
||||
Values: []string{node},
|
||||
}},
|
||||
}},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim {
|
||||
localStorageClass := "local-storage"
|
||||
|
||||
func PersistentVolumeClaim(namespace, name string, storageClass string, size string) *v1.PersistentVolumeClaim {
|
||||
return &v1.PersistentVolumeClaim{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: volumeName(name),
|
||||
@@ -55,10 +16,10 @@ func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim {
|
||||
},
|
||||
Spec: v1.PersistentVolumeClaimSpec{
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
|
||||
StorageClassName: &localStorageClass,
|
||||
StorageClassName: &storageClass,
|
||||
Resources: v1.ResourceRequirements{
|
||||
Requests: v1.ResourceList{
|
||||
v1.ResourceStorage: volumeSize,
|
||||
v1.ResourceStorage: resource.MustParse(size),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user