-
Notifications
You must be signed in to change notification settings - Fork 21
chore(ci): contribute 1.7.14 release-toolchain follow-up (v-prefixed release tags + HACS validation resilience + 1.7.14.1 stamp) #206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e60ed72
3c6cbec
7114812
b6a622b
a58e74b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -131,11 +131,52 @@ jobs: | |
| - name: Run HACS validation | ||
| if: steps.brands_probe.outputs.available == 'true' | ||
| id: hacs | ||
| continue-on-error: true | ||
| uses: hacs/action@main | ||
| with: | ||
| category: integration | ||
| ignore: topics issues | ||
|
|
||
| # Transient HACS regression guard (hacs/integration#5252): the action | ||
| # intermittently fetches the raw hacs.json / manifest.json as None from | ||
| # the GitHub contents API and reports "invalid 'hacs.json' file" and | ||
| # "integration_manifest ... Got None" on byte-identical, valid files. | ||
| # If the first run fails, re-run with exactly those two transient-prone | ||
| # validators isolated. If everything else passes, the failure was the | ||
| # known transient signature and is tolerated (job stays green with a | ||
| # warning). The isolation is NOT permanent: it only runs on failure, so a | ||
| # healthy HACS still exercises all checks. The real validity of both files | ||
| # is still enforced independently at the ci-success level: manifest.json by | ||
| # the hassfest job (this job needs: hassfest) and hacs.json by the test job | ||
| # (tests/test_hacs_validation.py). Any other failing check keeps this red. | ||
| - name: Re-run HACS validation (isolate transient checks) | ||
| if: steps.brands_probe.outputs.available == 'true' && steps.hacs.outcome == 'failure' | ||
| id: hacs_surgical | ||
| continue-on-error: true | ||
| uses: hacs/action@main | ||
| with: | ||
| category: integration | ||
| ignore: topics issues hacsjson integration_manifest | ||
|
|
||
| - name: Classify HACS result | ||
| if: steps.brands_probe.outputs.available == 'true' | ||
| id: hacs_verdict | ||
| env: | ||
| FIRST: ${{ steps.hacs.outcome }} | ||
| RETRY: ${{ steps.hacs_surgical.outcome }} | ||
| run: | | ||
| set -u | ||
| if [ "$FIRST" = "success" ]; then | ||
| echo "status=passed" >> "$GITHUB_OUTPUT" | ||
| elif [ "$RETRY" = "success" ]; then | ||
| echo "::warning ::HACS validation failed only on the transient-prone checks (hacsjson, integration_manifest) and passed once they were isolated; treating as the known transient upstream regression (hacs/integration#5252). File validity is still enforced by the hassfest and test jobs." | ||
| echo "status=transient" >> "$GITHUB_OUTPUT" | ||
|
Comment on lines
+171
to
+173
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When the first HACS run fails because of a real Useful? React with 👍 / 👎. |
||
| else | ||
| echo "::error ::HACS validation failed on a check beyond the known transient signature; treating as a real defect." | ||
| echo "status=failed" >> "$GITHUB_OUTPUT" | ||
| exit 1 | ||
| fi | ||
|
|
||
| - name: Write HACS summary | ||
| if: always() | ||
| run: | | ||
|
|
@@ -144,10 +185,14 @@ jobs: | |
| echo "" | ||
| if [ "${{ steps.brands_probe.outputs.available }}" != "true" ]; then | ||
| echo "⚠️ **Skipped** - brands.home-assistant.io unavailable" | ||
| elif [ "${{ steps.hacs.outcome }}" = "success" ]; then | ||
| elif [ "${{ steps.hacs_verdict.outputs.status }}" = "passed" ]; then | ||
| echo "✅ **HACS validation passed**" | ||
| echo "" | ||
| echo "The integration meets HACS requirements." | ||
| elif [ "${{ steps.hacs_verdict.outputs.status }}" = "transient" ]; then | ||
| echo "⚠️ **HACS validation passed after isolating transient checks** - tolerated upstream regression (hacs/integration#5252)." | ||
| echo "" | ||
| echo "Only hacsjson/integration_manifest failed; file validity is enforced by the hassfest and test jobs." | ||
| else | ||
| echo "❌ **HACS validation failed**" | ||
| echo "" | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -35,5 +35,5 @@ | |
| "selenium>=4.25.0", | ||
| "undetected_chromedriver>=3.5.5" | ||
| ], | ||
| "version": "1.7.14.0" | ||
| "version": "1.7.14.1" | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When the upstream #5252 failure occurs, the first run reports both
hacsjsonandintegration_manifest, but I checked the HACS Action docs forwith.ignore: they document a space-separated list of ignorable checks and listarchived,brands,description,hacsjson,images,information,issues, andtopics, notintegration_manifest. Because this retry relies on ignoringintegration_manifest, the retry will still run that failing validator in the transient scenario andRETRYremainsfailure, so the classifier exits 1 instead of making CI resilient.Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the careful read. I verified this against the HACS validation source (not the docs page), and
integration_manifestis in fact a valid, effective ignore token, so the surgical retry does isolate it.Chain of evidence (hacs/integration
main, which is exactly whathacs/action@mainruns viadocker://ghcr.io/hacs/action:main):custom_components/hacs/validate/base.py:custom_components/hacs/validate/integration_manifest.py, so its slug is exactlyintegration_manifest.custom_components/hacs/validate/manager.py:with.ignoretoINPUT_IGNORE, soignore: topics issues hacsjson integration_manifestyieldsINPUT_IGNORE="topics issues hacsjson integration_manifest", whose split containsintegration_manifest, and thenot incheck excludes that validator from execution.The list under https://hacs.xyz/docs/publish/action/ is an incomplete enumeration (it also omits
license, which is likewise a real check modulevalidate/license.py). The authoritative set of ignorable slugs is the set of module basenames undervalidate/, andintegration_manifestis one of them. The#5252error label "integration_manifest ... Got None" is that very slug.So in the transient scenario the retry (
ignore: ... hacsjson integration_manifest) skips both transient-prone validators; if only those two failed,hacs_surgicalpasses and the classifier reportstransient(green with a warning). A failure on any other check keeps the retry red and the classifier exits 1. No change needed here.