Jenkins Pipeline в OpenShift не может получить запрошенный репозиторий - PullRequest
0 голосов
/ 29 октября 2018

Просто отказ от ответственности, я довольно новичок в Openshift и Jenkins Pipeline. Это что-то вроде приветственного мира в конвейере jenkins внутри OpenShift, но я не могу заставить его работать. Во всяком случае, здесь идет. Я собираюсь детализировать все, что я сделал до сих пор.

Я создал новый проект и приложение в Openshift, используя следующий набор команд 'oc':

Я создал новый проект.

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

Я выполнил команду ниже, чтобы создать объект BuildConfig в OpenShift.

oc create -f hello-world-pipeline.yaml

Затем я иду в веб-консоль Openshift, собираю конвейеры и запускаю конвейер.

Вот мой Дженкинсфайл. Я извинился, если это немного грубо. Я знаю, что сборка будет выполняться дважды при первом запуске. 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. Сдвиг в правильном направлении для дальнейшей отладки это очень ценится. Я просто хочу сделать сборку в Openshift, используя конвейер jenkins (используя эфемерность jenkins внутри Openshift), чтобы посмотреть, как все работает. Я мог бы просто упустить что-то основное.

oc версия

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

Хорошо. Теперь я смог сделать эту работу. Первоначально в команде oc new-app я использовал https: // uri, а не ssh: // one, из-за чего «не удалось получить запрошенный репозиторий», поскольку секрет был для ключа ssh. Теперь приложение может быть успешно построено, но тогда я все еще вижу исключение в моем журнале jenkins, и это привело к сбою конвейера jenkins. Это потому, что фактическая сборка заняла больше времени и конвейер jenkins не может получить этот объект getProject ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...