Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,16 @@ jobs:
# The docker leg runs vitest directly instead of through
# test:integration:sandbox:docker: that script would rebuild the image
# the step above just built.
# external-context-mem0-write, external-context-auto-recall,
# context-compress-interactive and qwen-serve-channel-workers stall
# at CLI startup on macOS and the ecs-qwen pool runners (#10272);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

The comment block is rewritten in this round: it no longer cites #10272 as a live platform stall (the issue is closed and its closing comment corrects the platform hypothesis — the stalls were the goal-runtime wait bug fixed by #10290, an ancestor of this PR's merge base) and no longer cites #10316 as a pending root fix. The quarantine is now documented as a precaution, including the ubuntu-latest canary limitation raised alongside this finding: the canaries preserve functional coverage on hosted Linux but provide no signal about the former stall platforms, so lifting the quarantine requires verifying the suites on the affected runners first.

Two parts of the finding are not actionable from inside the repository and are left for the maintainer:

  1. Dropping the Fixes #10316 closing claim — it lives in the PR description on GitHub, which this flow cannot edit (the commit-title reference (#10316) is git history; rewriting it is not allowed here).
  2. The close-and-re-aim alternative — maintainer @wenshao approved this head with the premise objection on record, so keeping the precautionary quarantine is the working assumption; if the maintainer prefers to close and re-aim at the sdk-typescript failures instead, that decision stands above this change.
中文说明

本轮已改写该注释块:不再把 #10272 引为存活的平台性卡住(该 issue 已关闭,其关闭评论纠正了平台假设——卡住是 goal-runtime 等待 bug,已由 #10290 修复,且该修复是本 PR 合并基线的祖先),也不再把这个 issue 引为待落地的根因修复。隔离现被记录为稳妥预防措施,并同时写入了随本发现提出的 ubuntu-latest 金丝雀局限:金丝雀仅在托管 Linux 上保留功能覆盖,对原卡住平台不提供任何信号,解除隔离前需先在受影响的 runner 上验证这些套件。

该发现有两部分无法在仓库内完成,留给维护者处理:

  1. 移除 Fixes #10316 关闭声明——它位于 GitHub 上的 PR 描述中,本流程无权编辑(提交标题中的 (#10316) 属于 git 历史,此处不允许改写历史)。
  2. 关闭并转向的替代方案——维护者 @wenshao 已在前提异议在案的情况下批准了当前 head,因此保留预防性隔离是当前工作假设;若维护者更倾向于关闭本 PR、转而处理 sdk-typescript 的失败,该决定优先于本次改动。

# with cron-interactive and channel-plugin they are quarantined to
# the nightly isolated matrix below until the root fix lands
# (#10316).
if [[ "${{ matrix.sandbox }}" == "sandbox:docker" ]]; then
npx cross-env QWEN_SANDBOX=docker vitest run --root ./integration-tests --exclude '**/interactive/cron-interactive.test.ts' --exclude '**/channel-plugin.test.ts' --shard='${{ matrix.shard }}'
npx cross-env QWEN_SANDBOX=docker vitest run --root ./integration-tests --exclude '**/interactive/cron-interactive.test.ts' --exclude '**/channel-plugin.test.ts' --exclude '**/interactive/external-context-mem0-write.test.ts' --exclude '**/interactive/external-context-auto-recall.test.ts' --exclude '**/interactive/context-compress-interactive.test.ts' --exclude '**/cli/qwen-serve-channel-workers.test.ts' --shard='${{ matrix.shard }}'
else
npm run test:integration:sandbox:none -- --exclude '**/interactive/cron-interactive.test.ts' --exclude '**/channel-plugin.test.ts' --shard='${{ matrix.shard }}'
npm run test:integration:sandbox:none -- --exclude '**/interactive/cron-interactive.test.ts' --exclude '**/channel-plugin.test.ts' --exclude '**/interactive/external-context-mem0-write.test.ts' --exclude '**/interactive/external-context-auto-recall.test.ts' --exclude '**/interactive/context-compress-interactive.test.ts' --exclude '**/cli/qwen-serve-channel-workers.test.ts' --shard='${{ matrix.shard }}'
fi

# The sandbox build retags the same image name every run, so on a
Expand Down Expand Up @@ -275,7 +281,7 @@ jobs:
OPENAI_API_KEY: '${{ secrets.OPENAI_API_KEY }}'
OPENAI_BASE_URL: '${{ secrets.OPENAI_BASE_URL }}'
OPENAI_MODEL: '${{ secrets.OPENAI_MODEL }}'
run: 'npx cross-env VERBOSE=true KEEP_OUTPUT=true QWEN_SANDBOX=false vitest run --root ./integration-tests --exclude "**/interactive/cron-interactive.test.ts" --exclude "**/channel-plugin.test.ts" --shard="${{ matrix.shard }}"'
run: 'npx cross-env VERBOSE=true KEEP_OUTPUT=true QWEN_SANDBOX=false vitest run --root ./integration-tests --exclude "**/interactive/cron-interactive.test.ts" --exclude "**/channel-plugin.test.ts" --exclude "**/interactive/external-context-mem0-write.test.ts" --exclude "**/interactive/external-context-auto-recall.test.ts" --exclude "**/interactive/context-compress-interactive.test.ts" --exclude "**/cli/qwen-serve-channel-workers.test.ts" --shard="${{ matrix.shard }}"'

isolated-nightly:
name: '${{ matrix.label }} (nightly)'
Expand All @@ -291,6 +297,16 @@ jobs:
test_file: 'interactive/cron-interactive.test.ts'
- label: 'channel-plugin E2E'
test_file: 'channel-plugin.test.ts'
# Quarantined from the push lanes (#10272, #10316); see the
# excludes in the push jobs above.
- label: 'external-context-mem0-write E2E'
test_file: 'interactive/external-context-mem0-write.test.ts'
- label: 'external-context-auto-recall E2E'
test_file: 'interactive/external-context-auto-recall.test.ts'
- label: 'context-compress-interactive E2E'
test_file: 'interactive/context-compress-interactive.test.ts'
- label: 'qwen-serve-channel-workers E2E'
test_file: 'cli/qwen-serve-channel-workers.test.ts'
steps:
- name: 'Checkout'
uses: 'actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10' # v6.0.3
Expand Down
34 changes: 34 additions & 0 deletions scripts/tests/e2e-workflow.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,38 @@ describe('e2e workflow', () => {
expect(group).toContain('github.event_name');
expect(group).toContain('github.head_ref || github.ref_name');
});

it('quarantines the nightly-isolated suites from every push lane', () => {
// cron-interactive is timing-flaky and external-context-mem0-write,
// external-context-auto-recall, context-compress-interactive and
// qwen-serve-channel-workers stall at CLI startup on macOS and the
// ecs-qwen pool runners (#10272, #10316), so they are quarantined to the
// nightly isolated matrix while the push lanes keep real signal. Every
// nightly canary must be excluded from every push lane, and every
// push-lane exclusion must keep its nightly canary — dropping either
// side silently loses coverage.
const nightlyFiles = yml.jobs['isolated-nightly'].strategy.matrix.include
.map((entry) => entry.test_file)
.sort();
const runStep = (job) =>
yml.jobs[job].steps.find((step) => step.name === 'Run E2E tests').run;
const countExcludes = (run) => {
const counts = new Map();
for (const match of run.matchAll(/--exclude ['"]([^'"]+)['"]/g)) {
const file = match[1].replace(/^\*\*\//, '');
counts.set(file, (counts.get(file) ?? 0) + 1);
}
return counts;
};
// The Linux job runs vitest twice (sandbox:docker and sandbox:none legs),
// so each quarantine exclude appears once per leg there.
const linux = countExcludes(runStep('e2e-test-linux'));
const macos = countExcludes(runStep('e2e-test-macos'));
expect([...linux.keys()].sort()).toEqual(nightlyFiles);
expect([...macos.keys()].sort()).toEqual(nightlyFiles);
for (const file of nightlyFiles) {
expect(linux.get(file)).toBe(2);
expect(macos.get(file)).toBe(1);
}
});
});
Loading