mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-21 02:06:43 +00:00
fix(release): propagate frozen-target guard and retry live timeouts (#108418)
* fix(release): preserve frozen package acceptance opt-in * fix(release): retry transient live terminal timeouts * fix(release): keep package dispatch input budget * refactor(release): name frozen-target compatibility mode * revert: keep frozen-target guard naming
This commit is contained in:
@@ -836,6 +836,7 @@ jobs:
|
||||
uses: ./.github/workflows/package-acceptance.yml
|
||||
with:
|
||||
advisory: false
|
||||
allow_frozen_target_scenario_omissions: ${{ inputs.allow_frozen_target_scenario_omissions }}
|
||||
workflow_ref: ${{ github.sha }}
|
||||
source: ${{ (needs.resolve_target.outputs.package_acceptance_package_spec != '' || needs.resolve_target.outputs.release_package_spec != '') && 'npm' || 'artifact' }}
|
||||
package_spec: ${{ needs.resolve_target.outputs.package_acceptance_package_spec || needs.resolve_target.outputs.release_package_spec || 'openclaw@beta' }}
|
||||
|
||||
@@ -263,6 +263,11 @@ on:
|
||||
required: false
|
||||
default: ""
|
||||
type: string
|
||||
allow_frozen_target_scenario_omissions:
|
||||
description: Trusted opt-in to omit survivor scenarios absent from a canonical frozen target
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
telegram_mode:
|
||||
description: Optional Telegram QA lane for the resolved package candidate
|
||||
required: false
|
||||
@@ -801,6 +806,7 @@ jobs:
|
||||
published_upgrade_survivor_baseline: ${{ inputs.published_upgrade_survivor_baseline }}
|
||||
published_upgrade_survivor_baselines: ${{ needs.resolve_package.outputs.published_upgrade_survivor_baselines }}
|
||||
published_upgrade_survivor_scenarios: ${{ needs.resolve_package.outputs.published_upgrade_survivor_scenarios }}
|
||||
allow_frozen_target_scenario_omissions: ${{ inputs.allow_frozen_target_scenario_omissions }}
|
||||
package_artifact_name: ${{ needs.resolve_package.outputs.package_artifact_name }}
|
||||
package_artifact_digest: ${{ needs.resolve_package.outputs.package_artifact_digest }}
|
||||
package_artifact_id: ${{ needs.resolve_package.outputs.package_artifact_id }}
|
||||
|
||||
@@ -16,7 +16,7 @@ delay_seconds="${OPENCLAW_LIVE_COMMAND_RETRY_DELAY_SECONDS:-10}"
|
||||
rate_limit_delay_seconds="${OPENCLAW_LIVE_COMMAND_RATE_LIMIT_RETRY_DELAY_SECONDS:-60}"
|
||||
# Live provider 5xx responses and one-off test timeouts get one retry; deterministic
|
||||
# hangs still fail the second attempt. Keep auth and input failures fail-fast.
|
||||
retry_pattern="${OPENCLAW_LIVE_COMMAND_RETRY_PATTERN:-ECONNRESET|ETIMEDOUT|ENOTFOUND|EAI_AGAIN|fetch failed|TLS connection|socket hang up|UND_ERR|gateway request timeout|HTTP 5[0-9][0-9]|Test timed out in [0-9]+ms|MiniMax image generation API error \\(1000\\)|model idle timeout|did not produce a response before the model idle timeout|\\b429\\b|\\b529\\b}"
|
||||
retry_pattern="${OPENCLAW_LIVE_COMMAND_RETRY_PATTERN:-ECONNRESET|ETIMEDOUT|ENOTFOUND|EAI_AGAIN|fetch failed|TLS connection|socket hang up|UND_ERR|gateway request timeout|HTTP 5[0-9][0-9]|Test timed out in [0-9]+ms|terminal timeout after [0-9]+ms|MiniMax image generation API error \\(1000\\)|model idle timeout|did not produce a response before the model idle timeout|\\b429\\b|\\b529\\b}"
|
||||
rate_limit_pattern="${OPENCLAW_LIVE_COMMAND_RATE_LIMIT_PATTERN:-Rate limit reached|rate.?limit|tokens per min|requests per min|\\bTPM\\b|\\bRPM\\b}"
|
||||
|
||||
if ! [[ "$attempts" =~ ^[1-9][0-9]*$ ]]; then
|
||||
|
||||
@@ -69,6 +69,7 @@ describe("scripts/ci-live-command-retry.sh", () => {
|
||||
it.each([
|
||||
["provider HTTP 500", "xAI image edit failed (HTTP 500): Please try again later"],
|
||||
["live test timeout", "Error: Test timed out in 45000ms."],
|
||||
["live terminal timeout", "Error: terminal timeout after 300000ms"],
|
||||
])("retries a transient %s", (_label, message) => {
|
||||
const { commandPath, counterPath } = writeCommand("openclaw-ci-live-transient-", [
|
||||
'attempts="$(cat "$OPENCLAW_RETRY_TEST_COUNTER" 2>/dev/null || printf 0)"',
|
||||
|
||||
@@ -2317,8 +2317,29 @@ describe("package artifact reuse", () => {
|
||||
|
||||
it("includes package acceptance in release checks", () => {
|
||||
const workflow = readFileSync(RELEASE_CHECKS_WORKFLOW, "utf8");
|
||||
const packageAcceptanceWorkflow = parse(readFileSync(PACKAGE_ACCEPTANCE_WORKFLOW, "utf8")) as {
|
||||
on?: {
|
||||
workflow_call?: { inputs?: Record<string, unknown> };
|
||||
};
|
||||
};
|
||||
const packageAcceptanceJob = workflowJob(
|
||||
RELEASE_CHECKS_WORKFLOW,
|
||||
"package_acceptance_release_checks",
|
||||
);
|
||||
const dockerAcceptanceJob = workflowJob(PACKAGE_ACCEPTANCE_WORKFLOW, "docker_acceptance");
|
||||
|
||||
expect(workflow).toContain("package_acceptance_release_checks:");
|
||||
expect(packageAcceptanceWorkflow.on?.workflow_call?.inputs).toHaveProperty(
|
||||
"allow_frozen_target_scenario_omissions",
|
||||
);
|
||||
expect(packageAcceptanceJob.with).toMatchObject({
|
||||
allow_frozen_target_scenario_omissions:
|
||||
"${{ inputs.allow_frozen_target_scenario_omissions }}",
|
||||
});
|
||||
expect(dockerAcceptanceJob.with).toMatchObject({
|
||||
allow_frozen_target_scenario_omissions:
|
||||
"${{ inputs.allow_frozen_target_scenario_omissions }}",
|
||||
});
|
||||
expect(workflow).toContain(
|
||||
"live_repo_e2e_release_checks:\n name: Run repo/live E2E validation\n needs: [resolve_target]",
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user