fix: deadlock in proactive refresh and concurrent refresh race #22
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*.*.*' | |
| - 'v*.*.*-*' # Match pre-release tags (e.g., v2.0.0-beta.1) | |
| permissions: | |
| contents: write | |
| jobs: | |
| validate: | |
| name: Validate Release | |
| runs-on: ubuntu-latest | |
| outputs: | |
| version: ${{ steps.get-version.outputs.version }} | |
| base_version: ${{ steps.base-version.outputs.base }} | |
| prerelease: ${{ steps.detect-prerelease.outputs.prerelease }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Get version from tag | |
| id: get-version | |
| run: | | |
| TAG=${GITHUB_REF#refs/tags/v} | |
| echo "version=$TAG" >> $GITHUB_OUTPUT | |
| echo "Tag version: $TAG" | |
| - name: Get base version (strip pre-release suffix) | |
| id: base-version | |
| run: | | |
| TAG_VERSION="${{ steps.get-version.outputs.version }}" | |
| BASE_VERSION=$(echo "$TAG_VERSION" | sed 's/-.*//') | |
| echo "base=$BASE_VERSION" >> $GITHUB_OUTPUT | |
| echo "Base version: $BASE_VERSION (from tag: $TAG_VERSION)" | |
| - name: Validate manifest version | |
| run: | | |
| MANIFEST_VERSION=$(jq -r '.version' custom_components/melcloudhome/manifest.json) | |
| BASE_VERSION="${{ steps.base-version.outputs.base }}" | |
| echo "Manifest version: $MANIFEST_VERSION" | |
| echo "Expected version: $BASE_VERSION" | |
| if [ "$MANIFEST_VERSION" != "$BASE_VERSION" ]; then | |
| echo "❌ Version mismatch!" | |
| echo "Manifest version ($MANIFEST_VERSION) does not match expected ($BASE_VERSION)" | |
| exit 1 | |
| fi | |
| echo "✅ Versions match!" | |
| - name: Validate CHANGELOG entry | |
| run: | | |
| BASE_VERSION="${{ steps.base-version.outputs.base }}" | |
| if ! grep -q "\[$BASE_VERSION\]" CHANGELOG.md; then | |
| echo "❌ No CHANGELOG entry found for version $BASE_VERSION" | |
| exit 1 | |
| fi | |
| echo "✅ CHANGELOG entry found!" | |
| - name: Validate README "What's New" version | |
| run: | | |
| BASE_VERSION="${{ steps.base-version.outputs.base }}" | |
| README_VERSION=$(grep "## What's New in v" README.md | sed -n 's/## What'\''s New in v\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p') | |
| echo "README 'What's New' version: $README_VERSION" | |
| echo "Expected version: $BASE_VERSION" | |
| if [ -z "$README_VERSION" ]; then | |
| echo "❌ No 'What's New' version found in README.md" | |
| exit 1 | |
| fi | |
| if [ "$README_VERSION" != "$BASE_VERSION" ]; then | |
| echo "❌ Version mismatch!" | |
| echo "README 'What's New' version ($README_VERSION) does not match expected ($BASE_VERSION)" | |
| exit 1 | |
| fi | |
| echo "✅ README version matches!" | |
| - name: Detect pre-release | |
| id: detect-prerelease | |
| run: | | |
| TAG_VERSION="${{ steps.get-version.outputs.version }}" | |
| if echo "$TAG_VERSION" | grep -qE '\-(alpha|beta|rc)\.'; then | |
| echo "prerelease=true" >> $GITHUB_OUTPUT | |
| echo "✅ Pre-release detected: $TAG_VERSION" | |
| else | |
| echo "prerelease=false" >> $GITHUB_OUTPUT | |
| echo "✅ Stable release detected: $TAG_VERSION" | |
| fi | |
| test: | |
| name: Run Full Test Suite | |
| needs: validate | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| - name: Set up Python | |
| run: uv python install 3.12 | |
| - name: Install dependencies | |
| run: uv sync | |
| - name: Format check | |
| run: make format-check | |
| - name: Lint | |
| run: make lint | |
| - name: Type check | |
| run: make type-check | |
| - name: Run all tests (identical to local) | |
| run: make test | |
| release: | |
| name: Create GitHub Release | |
| needs: [validate, test] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Extract release notes | |
| id: extract-notes | |
| run: | | |
| VERSION="${{ needs.validate.outputs.base_version }}" | |
| # Extract section between current version and next version heading | |
| # Using sed for better portability across awk implementations | |
| sed -n "/^## \[$VERSION\]/,/^## \[/{ | |
| /^## \[$VERSION\]/d | |
| /^## \[/q | |
| p | |
| }" CHANGELOG.md > release_notes.txt | |
| # Clean up empty lines at start/end | |
| sed -i '/./,$!d' release_notes.txt | |
| sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' release_notes.txt | |
| echo "Release notes extracted:" | |
| cat release_notes.txt | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v3.0.0 | |
| with: | |
| body_path: release_notes.txt | |
| draft: false | |
| prerelease: ${{ needs.validate.outputs.prerelease == 'true' }} | |
| generate_release_notes: false | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Release summary | |
| run: | | |
| if [ "${{ needs.validate.outputs.prerelease }}" == "true" ]; then | |
| RELEASE_TYPE="Pre-release" | |
| else | |
| RELEASE_TYPE="Stable Release" | |
| fi | |
| echo "## 🚀 $RELEASE_TYPE ${{ needs.validate.outputs.version }} Published!" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Release Notes" >> $GITHUB_STEP_SUMMARY | |
| cat release_notes.txt >> $GITHUB_STEP_SUMMARY |