我们有几个具有相同结构和行为的管道作业:更新ansible信息库,使用一些值取决于环境的参数执行剧本,并通过inspec进行测试。我们试图将外部文件中的一般行为抽象出来。
JenkinsfileAnsible:
#!/usr/bin/env groovy
import groovy.json.JsonOutput
node {
}
def executePlaybook(environment){
pipeline{
agent any
stages{
stage('Update repository'){
...
}
stage('Esecute playbook'){
...
}
stage('Execute tests'){
...
}
}
}
}
return this
每个环境都有一个特定的Jenkinsfile,用于设置参数并加载一般的Jenkinsfile,以执行管道。
JenkinsfileDev:
#!/usr/bin/env groovy
import groovy.json.JsonOutput
node{
checkout scm
def ansible = load "../JenkinsfileAnsible"
ansible.execute_playbook("development")
}
代码已简化,我们可以轻松加载外部文件或执行定义的函数。问题在于,我们想在常规文件中定义管道,就像在每个环境中一样,仅调用它即可,但是我们无法使其正常工作。
我们遇到了错误,因为Jenkins无法识别外部文件中的管道定义。
有什么建议吗?是不可能的吗?我们缺少什么吗?
答案 0 :(得分:1)
您可以使用https://jenkins.io/doc/book/pipeline/shared-libraries/
的Jenkins管道共享库方法是使用这样的Jenkinsfile:
@Library('your-pipeline') _
thePipeline([param1: val1])
在管道库代码中,类似:
def call(Map<String, String> pipelineConfig) {
pipeline{
agent any
stages{
stage('Update repository'){
//You can use your pipelineConfig param1 etc.
}
stage('Esecute playbook'){
...
}
stage('Execute tests'){
...
}
}
}
您可以将config参数用于不同的环境,甚至可以为不同的环境创建不同的管道。
希望有帮助。