Skip to content

[release/13.2] Move CI trigger patterns out of ci.yml into a separate file#14748

Merged
radical merged 4 commits intorelease/13.2from
copilot/move-ci-patterns-to-file
Mar 3, 2026
Merged

[release/13.2] Move CI trigger patterns out of ci.yml into a separate file#14748
radical merged 4 commits intorelease/13.2from
copilot/move-ci-patterns-to-file

Conversation

Copy link
Contributor

Copilot AI commented Feb 26, 2026

Inline patterns in ci.yml meant every pattern update (e.g. adding a new skip rule) triggered full CI on itself. Patterns are now in a dedicated file so ci.yml only changes when the workflow logic changes.

Description

  • eng/testing/ci-trigger-patterns.txt – new glob-style patterns file. Supports ** (recursive), * (single segment), and literal . (no backslash escaping). Comments (#) and blank lines ignored. The file lists itself so updating patterns doesn't trigger CI.

  • .github/actions/check-changed-files/action.yml – adds patterns_file input; reads the file at runtime and converts each glob line to an anchored ERE regex via glob_to_regex() (**.*, *[^/]*, .\.). The existing patterns (raw regex) input is retained alongside patterns_file.

  • .github/workflows/ci.yml – replaces the inline patterns: block with:

    patterns_file: eng/testing/ci-trigger-patterns.txt
  • docs/ci/ci-trigger-patterns.md – new doc explaining the file format, glob syntax, and how to add new entries.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No
  • Does the change require an update in our Aspire docs?

🔒 GitHub Advanced Security automatically protects Copilot coding agent pull requests. You can protect all pull requests by enabling Advanced Security for your repositories. Learn more about Advanced Security.

Copilot AI changed the title [WIP] Move CI patterns to separate file for better management Move CI trigger patterns out of ci.yml into a separate file Feb 26, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 26, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 14748

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 14748"

@radical
Copy link
Member

radical commented Feb 26, 2026

@copilot Remove comments about "legacy" or "deprecated" bits. Fix the md linter errors. Review the changes to the scripts.

Copy link
Contributor Author

Copilot AI commented Feb 26, 2026

@copilot Remove comments about "legacy" or "deprecated" bits. Fix the md linter errors. Review the changes to the scripts.

Done in 640367c:

  • Removed all "deprecated" and "legacy" wording from action.yml (description, input description, and inline comment)
  • Fixed the MD040 markdownlint error by adding the text language specifier to the fenced code block in docs/ci/ci-trigger-patterns.md
  • Reviewed the script — the glob-to-regex conversion and file-reading logic look correct; no changes needed there beyond the comment cleanup

@github-actions
Copy link
Contributor

github-actions bot commented Feb 27, 2026

🎬 CLI E2E Test Recordings

The following terminal recordings are available for commit 95f5efc:

Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View Recording
AddPackageWhileAppHostRunningDetached ▶️ View Recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View Recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View Recording
AgentInitCommand_WithMalformedMcpJson_ShowsErrorAndExitsNonZero ▶️ View Recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View Recording
Banner_DisplayedOnFirstRun ▶️ View Recording
Banner_DisplayedWithExplicitFlag ▶️ View Recording
CreateAndDeployToDockerCompose ▶️ View Recording
CreateAndDeployToDockerComposeInteractive ▶️ View Recording
CreateAndPublishToKubernetes ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateAndRunTypeScriptStarterProject ▶️ View Recording
CreateEmptyAppHostProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ View Recording
CreateStartWaitAndStopAspireProject ▶️ View Recording
CreateTypeScriptAppHostWithViteApp ▶️ View Recording
DescribeCommandResolvesReplicaNames ▶️ View Recording
DescribeCommandShowsRunningResources ▶️ View Recording
DetachFormatJsonProducesValidJson ▶️ View Recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View Recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View Recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View Recording
LogsCommandShowsResourceLogs ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View Recording
SecretCrudOnDotNetAppHost ▶️ View Recording
SecretCrudOnTypeScriptAppHost ▶️ View Recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View Recording
StopAllAppHostsFromAppHostDirectory ▶️ View Recording
StopAllAppHostsFromUnrelatedDirectory ▶️ View Recording
StopNonInteractiveMultipleAppHostsShowsError ▶️ View Recording
StopNonInteractiveSingleAppHost ▶️ View Recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View Recording

📹 Recordings uploaded automatically from CI run #22599256854

@radical radical force-pushed the copilot/move-ci-patterns-to-file branch from d2fe8d8 to cd13cea Compare February 27, 2026 06:30
@radical radical marked this pull request as ready for review February 27, 2026 06:30
Copilot AI review requested due to automatic review settings February 27, 2026 06:30
@radical radical added the area-engineering-systems infrastructure helix infra engineering repo stuff label Feb 27, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors CI trigger skip patterns by moving them from inline YAML in .github/workflows/ci.yml to a dedicated glob patterns file at eng/testing/github-ci-trigger-patterns.txt. This decoupling means that updating skip patterns no longer triggers CI, while changes to the actual CI workflow logic still do.

Changes:

  • New glob patterns file (eng/testing/github-ci-trigger-patterns.txt) containing file patterns that skip CI when changed
  • Updated check-changed-files action to read glob patterns from a file and convert them to regex at runtime
  • Modified ci.yml workflow to use the new patterns file instead of inline regex patterns
  • Added documentation explaining the patterns file format and usage

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
eng/testing/github-ci-trigger-patterns.txt New glob patterns file listing files/patterns that don't require CI (docs, pipeline configs, unrelated workflows)
.github/actions/check-changed-files/action.yml Added patterns_file input, glob_to_regex() function to convert glob patterns to anchored ERE regex, and file reading logic
.github/workflows/ci.yml Replaced inline patterns: block with reference to patterns_file: eng/testing/github-ci-trigger-patterns.txt
docs/ci/ci-trigger-patterns.md New documentation explaining glob syntax, pattern semantics, how to add patterns, and implementation details
Comments suppressed due to low confidence (5)

docs/ci/ci-trigger-patterns.md:63

  • The documentation states that . and other regex metacharacters (+, ?, [, ], (, ), |) are escaped, but doesn't mention that backslash \ is also escaped (line 82 in the action). While backslashes are rare in Unix paths, the documentation should be complete. Additionally, the documentation doesn't mention that { and } are NOT escaped, which could cause issues if file paths contain literal braces.
   - `.` and other regex metacharacters (`+`, `?`, `[`, `]`, `(`, `)`, `|`) → escaped with `\`

.github/actions/check-changed-files/action.yml:81

  • The comment states that $ is not escaped because it "cannot appear in file paths," but $ can actually appear in Unix file names (e.g., file$name.txt). If someone creates a glob pattern for such a file, the unescaped $ would be interpreted as an end-of-line anchor in the regex, causing the pattern to fail. Consider escaping $ along with the other special characters to handle this edge case.
          # Note: { } ^ $ are not escaped because they are either not special
          # in ERE mid-pattern or cannot appear in file paths.

.github/actions/check-changed-files/action.yml:81

  • The comment states that ^ is not escaped because it's "not special in ERE mid-pattern or cannot appear in file paths," but ^ can appear in Unix file names (e.g., ^file.txt). If someone creates a glob pattern ^file.txt, the unescaped ^ combined with the anchoring at line 95 would create an invalid regex like ^^file\.txt$. Consider escaping ^ to handle this edge case.
          # Note: { } ^ $ are not escaped because they are either not special
          # in ERE mid-pattern or cannot appear in file paths.

eng/testing/github-ci-trigger-patterns.txt:1

  • The file name in the PR description references eng/testing/ci-trigger-patterns.txt, but the actual file created is eng/testing/github-ci-trigger-patterns.txt (note the github- prefix). This inconsistency should be corrected - either rename the file to match the description, or update all references in the description and documentation to include github-.
# CI trigger patterns

.github/actions/check-changed-files/action.yml:81

  • The comment claims that ^ and $ are not escaped because they "are either not special in ERE mid-pattern or cannot appear in file paths." However, this reasoning is incomplete. While it's true that ^ and $ cannot appear in file paths, { and } (which also aren't escaped) CAN appear in file paths and ARE special in ERE (for repetition quantifiers like {1,3}). If a file path contains literal braces (e.g., foo{bar}.txt), the glob pattern would fail to match it correctly. Consider adding { and } to the list of escaped characters, or update the comment to acknowledge this limitation.
          # Note: { } ^ $ are not escaped because they are either not special
          # in ERE mid-pattern or cannot appear in file paths.

@radical radical enabled auto-merge (squash) February 27, 2026 07:03
@radical radical requested a review from eerhardt February 27, 2026 21:34
radical and others added 4 commits March 2, 2026 17:16
Extract the CI-skip glob patterns into eng/testing/github-ci-trigger-patterns.txt
so that pattern maintenance is decoupled from the workflow definition.
Changing this file alone will not trigger CI, avoiding the chicken-and-egg
problem of the patterns being inlined in ci.yml.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the inline regex patterns input with a patterns_file input that
points to a file of glob patterns. Add a glob_to_regex() function that
converts glob syntax (**, *, literal dot) to anchored ERE regexes.

The action now:
- reads patterns from a file, skipping comments and blank lines
- converts each glob to an anchored regex before matching
- escapes regex metacharacters (. + ? [ ] ( ) |) in glob literals

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the inline regex patterns block in ci.yml with a single
patterns_file reference to eng/testing/github-ci-trigger-patterns.txt.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Explain the patterns file, its glob syntax, how to add new patterns,
and how the check-changed-files action converts globs to ERE regexes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@radical radical force-pushed the copilot/move-ci-patterns-to-file branch from cd13cea to 95f5efc Compare March 2, 2026 22:18
@radical radical changed the base branch from main to release/13.2 March 2, 2026 22:18
@radical radical changed the title Move CI trigger patterns out of ci.yml into a separate file [release/13.2] Move CI trigger patterns out of ci.yml into a separate file Mar 2, 2026
@radical radical closed this Mar 2, 2026
auto-merge was automatically disabled March 2, 2026 22:46

Pull request was closed

@radical radical reopened this Mar 2, 2026
@dotnet-policy-service dotnet-policy-service bot added this to the 13.2 milestone Mar 2, 2026
@radical
Copy link
Member

radical commented Mar 3, 2026

/ba-g unrelated

@radical radical enabled auto-merge (squash) March 3, 2026 00:56
@radical radical merged commit 547b7e0 into release/13.2 Mar 3, 2026
684 of 688 checks passed
@radical radical deleted the copilot/move-ci-patterns-to-file branch March 3, 2026 01:01
@dotnet-policy-service dotnet-policy-service bot modified the milestone: 13.2 Mar 3, 2026
mitchdenny pushed a commit that referenced this pull request Mar 5, 2026
… file (#14748)

* feat: add CI trigger patterns file

Extract the CI-skip glob patterns into eng/testing/github-ci-trigger-patterns.txt
so that pattern maintenance is decoupled from the workflow definition.
Changing this file alone will not trigger CI, avoiding the chicken-and-egg
problem of the patterns being inlined in ci.yml.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* refactor: read glob patterns from file in check-changed-files action

Replace the inline regex patterns input with a patterns_file input that
points to a file of glob patterns. Add a glob_to_regex() function that
converts glob syntax (**, *, literal dot) to anchored ERE regexes.

The action now:
- reads patterns from a file, skipping comments and blank lines
- converts each glob to an anchored regex before matching
- escapes regex metacharacters (. + ? [ ] ( ) |) in glob literals

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: use patterns_file in CI workflow

Replace the inline regex patterns block in ci.yml with a single
patterns_file reference to eng/testing/github-ci-trigger-patterns.txt.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: add CI trigger patterns documentation

Explain the patterns file, its glob syntax, how to add new patterns,
and how the check-changed-files action converts globs to ERE regexes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Ankit Jain <radical@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-engineering-systems infrastructure helix infra engineering repo stuff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants