diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java
index 7c70a64c6..2187c26fe 100644
--- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java
+++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java
@@ -405,12 +405,18 @@ public class PipelineYmlSchema implements YamlSchema {
}
models.setStepType(step);
+ YBeanType t_retention_config = f.ybean("RetentionConfig");
+ addProp(t_retention_config, "days", t_pos_integer);
+ addProp(t_retention_config, "builds", t_pos_integer);
+ addProp(t_retention_config, "minimum_succeeded_builds", t_pos_integer);
+
AbstractType job = f.ybean("Job");
addProp(job, "name", jobNameDef).isPrimary(true);
addProp(job, "old_name", t_ne_string);
addProp(job, "plan", f.yseq(step)).isRequired(true);
addProp(job, "serial", t_boolean);
- addProp(job, "build_logs_to_retain", t_pos_integer);
+ addProp(job, "build_logs_to_retain", t_pos_integer).isDeprecated("Deprecated in favor of `build_log_retention`");
+ addProp(job, "build_log_retention", t_retention_config);
addProp(job, "serial_groups", t_strings);
addProp(job, "max_in_flight", t_pos_integer);
addProp(job, "public", t_boolean);
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/Job/build_log_retention.md b/headless-services/concourse-language-server/src/main/resources/desc/Job/build_log_retention.md
new file mode 100644
index 000000000..de5d81eef
--- /dev/null
+++ b/headless-services/concourse-language-server/src/main/resources/desc/Job/build_log_retention.md
@@ -0,0 +1,21 @@
+*Optional*. Configures the retention policy for build logs. This is useful if you have a job that runs often but after
+some amount of time the logs aren't worth keeping around.
+
+The following fields may be specified: `days`, `builds`, `minimum_succeeded_builds`.
+
+Builds which are not retained by one of the above configurations will have their logs reaped.
+
+The following example will keep logs for any builds that have completed in the last 2 days, while also keeping the last 1000 builds, with at least one successful build.
+
+ jobs:
+ - name: smoke-tests
+ build_log_retention:
+ days: 2
+ builds: 1000
+ minimum_succeeded_builds: 1
+ plan:
+ - get: 10m
+ - task: smoke-tests
+ # ...
+
+Note: if more than 1000 builds finish in the past 2 days, all of them will be retained thanks to the build_log_retention.days configuration. Similarly, if there are 1000 builds spanning more than 2 days, they will also be kept thanks to the build_log_retention.builds configuration. And if they all happened to have failed, the build_log_retention.minimum_succeeded_builds will keep around at least one successful build. All policies operate independently.
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.html b/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.html
deleted file mode 100644
index 2f2a2bdfd..000000000
--- a/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
Optional. If configured, only the last specified number of builds
-will have their build logs persisted. This is useful if you have a job that
-runs periodically but after some amount of time the logs aren't worth keeping
-around.
Example:
jobs:
-- name: smoke-tests
- build_logs_to_retain: 100
- plan:
- - get: 10m
- - task: smoke-tests
- # ...
\ No newline at end of file
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.md b/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.md
new file mode 100644
index 000000000..373c0f68e
--- /dev/null
+++ b/headless-services/concourse-language-server/src/main/resources/desc/Job/build_logs_to_retain.md
@@ -0,0 +1,6 @@
+*Optional*. Deprecated in favor of `build_log_retention`.
+
+Equivalent to the following:
+
+ build_log_retention:
+ builds: number
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/builds.md b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/builds.md
new file mode 100644
index 000000000..23ebe0818
--- /dev/null
+++ b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/builds.md
@@ -0,0 +1 @@
+*Optional*. Keep logs for the last specified number of builds
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/days.md b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/days.md
new file mode 100644
index 000000000..e9f2013d4
--- /dev/null
+++ b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/days.md
@@ -0,0 +1 @@
+*Optional*. Keep logs for builds which have finished within the specified number of days.
diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/minimum_succeeded_builds.md b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/minimum_succeeded_builds.md
new file mode 100644
index 000000000..be7f3d973
--- /dev/null
+++ b/headless-services/concourse-language-server/src/main/resources/desc/RetentionConfig/minimum_succeeded_builds.md
@@ -0,0 +1 @@
+*Optional*. Keep logs for at least N successful builds.
diff --git a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java
index eba18ee12..8ffd9ff6b 100644
--- a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java
+++ b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java
@@ -4016,6 +4016,10 @@ public class ConcourseEditorTest {
" old_name: formerly-known-as\n" +
" serial: true\n" +
" build_logs_to_retain: 10\n" +
+ " build_log_retention:\n" +
+ " days: 1\n" +
+ " builds: 2\n" +
+ " minimum_succeeded_builds: 1\n" +
" serial_groups: []\n" +
" max_in_flight: 3\n" +
" public: false\n" +
@@ -4040,11 +4044,14 @@ public class ConcourseEditorTest {
" uri: blah\n" +
" branch: master\n"
);
- editor.assertProblems(/*NONE*/);
editor.assertHoverContains("name", "The name of the job");
editor.assertHoverContains("old_name", "history of old job will be inherited to the new one");
editor.assertHoverContains("serial", "execute one-by-one");
- editor.assertHoverContains("build_logs_to_retain", "only the last specified number of builds");
+ editor.assertHoverContains("build_logs_to_retain", "Deprecated");
+ editor.assertHoverContains("build_log_retention", "Configures the retention policy for build logs");
+ editor.assertHoverContains("days", "Keep logs for builds which have finished within the specified number of days");
+ editor.assertHoverContains("builds", "Keep logs for the last specified number of builds");
+ editor.assertHoverContains("minimum_succeeded_builds", "Keep logs for at least N successful builds");
editor.assertHoverContains("serial_groups", "referencing the same tags will be serialized");
editor.assertHoverContains("max_in_flight", "maximum number of builds to run at a time");
editor.assertHoverContains("public", "build log of this job will be viewable");
@@ -4064,6 +4071,10 @@ public class ConcourseEditorTest {
" old_name: formerly-known-as\n" +
" serial: isSerial\n" +
" build_logs_to_retain: retainers\n" +
+ " build_log_retention:\n" +
+ " days: retain-days\n" +
+ " builds: retain-builds\n" +
+ " minimum_succeeded_builds: succ-builds\n" +
" serial_groups: no-list\n" +
" max_in_flight: flying-number\n" +
" public: publicize\n" +
@@ -4092,7 +4103,11 @@ public class ConcourseEditorTest {
);
editor.assertProblems(
"isSerial|boolean",
+ "build_logs_to_retain|Deprecated",
"retainers|Number",
+ "retain-days|Number",
+ "retain-builds|Number",
+ "succ-builds|Number",
"no-list|Expecting a 'Sequence'",
"flying-number|Number",
"publicize|boolean",
@@ -4120,7 +4135,7 @@ public class ConcourseEditorTest {
editor.assertCompletionLabels(
//completions for current (i.e Job) context:
- "build_logs_to_retain",
+ "build_log_retention",
"disable_manual_trigger",
"ensure",
"interruptible",
@@ -4132,6 +4147,7 @@ public class ConcourseEditorTest {
"on_success",
"serial",
"serial_groups",
+ "build_logs_to_retain",
//"name", exists
//"plan", exists
//"public", exists