From a24139e19976f79e0a14a5a77a3f38794396c6ef Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 10 Jul 2026 04:24:36 +0100 Subject: [PATCH] ci: require enabled Telegram package proof (#103310) --- .github/workflows/package-acceptance.yml | 14 ++++- .../package-acceptance-workflow.test.ts | 61 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/.github/workflows/package-acceptance.yml b/.github/workflows/package-acceptance.yml index 9123a04b028b..5408802131d1 100644 --- a/.github/workflows/package-acceptance.yml +++ b/.github/workflows/package-acceptance.yml @@ -657,14 +657,15 @@ jobs: steps: - name: Verify package acceptance results env: + ADVISORY: ${{ inputs.advisory }} DOCKER_RESULT: ${{ needs.docker_acceptance.result }} PACKAGE_INTEGRITY_RESULT: ${{ needs.package_integrity.result }} PACKAGE_TELEGRAM_RESULT: ${{ needs.package_telegram.result }} RESOLVE_RESULT: ${{ needs.resolve_package.result }} + TELEGRAM_ENABLED: ${{ needs.resolve_package.outputs.telegram_enabled }} shell: bash run: | set -euo pipefail - advisory="${{ inputs.advisory }}" failed=0 for item in \ "resolve_package=${RESOLVE_RESULT}" \ @@ -674,8 +675,17 @@ jobs: do name="${item%%=*}" result="${item#*=}" + result_failed=false if [[ "$result" != "success" && "$result" != "skipped" ]]; then - if [[ "$advisory" == "true" && "$name" != "resolve_package" ]]; then + result_failed=true + fi + if [[ "$name" == "package_telegram" && + "$TELEGRAM_ENABLED" == "true" && + "$result" != "success" ]]; then + result_failed=true + fi + if [[ "$result_failed" == "true" ]]; then + if [[ "$ADVISORY" == "true" && "$name" != "resolve_package" ]]; then echo "::warning::${name} ended with ${result}; package acceptance is advisory for this caller." continue fi diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 14ab7a1e85b6..ef8254f594d0 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -1,4 +1,5 @@ // Package Acceptance Workflow tests cover package acceptance workflow script behavior. +import { spawnSync } from "node:child_process"; import { readdirSync, readFileSync, statSync } from "node:fs"; import { describe, expect, it } from "vitest"; import { parse } from "yaml"; @@ -114,6 +115,30 @@ function expectTextToIncludeAll(text: string | undefined, snippets: string[]): v } } +function runPackageAcceptanceSummary(params: { + advisory?: boolean; + telegramEnabled: boolean; + telegramResult: string; +}) { + const summary = workflowJob(PACKAGE_ACCEPTANCE_WORKFLOW, "summary"); + const script = workflowStep(summary, "Verify package acceptance results").run; + if (!script) { + throw new Error("Expected package acceptance summary script"); + } + return spawnSync("bash", ["-c", script], { + encoding: "utf8", + env: { + ADVISORY: String(params.advisory ?? false), + DOCKER_RESULT: "success", + PACKAGE_INTEGRITY_RESULT: "success", + PACKAGE_TELEGRAM_RESULT: params.telegramResult, + PATH: process.env.PATH, + RESOLVE_RESULT: "success", + TELEGRAM_ENABLED: String(params.telegramEnabled), + }, + }); +} + describe("package acceptance workflow", () => { it("verifies immutable postpublish evidence before stable closeout reads it", () => { const workflow = readFileSync(STABLE_MAIN_CLOSEOUT_WORKFLOW, "utf8"); @@ -1773,6 +1798,42 @@ describe("package artifact reuse", () => { expect(workflow).not.toContain("npm_telegram:"); }); + it.each([ + { telegramEnabled: true, telegramResult: "success" }, + { telegramEnabled: false, telegramResult: "skipped" }, + ])( + "accepts Telegram result $telegramResult when enabled=$telegramEnabled", + ({ telegramEnabled, telegramResult }) => { + const result = runPackageAcceptanceSummary({ telegramEnabled, telegramResult }); + + expect(result.status).toBe(0); + expect(result.stderr).toBe(""); + }, + ); + + it("rejects a skipped Telegram lane when package acceptance enabled it", () => { + const result = runPackageAcceptanceSummary({ + telegramEnabled: true, + telegramResult: "skipped", + }); + + expect(result.status).toBe(1); + expect(result.stdout).toContain("::error::package_telegram ended with skipped"); + }); + + it("preserves advisory handling for an unexpectedly skipped Telegram lane", () => { + const result = runPackageAcceptanceSummary({ + advisory: true, + telegramEnabled: true, + telegramResult: "skipped", + }); + + expect(result.status).toBe(0); + expect(result.stdout).toContain( + "::warning::package_telegram ended with skipped; package acceptance is advisory for this caller.", + ); + }); + it("gives release build steps enough Node heap", () => { for (const workflowPath of [LIVE_E2E_WORKFLOW, RELEASE_CHECKS_WORKFLOW]) { const jobs = readWorkflow(workflowPath).jobs ?? {};