diff --git a/cicd/jobs/k8s.jenkins b/cicd/jobs/k8s.jenkins new file mode 100644 index 00000000..4fc10fd8 --- /dev/null +++ b/cicd/jobs/k8s.jenkins @@ -0,0 +1,31 @@ +#!/usr/bin/env groovy + +pipelineJob('k8s-e2e') { + displayName('Kubernetes Plugin E2E Test') + + logRotator { + numToKeep(10) + daysToKeep(30) + } + + configure { project -> + project / 'properties' / 'org.jenkinsci.plugins.workflow.job.properties.DurabilityHintJobProperty' { + hint('PERFORMANCE_OPTIMIZED') + } + } + + definition { + cpsScm { + scm { + git { + remote { + url('https://github.com/jenkinsci/kubernetes-operator.git') + credentials('jenkins-operator') + } + branches('*/master') + } + } + scriptPath('cicd/pipelines/k8s.jenkins') + } + } +} \ No newline at end of file diff --git a/cicd/pipelines/k8s.jenkins b/cicd/pipelines/k8s.jenkins new file mode 100644 index 00000000..5df55672 --- /dev/null +++ b/cicd/pipelines/k8s.jenkins @@ -0,0 +1,20 @@ +#!/usr/bin/env groovy + +def label = "k8sagent-e2e" +def home = "/home/jenkins" +def workspace = "${home}/workspace/build-jenkins-operator" +def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/" + +podTemplate(label: label, + containers: [ + containerTemplate(name: 'alpine', image: 'alpine:3.10.2', ttyEnabled: true, command: 'cat'), + ], + ) { + node(label) { + stage('Run shell') { + container('alpine') { + sh 'echo "hello world"' + } + } + } +} diff --git a/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go b/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go index 73a8060d..aca8b03b 100644 --- a/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go +++ b/pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go @@ -114,7 +114,7 @@ if (kubernetes == null) { add = true kubernetes = new KubernetesCloud("kubernetes") } -kubernetes.setServerUrl("https://kubernetes.default") +kubernetes.setServerUrl("https://kubernetes.default.svc.cluster.local:443") kubernetes.setNamespace("%s") kubernetes.setJenkinsUrl("%s") kubernetes.setJenkinsTunnel("%s") diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 557fc1cf..7802500f 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -4,17 +4,19 @@ import ( "context" "fmt" "testing" + "time" - "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" jenkinsclient "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/client" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/configuration/base/resources" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/groovy" "github.com/jenkinsci/kubernetes-operator/pkg/controller/jenkins/plugins" + "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" "github.com/bndr/gojenkins" framework "github.com/operator-framework/operator-sdk/pkg/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -96,6 +98,46 @@ func TestConfiguration(t *testing.T) { verifyJenkinsSeedJobs(t, client, []seedJobConfig{mySeedJob}) } +func TestPlugins(t *testing.T) { + t.Parallel() + namespace, ctx := setupTest(t) + // Deletes test namespace + defer ctx.Cleanup() + + jobID := "k8s-e2e" + + seedJobs := &[]v1alpha2.SeedJob{ + { + ID: "jenkins-operator", + CredentialID: "jenkins-operator", + JenkinsCredentialType: v1alpha2.NoJenkinsCredentialCredentialType, + Targets: "cicd/jobs/k8s.jenkins", + Description: "Jenkins Operator repository", + RepositoryBranch: "master", + RepositoryURL: "https://github.com/jenkinsci/kubernetes-operator.git", + }, + } + + jenkins := createJenkinsCR(t, "k8s-e2e", namespace, seedJobs, v1alpha2.GroovyScripts{}, v1alpha2.ConfigurationAsCode{}) + waitForJenkinsUserConfigurationToComplete(t, jenkins) + + jenkinsClient := verifyJenkinsAPIConnection(t, jenkins) + waitForJob(t, jenkinsClient, jobID) + job, err := jenkinsClient.GetJob(jobID) + + require.NoError(t, err, job) + i, err := job.InvokeSimple(map[string]string{}) + require.NoError(t, err, i) + + time.Sleep(time.Minute * 2) + + job, err = jenkinsClient.GetJob(jobID) + require.NoError(t, err, job) + build, err := job.GetLastBuild() + require.NoError(t, err) + assert.True(t, build.IsGood()) +} + func createUserConfigurationSecret(t *testing.T, namespace string, stringData map[string]string) { userConfiguration := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{