-
Notifications
You must be signed in to change notification settings - Fork 168
/
deployment.go
40 lines (34 loc) · 1.17 KB
/
deployment.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package cd
import (
"context"
"fmt"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/util/retry"
)
// UpdateDeployment updates images in a deployment.
func UpdateDeployment(client kubernetes.Interface, config *Config) error {
if config.Deployment.Type != DeploymentTypeDeployment {
return fmt.Errorf("expect type '%s', but got %s", DeploymentTypeDeployment, config.Deployment.Type)
}
return retry.RetryOnConflict(retry.DefaultRetry, func() error {
deploy, err := client.AppsV1().Deployments(config.Deployment.Namespace).Get(context.TODO(), config.Deployment.Name, metav1.GetOptions{})
if err != nil {
return err
}
var containers []corev1.Container
for i, c := range deploy.Spec.Template.Spec.Containers {
for _, u := range config.Images {
if u.Container == fmt.Sprintf("#%d", i) || u.Container == c.Name {
c.Image = u.Image
break
}
}
containers = append(containers, c)
}
deploy.Spec.Template.Spec.Containers = containers
_, err = client.AppsV1().Deployments(config.Deployment.Namespace).Update(context.TODO(), deploy, metav1.UpdateOptions{})
return err
})
}