Skip to content
This repository was archived by the owner on Mar 5, 2026. It is now read-only.
This repository was archived by the owner on Mar 5, 2026. It is now read-only.

[Bug] Shared prefix in directory names triggers false-positive container builds (e.g. service vs service_v2) #30

Description

@bijantavakoli

Description
The current change detection logic relies on a simple string startsWith check to determine if a Dockerfile is associated with a changed file. This causes unintended builds when one container directory name is a substring of another (e.g., shopify_general and shopify_general_v2).

If a change occurs in the longer directory name (_v2), the script incorrectly identifies the shorter directory as changed as well, resulting in unnecessary builds and deployments.

Reproduction Inputs Given the following directory structure:

Plaintext

containers/
├── shopify_general/
│   └── Dockerfile
└── shopify_general_v2/
    └── Dockerfile

And the following inputs to the Action:

YAML

root-directory: containers/
changed-files: ["containers/shopify_general_v2/Dockerfile"]

Actual Behavior

The script queues both containers for build and deployment:

shopify_general_v2 (Correct)
shopify_general (Incorrect)

Root Cause Analysis
The issue lies in the main function's filtering logic:

const pipelines = matches
  .filter((file) => {
    const dirname = path.dirname(path.relative(root, file));
    // THE BUG IS HERE:
    return includesBy(relevantChanges, (change) => change.startsWith(dirname));
  })

When evaluating the shopify_general/Dockerfile:

dirname resolves to shopify_general.

The relevantChanges set contains shopify_general_v2/Dockerfile.

The check 'shopify_general_v2/Dockerfile'.startsWith('shopify_general') evaluates to true.

Because the code does not enforce a directory separator (like /) after the dirname, the partial string match triggers a false positive.

Expected Behavior The script should only match directories that are exact parents of the changed files.

Input: shopify_general_v2/Dockerfile

Match: shopify_general_v2

No Match: shopify_general

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions