Skip to content

Commit 75c7ab0

Browse files
committed
make sure we can more-easily scope triggers
1 parent 7fad79f commit 75c7ab0

File tree

5 files changed

+72
-3
lines changed

5 files changed

+72
-3
lines changed

.github/workflows/ci.yml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ jobs:
9999
- name: Checkout
100100
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
101101

102-
- name: Start labeled workload container
102+
- name: Start workload containers
103103
run: |
104104
docker run -d \
105105
--name dd-compose-label-test \
@@ -109,6 +109,11 @@ jobs:
109109
--label dd.compose.prune=false \
110110
alpine:3.21 sleep 600
111111
112+
docker run -d \
113+
--name dd-compose-unlabeled-test \
114+
--label dd.watch=true \
115+
alpine:3.21 sleep 600
116+
112117
- name: Build drydock image
113118
run: docker build -t drydock:ci-trigger --build-arg DD_VERSION=ci .
114119

@@ -153,6 +158,16 @@ jobs:
153158
docker logs drydock-ci-trigger 2>&1 || true
154159
exit 1
155160
fi
161+
if ! echo "$logs" | grep -Eq '"requireinclude":("true"|true)'; then
162+
echo "Did not find scoped requireinclude=true configuration in logs"
163+
docker logs drydock-ci-trigger 2>&1 || true
164+
exit 1
165+
fi
166+
if echo "$logs" | grep -Eq 'trigger\.dockercompose\..*dd-compose-unlabeled-test'; then
167+
echo "Unexpected dockercompose trigger registration for unlabeled container"
168+
docker logs drydock-ci-trigger 2>&1 || true
169+
exit 1
170+
fi
156171
157172
- name: Dump drydock logs on failure
158173
if: failure()
@@ -161,7 +176,7 @@ jobs:
161176
- name: Cleanup containers
162177
if: always()
163178
run: |
164-
docker rm -f drydock-ci-trigger dd-compose-label-test >/dev/null 2>&1 || true
179+
docker rm -f drydock-ci-trigger dd-compose-label-test dd-compose-unlabeled-test >/dev/null 2>&1 || true
165180
166181
build:
167182
name: Build

app/registry/index.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,9 +357,17 @@ test('ensureDockercomposeTriggerForContainer should set trigger configuration wh
357357
dryrun: true,
358358
auto: false,
359359
threshold: 'minor',
360+
requireinclude: true,
360361
});
361362
});
362363

364+
test('ensureDockercomposeTriggerForContainer should always scope trigger to explicitly included containers', async () => {
365+
const triggerId = await registry.ensureDockercomposeTriggerForContainer('my-service');
366+
367+
expect(triggerId).toBe('dockercompose.my-service');
368+
expect(registry.getState().trigger[triggerId].configuration.requireinclude).toBe(true);
369+
});
370+
363371
test('sanitizeComponentName should handle empty string', () => {
364372
const result = registry.testable_sanitizeComponentName('');
365373
expect(result).toBe('container');

app/registry/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,10 @@ export async function ensureDockercomposeTriggerForContainer(
326326
kind: 'trigger',
327327
provider: 'dockercompose',
328328
name: triggerName,
329-
configuration: triggerConfiguration,
329+
configuration: {
330+
...triggerConfiguration,
331+
requireinclude: true,
332+
},
330333
componentPath: 'triggers/providers',
331334
});
332335

app/triggers/providers/Trigger.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const configurationValid = {
2020
mode: 'simple',
2121
auto: true,
2222
order: 100,
23+
requireinclude: false,
2324
simpletitle: 'New ${container.updateKind.kind} found for container ${container.name}',
2425

2526
simplebody:
@@ -618,6 +619,43 @@ test('mustTrigger should support name-only include with threshold for hybrid tri
618619
expect(discordTrigger.mustTrigger(containerMajor)).toBe(false);
619620
});
620621

622+
test('mustTrigger should require explicit include when requireinclude is enabled', () => {
623+
trigger.type = 'dockercompose';
624+
trigger.name = 'scoped';
625+
trigger.configuration = {
626+
...configurationValid,
627+
requireinclude: true,
628+
};
629+
630+
expect(
631+
trigger.mustTrigger({
632+
updateKind: {
633+
kind: 'tag',
634+
semverDiff: 'major',
635+
},
636+
}),
637+
).toBe(false);
638+
});
639+
640+
test('mustTrigger should allow execution when requireinclude is enabled and trigger is explicitly included', () => {
641+
trigger.type = 'dockercompose';
642+
trigger.name = 'scoped';
643+
trigger.configuration = {
644+
...configurationValid,
645+
requireinclude: true,
646+
};
647+
648+
expect(
649+
trigger.mustTrigger({
650+
triggerInclude: 'dockercompose.scoped',
651+
updateKind: {
652+
kind: 'tag',
653+
semverDiff: 'major',
654+
},
655+
}),
656+
).toBe(true);
657+
});
658+
621659
test('renderSimpleTitle should replace placeholders when called', async () => {
622660
expect(
623661
trigger.renderSimpleTitle({

app/triggers/providers/Trigger.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface TriggerConfiguration extends ComponentConfiguration {
2020
auto?: boolean;
2121
order?: number;
2222
threshold?: string;
23+
requireinclude?: boolean;
2324
mode?: string;
2425
once?: boolean;
2526
disabletitle?: boolean;
@@ -257,6 +258,9 @@ class Trigger extends Component {
257258
return false;
258259
}
259260
const { triggerInclude, triggerExclude } = containerResult;
261+
if (this.configuration.requireinclude && !triggerInclude) {
262+
return false;
263+
}
260264
return (
261265
this.isTriggerIncluded(containerResult, triggerInclude) &&
262266
!this.isTriggerExcluded(containerResult, triggerExclude)
@@ -337,6 +341,7 @@ class Trigger extends Component {
337341
),
338342
batchtitle: this.joi.string().default('${containers.length} updates available'),
339343
resolvenotifications: this.joi.boolean().default(false),
344+
requireinclude: this.joi.boolean().default(false),
340345
});
341346
const schemaValidated = schemaWithDefaultOptions.validate(configuration);
342347
if (schemaValidated.error) {

0 commit comments

Comments
 (0)