Merge branch 'main' into develop #2
This file contains 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: | |
branches: | |
- main | |
- 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 != 'main' }} | |
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.8 | |
cache: 'pip' | |
cache-dependency-path: pyproject.toml | |
- name: Install Python dependencies | |
run: | | |
pip install --upgrade pip | |
pip install build twine | |
pip install . | |
pip install ".[lint, test]" | |
- name: Update version | |
id: version | |
run: | | |
ref="${{ github.ref_name }}" | |
version="${ref#"v"}" | |
python scripts/update_version.py -v "$version" | |
python -c "import modflowapi; print('Version: ', modflowapi.__version__)" | |
echo "version=$version" >> $GITHUB_OUTPUT | |
- name: Touch changelog | |
run: touch HISTORY.md | |
- name: Generate changelog | |
id: cliff | |
uses: orhun/git-cliff-action@v1 | |
with: | |
config: cliff.toml | |
args: --verbose --unreleased --tag ${{ steps.version.outputs.version }} | |
env: | |
OUTPUT: CHANGELOG.md | |
- name: Update changelog | |
id: update-changelog | |
run: | | |
# move changelog | |
clog="CHANGELOG_${{ steps.version.outputs.version }}.md" | |
echo "changelog=$clog" >> $GITHUB_OUTPUT | |
sudo cp "${{ steps.cliff.outputs.changelog }}" "$clog" | |
# show current release changelog | |
cat "$clog" | |
# substitute full group names | |
sed -i 's/#### Ci/#### Continuous integration/' "$clog" | |
sed -i 's/#### Feat/#### New features/' "$clog" | |
sed -i 's/#### Fix/#### Bug fixes/' "$clog" | |
sed -i 's/#### Refactor/#### Refactoring/' "$clog" | |
sed -i 's/#### Test/#### Testing/' "$clog" | |
cat "$clog" HISTORY.md > temp_history.md | |
sudo mv temp_history.md HISTORY.md | |
# show full changelog | |
cat HISTORY.md | |
- name: Upload changelog | |
uses: actions/upload-artifact@v3 | |
with: | |
name: changelog | |
path: ${{ steps.update-changelog.outputs.changelog }} | |
- name: Format Python files | |
run: python scripts/pull_request_prepare.py | |
- name: Push release branch | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: | | |
ver="${{ steps.version.outputs.version }}" | |
changelog=$(cat ${{ steps.update-changelog.outputs.changelog }} | grep -v "### Version $ver") | |
# remove this release's changelog so we don't commit it | |
# the changes have already been prepended to HISTORY.md | |
rm ${{ steps.update-changelog.outputs.changelog }} | |
rm -f CHANGELOG.md | |
# 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 -A | |
git commit -m "ci(release): set version to ${{ steps.version.outputs.version }}, update changelog" | |
git push origin "${{ github.ref_name }}" | |
title="Release $ver" | |
body=' | |
# Release '$ver' | |
The release can be approved by merging this pull request into `main`. This will trigger jobs to publish the release to PyPI and reset `develop` from `main`, incrementing the minor version number. | |
## Changelog | |
'$changelog' | |
' | |
gh pr create -B "main" -H "${{ github.ref_name }}" --title "$title" --draft --body "$body" | |
release: | |
name: Draft release | |
# runs only when changes are merged to main | |
if: ${{ github.event_name == 'push' && github.ref_name == 'main' }} | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@v3 | |
with: | |
ref: main | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
- name: Install Python dependencies | |
run: | | |
pip install --upgrade pip | |
pip install . | |
pip install ".[test]" | |
# actions/download-artifact won't look at previous workflow runs but we need to in order to get changelog | |
- 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="modflowapi $version" | |
notes=$(cat "changelog/CHANGELOG_$version.md" | grep -v "### Version $version") | |
gh release create "$version" \ | |
--target main \ | |
--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 == 'MODFLOW-USGS' | |
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/modflowapi | |
steps: | |
- name: Checkout main branch | |
uses: actions/checkout@v3 | |
with: | |
ref: main | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
- 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 | |
reset: | |
name: Draft reset PR | |
if: ${{ github.event_name == 'release' }} | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- name: Checkout main branch | |
uses: actions/checkout@v3 | |
with: | |
ref: main | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
cache: 'pip' | |
cache-dependency-path: pyproject.toml | |
- name: Install Python dependencies | |
run: | | |
pip install --upgrade pip | |
pip install . | |
pip install ".[lint, test]" | |
- name: Get release tag | |
uses: oprypin/find-latest-tag@v1 | |
id: latest_tag | |
with: | |
repository: ${{ github.repository }} | |
releases-only: true | |
- name: Draft pull request | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: | | |
# create reset branch from main | |
reset_branch="post-release-${{ steps.latest_tag.outputs.tag }}-reset" | |
git switch -c $reset_branch | |
# increment minor version | |
major_version=$(echo "${{ steps.latest_tag.outputs.tag }}" | cut -d. -f1) | |
minor_version=$(echo "${{ steps.latest_tag.outputs.tag }}" | cut -d. -f2) | |
patch_version=0 | |
version="$major_version.$((minor_version + 1)).$patch_version" | |
python scripts/update_version.py -v "$version" | |
# format Python files | |
python scripts/pull_request_prepare.py | |
# commit and push reset branch | |
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 -A | |
git commit -m "ci(release): update to development version $version" | |
git push -u origin $reset_branch | |
# create PR into develop | |
body=' | |
# Reinitialize for development | |
Updates the `develop` branch from `main` following a successful release. Increments the minor version number. | |
' | |
gh pr create -B "develop" -H "$reset_branch" --title "Reinitialize develop branch" --draft --body "$body" |