diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..753fca4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,173 @@ +name: Release +on: + push: + branches: + - master + - v[0-9]+.[0-9]+.[0-9]+* + release: + types: + - published +jobs: + prep: + name: Prepare release + runs-on: ubuntu-latest + if: ${{ github.event_name == 'push' && github.ref_name != 'master' }} + permissions: + contents: write + pull-requests: write + defaults: + run: + shell: bash + steps: + + - name: Checkout release branch + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: 3.9 + cache: 'pip' + cache-dependency-path: pyproject.toml + + - name: Install Python dependencies + run: | + pip install --upgrade pip + pip install build twine + pip install . + + - name: Make code.md + run: make-code-json + + - name: Upload code.md + uses: actions/upload-artifact@v3 + with: + name: code.md + path: code.md + + - name: Update version + id: version + run: | + ref="${{ github.ref_name }}" + version="${ref#"v"}" + python scripts/update_version.py -v "$version" + python -c "import pymake; print('Version: ', pymake.__version__)" + echo "version=$version" >> $GITHUB_OUTPUT + + - name: Lint + run: ruff check . + + - name: Format + run: ruff format . + + - name: Push release branch + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + ver="${{ steps.version.outputs.version }}" + + # commit and push changes + git config core.sharedRepository true + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add pymake + git commit -m "ci(release): set version to ${{ steps.version.outputs.version }}" + git push origin "${{ github.ref_name }}" + + title="Release $ver" + body=' + # Release '$ver' + + The release can be approved by merging this pull request into `master`. This will trigger a job to publish the release to PyPI. + ' + gh pr create -B "master" -H "${{ github.ref_name }}" --title "$title" --draft --body "$body" + + release: + name: Draft release + # runs only when changes are merged to master + if: ${{ github.event_name == 'push' && github.ref_name == 'master' }} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + + - name: Checkout repo + uses: actions/checkout@v3 + with: + ref: master + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: 3.9 + + - name: Install Python dependencies + run: | + pip install --upgrade pip + pip install . + pip install ".[test]" + + - name: Download artifacts + uses: dawidd6/action-download-artifact@v2 + + - name: Draft release + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + version=$(python scripts/update_version.py -g) + title="pymake $version" + notes=$(cat code.md) + gh release create "$version" \ + --target master \ + --title "$title" \ + --notes "$notes" \ + --draft \ + --latest + + publish: + name: Publish package + # runs only after release is published (manually promoted from draft) + if: github.event_name == 'release' && github.repository_owner == 'modflowpy' + runs-on: ubuntu-22.04 + permissions: + contents: write + pull-requests: write + id-token: write + environment: # requires a 'release' environment in repo settings + name: release + url: https://pypi.org/p/mfpymake + steps: + + - name: Checkout master branch + uses: actions/checkout@v3 + with: + ref: master + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: 3.9 + + - name: Install Python dependencies + run: | + pip install --upgrade pip + pip install build twine + pip install . + + - name: Build package + run: python -m build + + - name: Check package + run: twine check --strict dist/* + + - name: Upload package + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/autotest/pytest.ini b/autotest/pytest.ini index 00fcab6..950aeb6 100644 --- a/autotest/pytest.ini +++ b/autotest/pytest.ini @@ -1,4 +1,5 @@ [pytest] +addopts = --color=yes markers = base: base tests dependency: tests that depend on other tests (via pytest-dependency)