OpenShift中的Jenkins Pipeline无法获取请求的存储库

时间:2018-10-29 06:45:56

标签: jenkins openshift jenkins-pipeline

只是免责声明,我对Openshift和Jenkins Pipeline东西还很陌生。这有点像OpenShift内jenkins管道中的一个hello世界,但我无法使其正常工作。无论如何,这里去。我将详细介绍到目前为止我所做的一切。

我使用以下“ oc”命令集在Openshift中创建了一个新项目和应用程序:

我创建了一个新项目。

oc new-project test-project-1

我必须创建一个ssh机密,以便Openshift可以访问我们的gitlab存储库。

oc create secret generic gitlab-ssh \
    --from-file=ssh-privatekey=./gitlab_openshift_rsa \
    --type=kubernetes.io/ssh-auth

然后我将构建者帐户链接到该机密。

oc secrets link builder gitlab-ssh

为了使秘密与我的应用程序相关联,我注释了秘密

oc annotate secret gitlab-ssh 'build.openshift.io/source-secret-match-uri-1=ssh://gitlab.hostname.blah/projects/*'

然后我通过发出以下命令来创建应用程序:

oc new-app codecentric/springboot-maven3-centos~ssh://git@gitlab.hostname.blah/projects/spring-boot-helloworld.git#branch/hello-world --name=springboot-demo

为了测试我的服务,我必须公开它。

oc expose svc/springboot-demo

我测试了此服务,并且一切正常。这意味着我的ssh密钥可以使用,并且Openshift可以从Gitlab检出存储库。

现在,我需要能够创建Jenkins声明式管道来构建相同的项目。

要创建Jenkins管道,我创建了一个hello-world-pipeline.yaml文件。

apiVersion: "v1"
kind: "BuildConfig"
metadata:
  name: "hello-world-pipeline"
spec:
  source:
    git:
      ref: "branch/hello-world"
      uri: "ssh://git@gitlab.hostname.blah/projects/spring-boot-helloworld.git"
    sourceSecret:
      name: "gitlab-ssh"
  strategy:
    jenkinsPipelineStrategy:
      jenkinsfilePath: Jenkinsfile

我运行以下命令在OpenShift中创建BuildConfig对象。

oc create -f hello-world-pipeline.yaml

然后我转到Openshift Web控制台,构建管道并启动管道。

这是我的Jenkins文件。我道歉,如果它有点粗糙。我知道该构建将在首次执行时运行两次。 oc new-app将调用build,然后Stage“ build”也将进行构建。

def buildObj;
pipeline {
   agent any
   stages {
      stage('Check Build'){
         when{
            expression{
               openshift.withCluster() {
                  return !openshift.selector('bc', 'springboot-jenkins').exists()
               }
            }
         }
         steps{
            script{
               openshift.withCluster(){
                  echo "Hello from the project running Jenkins: ${openshift.project()}"
                  buildObj = openshift.newApp("codecentric/springboot-maven3-centos~ssh://git@gitlab.hostname.blah/projects/spring-boot-helloworld.git#branch/hello-world","--name=springboot-jenkins")
               }
            }
         }
      }
      stage('Build'){
         steps{
            script{
               openshift.withCluster() {
                  openshift.withProject(){
                    openshift.withCredentials() {
                        echo "Hello from the project running Jenkins: ${openshift.project()} in ${openshift.cluster()}. Lets start the build."
                        buildObj = openshift.selector('bc', 'springboot-jenkins')
                        buildObj.startBuild()
                        /*buildObj.logs('-f') */
                     }
                  }
               }
            }

         }

      }
   }

}

这是我目前遇到的错误:

java.lang.NullPointerException: Cannot invoke method getProject() on null object
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:19)
    at com.openshift.jenkins.plugins.OpenShiftDSL.project(jar:file:/var/lib/jenkins/plugins/openshift-client/WEB-INF/lib/openshift-client.jar!/com/openshift/jenkins/plugins/OpenShiftDSL.groovy:269)
    at WorkflowScript.run(WorkflowScript:44)
    at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.delegateAndExecute(jar:file:/var/lib/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy:136)
    at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.runPostConditions(jar:file:/var/lib/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy:588)
    at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.catchRequiredContextForNode(jar:file:/var/lib/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy:262)
    at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.catchRequiredContextForNode(jar:file:/var/lib/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy:260)
    at org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.runPostConditions(jar:file:/var/lib/jenkins/plugins/pipeline-model-definition/WEB-INF/lib/pipeline-model-definition.jar!/org/jenkinsci/plugins/pipeline/modeldefinition/ModelInterpreter.groovy:587)

如果我进入Builds部分并查看springboot-jenkins的构建日志,我会看到以下消息...

Cloning "https://gitlab.hostname.blah/projects/spring-boot-helloworld.git " ...
error: failed to fetch requested repository "https://gitlab.hostname.blah/projects/spring-boot-helloworld.git " with provided credentials

这与我在hello-world-pipeline.yaml中声明的源秘密有关吗?我认为这个秘密有效,因为我能够通过直接在Openshift中创建一个新版本来对其进行测试。朝着正确的方向进行进一步调试的微动非常感激。我只想使用jenkins管道(在Openshift中使用jenkins临时)在Openshift中进行构建,以了解工作原理。我可能只是想念一些基本的东西。

oc版本

oc v3.9.43
kubernetes v1.9.1+a0ce1bc657
features: Basic-Auth

好的。现在,我能够完成这项工作。最初,在oc new-app命令中,我使用的是https:// uri而不是ssh://,这是“无法获取请求的存储库”的原因,因为机密是使用ssh密钥的。 现在,可以成功构建该应用程序,但是随后我仍然可以在我的jenkins日志中看到上面的异常,这使jenkins管道失败了。是因为实际构建花费了更长的时间并且jenkins管道无法获得此getProject()对象的控制权?

0 个答案:

没有答案