Просто отказ от ответственности, я довольно новичок в 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 ()?