name: Publish to PyPI on: release: types: [published] workflow_dispatch: inputs: test_pypi: description: 'Publish to Test PyPI instead of PyPI' required: false default: 'false' type: boolean jobs: test: name: Run tests before publish runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.11' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e . - name: Run comprehensive tests run: | python -m pytest --cov=msgcenterpy --cov-fail-under=80 - name: Run linting run: | black --check msgcenterpy tests isort --check-only msgcenterpy tests mypy msgcenterpy build: name: Build package runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.11' # - name: Install build dependencies # run: | # python -m pip install --upgrade pip # pip install build twine check-manifest # - name: Verify version consistency # run: | # # 检查版本号一致性 # VERSION=$(python -c "import msgcenterpy; print(msgcenterpy.__version__)" 2>/dev/null || echo "unknown") # TAG_VERSION="${GITHUB_REF#refs/tags/v}" # if [ "$GITHUB_EVENT_NAME" = "release" ]; then # if [ "$VERSION" != "$TAG_VERSION" ]; then # echo "Version mismatch: package=$VERSION, tag=$TAG_VERSION" # exit 1 # fi # fi # - name: Check manifest # run: check-manifest - name: Build package run: | python -m build - name: Check package run: | twine check dist/* - name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: dist-${{ github.run_number }} path: dist/ retention-days: 30 publish-test: name: Publish to Test PyPI runs-on: ubuntu-latest needs: build if: github.event.inputs.test_pypi == 'true' || (github.event_name == 'release' && github.event.release.prerelease) environment: name: test-pypi url: https://test.pypi.org/p/msgcenterpy steps: - name: Download build artifacts uses: actions/download-artifact@v3 with: name: dist-${{ github.run_number }} path: dist/ - name: Publish to Test PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ password: ${{ secrets.TEST_PYPI_API_TOKEN }} verbose: true publish-pypi: name: Publish to PyPI runs-on: ubuntu-latest needs: build if: github.event_name == 'release' && !github.event.release.prerelease && github.event.inputs.test_pypi != 'true' environment: name: pypi url: https://pypi.org/p/msgcenterpy steps: - name: Download build artifacts uses: actions/download-artifact@v3 with: name: dist-${{ github.run_number }} path: dist/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} verbose: true create-github-release-assets: name: Add assets to GitHub release runs-on: ubuntu-latest needs: build if: github.event_name == 'release' steps: - name: Download build artifacts uses: actions/download-artifact@v3 with: name: dist-${{ github.run_number }} path: dist/ - name: Upload release assets uses: softprops/action-gh-release@v1 with: files: dist/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} post-publish: name: Post-publish tasks runs-on: ubuntu-latest needs: [publish-pypi, publish-test] if: always() && (needs.publish-pypi.result == 'success' || needs.publish-test.result == 'success') steps: - uses: actions/checkout@v4 - name: Create deployment summary run: | echo "## 🚀 Deployment Summary" >> $GITHUB_STEP_SUMMARY echo "| Item | Status |" >> $GITHUB_STEP_SUMMARY echo "|------|--------|" >> $GITHUB_STEP_SUMMARY if [ "${{ needs.publish-pypi.result }}" = "success" ]; then echo "| PyPI | ✅ Published |" >> $GITHUB_STEP_SUMMARY elif [ "${{ needs.publish-test.result }}" = "success" ]; then echo "| Test PyPI | ✅ Published |" >> $GITHUB_STEP_SUMMARY fi echo "| GitHub Release | ✅ Assets uploaded |" >> $GITHUB_STEP_SUMMARY echo "| Version | ${{ github.event.release.tag_name || 'test' }} |" >> $GITHUB_STEP_SUMMARY # 为将来的通知预留 - name: Notify team run: | echo "Package published successfully!" # 可以添加 Slack、Discord 等通知