diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 259a0dc..e2e4f3a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,14 +1,87 @@ -name: Create Release +name: Test and Release on: push: tags: - 'v*' + workflow_dispatch: # Позволяет запускать вручную jobs: - release: - name: Create GitHub Release + # Шаг 1: Валидация структуры HA интеграции + validate: + name: Validate Integration runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Hassfest Validation + uses: home-assistant/actions/hassfest@master + + - name: HACS Validation + uses: hacs/action@main + with: + category: "integration" + + # Шаг 2: Запуск тестов (если есть) + test: + name: Run Tests + runs-on: ubuntu-latest + needs: validate + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pytest pytest-homeassistant-custom-component + if [ -f requirements_test.txt ]; then pip install -r requirements_test.txt; fi + + - name: Run tests + run: | + if [ -d "tests" ]; then + pytest tests/ --cov=custom_components/motion_light --cov-report=xml + else + echo "No tests directory found, skipping tests" + fi + + # Шаг 3: Проверка стиля кода + lint: + name: Code Quality + runs-on: ubuntu-latest + needs: validate + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install linters + run: | + pip install black ruff mypy + + - name: Check code formatting with black + run: | + black --check custom_components/motion_light/ || echo "Code formatting issues found" + + - name: Check code with ruff + run: | + ruff check custom_components/motion_light/ || echo "Ruff issues found" + + # Шаг 4: Создание релиза (только если все проверки пройдены) + release: + name: Create Release + runs-on: ubuntu-latest + needs: [validate, test, lint] permissions: contents: write @@ -24,9 +97,16 @@ jobs: TAG=${GITHUB_REF#refs/tags/} echo "tag=$TAG" >> $GITHUB_OUTPUT - TAG_MSG=$(git tag -l --format='%(contents)' $TAG 2>/dev/null || git log -1 --pretty=%B) - echo "message<> $GITHUB_OUTPUT - echo "$TAG_MSG" >> $GITHUB_OUTPUT + PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") + + if [ -z "$PREV_TAG" ]; then + COMMITS=$(git log --pretty=format:"- %s" --reverse) + else + COMMITS=$(git log ${PREV_TAG}..HEAD --pretty=format:"- %s" --reverse) + fi + + echo "commits<> $GITHUB_OUTPUT + echo "$COMMITS" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create GitHub Release @@ -34,13 +114,19 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG="${{ steps.tag.outputs.tag }}" - MSG="${{ steps.tag.outputs.message }}" + COMMITS="${{ steps.tag.outputs.commits }}" echo "🚀 Создаём релиз $TAG в GitHub..." + cat > /tmp/release_notes.md << EOF + ## Изменения в версии $TAG + + $COMMITS + EOF + gh release create "$TAG" \ --title "Release $TAG" \ - --notes "$MSG" \ + --notes-file /tmp/release_notes.md \ --target main echo "✅ Релиз создан!" \ No newline at end of file