#45 Improve feature
This commit is contained in:
parent
7849ddc6f5
commit
feae4e6e3d
|
|
@ -5,7 +5,7 @@ This document describes a getting started guide for **jenkins-operator** and an
|
||||||
1. [First Steps](#first-steps)
|
1. [First Steps](#first-steps)
|
||||||
2. [Deploy Jenkins](#deploy-jenkins)
|
2. [Deploy Jenkins](#deploy-jenkins)
|
||||||
3. [Configure Seed Jobs and Pipelines](#configure-seed-jobs-and-pipelines)
|
3. [Configure Seed Jobs and Pipelines](#configure-seed-jobs-and-pipelines)
|
||||||
4. [Pulling custom Jenkins image from Docker Registry](#Pulling custom Jenkins image from Docker Registry)
|
4. [Pulling Docker images from private repositories](#Pulling Docker images from private repositories)
|
||||||
5. [Install Plugins](#install-plugins)
|
5. [Install Plugins](#install-plugins)
|
||||||
6. [Configure Backup & Restore](#configure-backup-and-restore)
|
6. [Configure Backup & Restore](#configure-backup-and-restore)
|
||||||
7. [AKS](#aks)
|
7. [AKS](#aks)
|
||||||
|
|
@ -294,8 +294,8 @@ data:
|
||||||
password: password_or_token
|
password: password_or_token
|
||||||
```
|
```
|
||||||
|
|
||||||
## Pulling custom Jenkins image from Docker Registry
|
## Pulling Docker images from private repositories
|
||||||
Since **0.2.0** version it's possible to use custom prebuilt Jenkins Docker Image using `imagePullSecrets` annotation support.
|
To pull Docker Image from private repository you can use `imagePullSecrets`.
|
||||||
|
|
||||||
Please follow the instructions on [creating a secret with a docker config](https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config).
|
Please follow the instructions on [creating a secret with a docker config](https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config).
|
||||||
|
|
||||||
|
|
@ -304,10 +304,10 @@ To use Docker Hub additional steps are required.
|
||||||
|
|
||||||
Edit the previously created secret:
|
Edit the previously created secret:
|
||||||
```bash
|
```bash
|
||||||
kubectl edit secret <name>
|
kubectl -n <namespace> edit secret <name>
|
||||||
```
|
```
|
||||||
|
|
||||||
The `data..dockerconfigjson` key's value needs to be replaced with a modified version.
|
The `.dockerconfigjson` key's value needs to be replaced with a modified version.
|
||||||
|
|
||||||
After modifications it needs to be encoded as Base64 value before setting the `.dockerconfigjson` key:q.
|
After modifications it needs to be encoded as Base64 value before setting the `.dockerconfigjson` key:q.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package base
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
|
|
@ -62,40 +61,40 @@ func (r *ReconcileJenkinsBaseConfiguration) Validate(jenkins *v1alpha2.Jenkins)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ReconcileJenkinsBaseConfiguration) validateImagePullSecrets() (bool, error) {
|
func (r *ReconcileJenkinsBaseConfiguration) validateImagePullSecrets() (bool, error) {
|
||||||
var err error
|
for _, sr := range r.jenkins.Spec.Master.ImagePullSecrets {
|
||||||
valid := true
|
valid, err := r.validateImagePullSecret(sr.Name)
|
||||||
ips := r.jenkins.Spec.Master.ImagePullSecrets
|
|
||||||
for _, sr := range ips {
|
|
||||||
valid, err = r.validateImagePullSecret(sr.Name)
|
|
||||||
if err != nil || !valid {
|
if err != nil || !valid {
|
||||||
return valid, err
|
return true, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false, nil
|
||||||
return valid, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ReconcileJenkinsBaseConfiguration) validateImagePullSecret(name string) (bool, error) {
|
func (r *ReconcileJenkinsBaseConfiguration) validateImagePullSecret(name string) (bool, error) {
|
||||||
secret := &corev1.Secret{}
|
secret := &corev1.Secret{}
|
||||||
err := r.k8sClient.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: r.jenkins.ObjectMeta.Namespace}, secret)
|
err := r.k8sClient.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: r.jenkins.ObjectMeta.Namespace}, secret)
|
||||||
if err != nil && apierrors.IsNotFound(err) {
|
if err != nil && apierrors.IsNotFound(err) {
|
||||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Secret '%s' not found", name))
|
r.logger.V(log.VWarn).Info(fmt.Sprintf("Secret %s not found defined in spec.master.imagePullSecrets", name))
|
||||||
return false, nil
|
return false, nil
|
||||||
} else if err != nil && !apierrors.IsNotFound(err) {
|
} else if err != nil && !apierrors.IsNotFound(err) {
|
||||||
return false, stackerr.WithStack(err)
|
return false, stackerr.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if secret.Data["docker-server"] == nil {
|
if secret.Data["docker-server"] == nil {
|
||||||
return false, errors.New("docker server not set")
|
r.logger.V(log.VWarn).Info("Docker Server is empty")
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
if secret.Data["docker-username"] == nil {
|
if secret.Data["docker-username"] == nil {
|
||||||
return false, errors.New("docker username not set")
|
r.logger.V(log.VWarn).Info("Docker Username is empty")
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
if secret.Data["docker-password"] == nil {
|
if secret.Data["docker-password"] == nil {
|
||||||
return false, errors.New("docker password not set")
|
r.logger.V(log.VWarn).Info("Docker Password is empty")
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
if secret.Data["docker-email"] == nil {
|
if secret.Data["docker-email"] == nil {
|
||||||
return false, errors.New("docker email not set")
|
r.logger.V(log.VWarn).Info("Docker Email is empty")
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ func TestValidatePlugins(t *testing.T) {
|
||||||
|
|
||||||
func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T) {
|
func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T) {
|
||||||
t.Run("happy", func(t *testing.T) {
|
t.Run("happy", func(t *testing.T) {
|
||||||
lor := &corev1.Secret{
|
secret := &corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test-ref",
|
Name: "test-ref",
|
||||||
},
|
},
|
||||||
|
|
@ -150,14 +150,14 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
ImagePullSecrets: []corev1.LocalObjectReference{
|
ImagePullSecrets: []corev1.LocalObjectReference{
|
||||||
{Name: lor.ObjectMeta.Name},
|
{Name: secret.ObjectMeta.Name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeClient := fake.NewFakeClient()
|
fakeClient := fake.NewFakeClient()
|
||||||
err := fakeClient.Create(context.TODO(), lor)
|
err := fakeClient.Create(context.TODO(), secret)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
||||||
|
|
@ -189,7 +189,7 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("no docker email", func(t *testing.T) {
|
t.Run("no docker email", func(t *testing.T) {
|
||||||
lor := &corev1.Secret{
|
secret := &corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test-ref",
|
Name: "test-ref",
|
||||||
},
|
},
|
||||||
|
|
@ -204,14 +204,14 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
ImagePullSecrets: []corev1.LocalObjectReference{
|
ImagePullSecrets: []corev1.LocalObjectReference{
|
||||||
{Name: lor.ObjectMeta.Name},
|
{Name: secret.ObjectMeta.Name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeClient := fake.NewFakeClient()
|
fakeClient := fake.NewFakeClient()
|
||||||
err := fakeClient.Create(context.TODO(), lor)
|
err := fakeClient.Create(context.TODO(), secret)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
||||||
|
|
@ -223,7 +223,7 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("no docker password", func(t *testing.T) {
|
t.Run("no docker password", func(t *testing.T) {
|
||||||
lor := &corev1.Secret{
|
secret := &corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test-ref",
|
Name: "test-ref",
|
||||||
},
|
},
|
||||||
|
|
@ -238,14 +238,14 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
ImagePullSecrets: []corev1.LocalObjectReference{
|
ImagePullSecrets: []corev1.LocalObjectReference{
|
||||||
{Name: lor.ObjectMeta.Name},
|
{Name: secret.ObjectMeta.Name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeClient := fake.NewFakeClient()
|
fakeClient := fake.NewFakeClient()
|
||||||
err := fakeClient.Create(context.TODO(), lor)
|
err := fakeClient.Create(context.TODO(), secret)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
||||||
|
|
@ -257,7 +257,7 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("no docker username", func(t *testing.T) {
|
t.Run("no docker username", func(t *testing.T) {
|
||||||
lor := &corev1.Secret{
|
secret := &corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test-ref",
|
Name: "test-ref",
|
||||||
},
|
},
|
||||||
|
|
@ -272,14 +272,14 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
ImagePullSecrets: []corev1.LocalObjectReference{
|
ImagePullSecrets: []corev1.LocalObjectReference{
|
||||||
{Name: lor.ObjectMeta.Name},
|
{Name: secret.ObjectMeta.Name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeClient := fake.NewFakeClient()
|
fakeClient := fake.NewFakeClient()
|
||||||
err := fakeClient.Create(context.TODO(), lor)
|
err := fakeClient.Create(context.TODO(), secret)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
||||||
|
|
@ -291,7 +291,7 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("no docker server", func(t *testing.T) {
|
t.Run("no docker server", func(t *testing.T) {
|
||||||
lor := &corev1.Secret{
|
secret := &corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test-ref",
|
Name: "test-ref",
|
||||||
},
|
},
|
||||||
|
|
@ -306,14 +306,14 @@ func TestReconcileJenkinsBaseConfiguration_validateImagePullSecrets(t *testing.T
|
||||||
Spec: v1alpha2.JenkinsSpec{
|
Spec: v1alpha2.JenkinsSpec{
|
||||||
Master: v1alpha2.JenkinsMaster{
|
Master: v1alpha2.JenkinsMaster{
|
||||||
ImagePullSecrets: []corev1.LocalObjectReference{
|
ImagePullSecrets: []corev1.LocalObjectReference{
|
||||||
{Name: lor.ObjectMeta.Name},
|
{Name: secret.ObjectMeta.Name},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeClient := fake.NewFakeClient()
|
fakeClient := fake.NewFakeClient()
|
||||||
err := fakeClient.Create(context.TODO(), lor)
|
err := fakeClient.Create(context.TODO(), secret)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
baseReconcileLoop := New(fakeClient, nil, logf.ZapLogger(false),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue