理想情况下,我希望能够在 Jenkins 上执行之前通过某种单元测试调用脚本。
除了让 jenkins 运行它之外,还有什么方法可以测试 Job DSL 脚本?
理想情况下,我希望能够在 Jenkins 上执行之前通过某种单元测试调用脚本。
除了让 jenkins 运行它之外,还有什么方法可以测试 Job DSL 脚本?
除了job-dsl-gradle-example 中的示例,您还可以更进一步,为单个文件或作业编写测试。例如,假设您有一个作业配置文件位于 jobs/deployJob.groovy
import javaposse.jobdsl.dsl.DslScriptLoader
import javaposse.jobdsl.dsl.MemoryJobManagement
import javaposse.jobdsl.dsl.ScriptRequest
import spock.lang.Specification
class TestDeployJobs extends Specification {
def 'test basic job configuration'() {
given:
URL scriptURL = new File('jobs').toURI().toURL()
ScriptRequest scriptRequest = new ScriptRequest('deployJob.groovy', null, scriptURL)
MemoryJobManagement jobManagement = new MemoryJobManagement()
when:
DslScriptLoader.runDslEngine(scriptRequest, jobManagement)
then:
jobManagement.savedConfigs.each { String name, String xml ->
with(new XmlParser().parse(new StringReader(xml))) {
// Make sure jobs only run manually
triggers.'hudson.triggers.TimerTrigger'.spec.text().isEmpty()
// only deploy every environment once at a time
concurrentBuild.text().equals('false')
// do a workspace cleanup
buildWrappers.'hudson.plugins.ws__cleanup.PreBuildCleanup'
// make sure masked passwords are active
!buildWrappers.'com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsBuildWrapper'.isEmpty()
}
}
}
}
通过这种方式,您可以遍历每个 XML 节点,以确保设置了所有正确的值。
看看job-dsl-gradle-example。该 repo 包含对 DSL 脚本的测试。
以与crasp相同的方式执行此操作,但使用 Jenkins单元测试页面中解释的 Jenkins 测试工具,速度较慢,但可以使用自动生成的 DSL 给出语法错误,如此处所述。
按照此处的说明设置代码后,您可以像这样进行测试:
@Unroll
void 'check descriptions #file.name'(File file) {
given:
JobManagement jobManagement = new JenkinsJobManagement(System.out, [:], new File('.'))
Jenkins jenkins = jenkinsRule.jenkins
when:
GeneratedItems items = new DslScriptLoader(jobManagement).runScript(file.text)
then:
if (!items.jobs.isEmpty()) {
items.jobs.each { GeneratedJob generatedJob ->
String text = getItemXml(generatedJob, jenkins)
with(new XmlParser().parse(new StringReader(text))) {
// Has some description
!description.text().isEmpty()
}
}
}
where:
file << TestUtil.getJobFiles()
}