diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java index a862d7980e..1cf65b7fb7 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java @@ -28,6 +28,7 @@ import org.immutables.value.Value; import javax.annotation.Nullable; +import java.io.Serial; import java.io.Serializable; @Value.Immutable @@ -37,6 +38,7 @@ @JsonDeserialize(as = ImmutableGithubTriggerExclusiveMode.class) public interface GithubTriggerExclusiveMode extends Serializable { + @Serial long serialVersionUID = 1L; @Nullable diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java index 7498a94def..c080ca7579 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java @@ -24,6 +24,7 @@ import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaInject; import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaString; import com.walmartlabs.concord.runtime.v2.model.ExclusiveMode; +import com.walmartlabs.concord.runtime.v2.model.GithubTriggerExclusiveMode; import com.walmartlabs.concord.runtime.v2.model.Trigger; import java.util.List; @@ -111,7 +112,7 @@ interface GithubTriggerParams extends DefaultTriggerParams { GithubTriggerConditions conditions(); @JsonProperty("exclusive") - ExclusiveMode exclusive(); + GithubTriggerExclusiveMode exclusive(); interface GithubTriggerConditions { @JsonProperty(value = "type", required = true) @@ -174,6 +175,9 @@ interface GenericTriggerParams extends DefaultTriggerParams { @JsonProperty("conditions") Map conditions(); + + @JsonProperty("exclusive") + ExclusiveMode exclusive(); } } @@ -187,8 +191,5 @@ interface DefaultTriggerParams { @JsonProperty("arguments") Map arguments(); - - @JsonProperty("exclusive") - ExclusiveMode exclusive(); } } diff --git a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java index 3fef5e62ee..f0bebc1dac 100644 --- a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java +++ b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java @@ -570,6 +570,26 @@ public void test019() throws Exception { assertTrue(p1.configuration().debug()); } + @Test // GitHub trigger exclusive grouping + void test020() throws Exception { + ProcessDefinition pd = load("020.yml"); + + List triggers = pd.triggers(); + assertNotNull(triggers); + + assertEquals(2, triggers.size()); + + Trigger t = triggers.get(0); + assertEquals("github", t.name()); + var exclusive = assertInstanceOf(GithubTriggerExclusiveMode.class, t.configuration().get("exclusive")); + assertEquals("branch", exclusive.groupByProperty()); + + t = triggers.get(1); + assertEquals("github", t.name()); + exclusive = assertInstanceOf(GithubTriggerExclusiveMode.class, t.configuration().get("exclusive")); + assertEquals("event.pull_request.html_url", exclusive.groupByProperty()); + } + @Test void test021() throws Exception { ProcessDefinition pd = load("021.yml"); diff --git a/runtime/v2/model/src/test/resources/020.yml b/runtime/v2/model/src/test/resources/020.yml new file mode 100644 index 0000000000..231c15c35a --- /dev/null +++ b/runtime/v2/model/src/test/resources/020.yml @@ -0,0 +1,19 @@ + +triggers: + - github: + version: 2 + useInitiator: true + entryPoint: onPush + conditions: + type: "push" + exclusive: + groupBy: branch + + - github: + version: 2 + useInitiator: true + entryPoint: onPush2 + conditions: + type: push2 + exclusive: + groupBy: "event.pull_request.html_url" diff --git a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java index 0ecc7c756d..4b0bf5e78c 100644 --- a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java +++ b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java @@ -65,10 +65,10 @@ public static OffsetDateTime getStartAt(Payload p) { return null; } - if (v instanceof String) { + if (v instanceof String iso) { OffsetDateTime t; try { - t = DateTimeUtils.fromIsoString((String) v); + t = DateTimeUtils.fromIsoString(iso); } catch (DateTimeParseException e) { throw new ProcessException(p.getProcessKey(), "Invalid '" + k + "' format, expected an ISO-8601 value, got: " + v); }