只是免责声明,我对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()对象的控制权?