Skip to content

Commit

Permalink
added option to ignore missing files (#866)
Browse files Browse the repository at this point in the history
[FIXES JENKINS-34060]
  • Loading branch information
daspilker committed Jun 13, 2016
1 parent ca78517 commit 9c85e7f
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 4 deletions.
2 changes: 2 additions & 0 deletions docs/Home.md
Expand Up @@ -27,6 +27,8 @@ Browse the Jenkins issue tracker to see any [open issues](https://issues.jenkins

## Release Notes
* 1.48 (unreleased)
* Added option to ignore missing DSL script files or empty wildcards
([JENKINS-34060](https://issues.jenkins-ci.org/browse/JENKINS-34060))
* Improved support for the [Build-timeout Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build-timeout+Plugin)
([JENKINS-35228](https://issues.jenkins-ci.org/browse/JENKINS-35228))
* Enhanced support for the
Expand Down
4 changes: 3 additions & 1 deletion docs/User-Power-Moves.md
Expand Up @@ -194,10 +194,12 @@ node {
```

Options:
* `scriptLocation`: mandatory, specifies the Job DSL scripts to execute and consists of two sub-options:
* `scriptLocation`: mandatory, specifies the Job DSL scripts to execute and consists of three sub-options:
* `targets`: optional, specifies Job DSL script files to execute, newline separated list of file names relative
to the workspace
* `scriptText`: optional, specifies an inline Job DSL script
* `ignoreMissingFiles`: optional, defaults to `false`, set to `true` to ignore missing files or empty wildcards in
`targets`
* `ignoreExisting`: optional, defaults to `false`, set to `true` to not update existing jobs and views
* `removedJobAction`: optional, set to `'DELETE'` or `'DISABLE'` to delete or disable jobs that have been removed from
DSL scripts, defaults to `'IGNORE'`
Expand Down
Expand Up @@ -75,6 +75,7 @@ public static class ScriptLocation {
private Boolean usingScriptText;
private String targets;
private String scriptText;
private boolean ignoreMissingFiles;

@DataBoundConstructor
public ScriptLocation() {
Expand Down Expand Up @@ -104,6 +105,11 @@ public void setScriptText(String scriptText) {
usingScriptText = true;
}
}

@DataBoundSetter
public void setIgnoreMissingFiles(boolean ignoreMissingFiles) {
this.ignoreMissingFiles = ignoreMissingFiles;
}
}

/**
Expand All @@ -123,6 +129,8 @@ public void setScriptText(String scriptText) {

private boolean ignoreExisting;

private boolean ignoreMissingFiles;

private RemovedJobAction removedJobAction = RemovedJobAction.IGNORE;

private RemovedViewAction removedViewAction = RemovedViewAction.IGNORE;
Expand All @@ -136,6 +144,7 @@ public ExecuteDslScripts(ScriptLocation scriptLocation) {
this.usingScriptText = scriptLocation == null || (scriptLocation.usingScriptText != null && scriptLocation.usingScriptText);
this.targets = scriptLocation == null ? null : scriptLocation.targets;
this.scriptText = scriptLocation == null ? null : scriptLocation.scriptText;
this.ignoreMissingFiles = scriptLocation != null && scriptLocation.ignoreMissingFiles;
}

@Deprecated
Expand Down Expand Up @@ -190,6 +199,10 @@ public boolean isUsingScriptText() {
return usingScriptText;
}

public boolean isIgnoreMissingFiles() {
return ignoreMissingFiles;
}

public boolean isIgnoreExisting() {
return ignoreExisting;
}
Expand Down Expand Up @@ -260,7 +273,7 @@ public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath workspace, @Nonnul
ScriptRequestGenerator generator = new ScriptRequestGenerator(workspace, env);
try {
Set<ScriptRequest> scriptRequests = generator.getScriptRequests(
targets, usingScriptText, scriptText, ignoreExisting, additionalClasspath
targets, usingScriptText, scriptText, ignoreExisting, ignoreMissingFiles, additionalClasspath
);

DslScriptLoader dslScriptLoader = new DslScriptLoader(jm);
Expand Down
Expand Up @@ -24,7 +24,7 @@ class ScriptRequestGenerator implements Closeable {
}

Set<ScriptRequest> getScriptRequests(String targets, boolean usingScriptText, String scriptText,
boolean ignoreExisting,
boolean ignoreExisting, boolean ignoreMissingFiles = false,
String additionalClasspath) throws IOException, InterruptedException {
Set<ScriptRequest> scriptRequests = new LinkedHashSet<ScriptRequest>()

Expand All @@ -46,7 +46,7 @@ class ScriptRequestGenerator implements Closeable {
} else {
targets.split('\n').each { String target ->
FilePath[] filePaths = workspace.list(env.expand(target))
if (filePaths.length == 0) {
if (filePaths.length == 0 && !ignoreMissingFiles) {
throw new DslException("no Job DSL script(s) found at ${target}")
}
for (FilePath filePath : filePaths) {
Expand Down
Expand Up @@ -14,6 +14,9 @@
<f:entry title="DSL Scripts" field="targets">
<f:expandableTextbox/>
</f:entry>
<f:entry title="Ignore missing files:" field="ignoreMissingFiles">
<f:checkbox name="ignoreMissingFiles" checked="${instance.ignoreMissingFiles}"/>
</f:entry>
</f:radioBlock>
<f:entry title="Action for existing jobs and views:" field="ignoreExisting">
<f:checkbox name="ignoreExisting" title="Ignore changes" checked="${instance.ignoreExisting}"
Expand Down
@@ -0,0 +1,4 @@
<div>
Ignore missing DSL scripts. If not checked, the build step will fail if a configured script is missing or if
a wildcard does not match any files.
</div>
Expand Up @@ -996,6 +996,36 @@ class ExecuteDslScriptsSpec extends Specification {
freeStyleBuild.getLog(25).join('\n') =~ /jenkins.dsl/
}

def 'ignore missing file'() {
setup:
FreeStyleProject job = jenkinsRule.createFreeStyleProject('seed')
job.buildersList.add(new ExecuteDslScripts(
new ExecuteDslScripts.ScriptLocation(targets: 'jenkins.dsl', ignoreMissingFiles: true)
))
job.onCreatedFromScratch()

when:
FreeStyleBuild freeStyleBuild = job.scheduleBuild2(0).get()

then:
freeStyleBuild.result == SUCCESS
}

def 'ignore empty wildcard'() {
setup:
FreeStyleProject job = jenkinsRule.createFreeStyleProject('seed')
job.buildersList.add(new ExecuteDslScripts(
new ExecuteDslScripts.ScriptLocation(targets: '*.dsl', ignoreMissingFiles: true)
))
job.onCreatedFromScratch()

when:
FreeStyleBuild freeStyleBuild = job.scheduleBuild2(0).get()

then:
freeStyleBuild.result == SUCCESS
}

def 'classpath per script'() {
setup:
FreeStyleProject job = jenkinsRule.createFreeStyleProject('seed')
Expand Down
Expand Up @@ -342,6 +342,18 @@ class ScriptRequestGeneratorSpec extends Specification {
e.message == 'no Job DSL script(s) found at x.groovy'
}

def 'ignore file not found'() {
setup:
EnvVars env = new EnvVars()
ScriptRequestGenerator generator = new ScriptRequestGenerator(build.workspace, env)

when:
List<ScriptRequest> requests = generator.getScriptRequests('x.groovy', false, null, false, true, null).toList()

then:
requests.empty
}

def 'pattern does not match anything'() {
setup:
EnvVars env = new EnvVars()
Expand All @@ -354,4 +366,16 @@ class ScriptRequestGeneratorSpec extends Specification {
Exception e = thrown(DslException)
e.message == 'no Job DSL script(s) found at *.foo'
}

def 'ignore empty wildcared'() {
setup:
EnvVars env = new EnvVars()
ScriptRequestGenerator generator = new ScriptRequestGenerator(build.workspace, env)

when:
List<ScriptRequest> requests = generator.getScriptRequests('*.foo', false, null, false, true, null).toList()

then:
requests.empty
}
}

0 comments on commit 9c85e7f

Please sign in to comment.