Skip to content

update release workflow #36

update release workflow

update release workflow #36

Workflow file for this run

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 -l {0}
steps:
- name: Free Disk Space (Ubuntu)
if: runner.os == 'Linux'
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout release branch
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set environment variables
run: |
echo "PYTHON_VERSION=${{ matrix.python-version }}" >> $GITHUB_ENV
echo "PYWS_FORTRAN=false >> $GITHUB_ENV
cat .mf6_ci_ref_remote >> $GITHUB_ENV
- name: Setup gfortran
uses: fortran-lang/setup-fortran@v1
with:
compiler: gcc
version: 11
- name: Install Dependencies via Micromamba
uses: mamba-org/[email protected]
with:
micromamba-version: '1.5.10-0'
environment-file: environment.yml
cache-environment: true
cache-downloads: true
create-args: >-
python=3.10
conda
- name: Checkout MODFLOW 6
uses: actions/checkout@v3
with:
repository: MODFLOW-USGS/modflow6
ref: develop
path: modflow6
- name: Update flopy MODFLOW 6 classes
working-directory: modflow6/autotest
run: |
python update_flopy.py
- name: Install mf6 nightly build binaries
uses: modflowpy/install-modflow-action@v1
with:
repo: modflow6-nightly-build
- name: Install pywatershed
run: |
pip install .
- name: Version info
run: |
pip -V
pip list
- name: Get GIS files for tests
run: |
python pywatershed/utils/gis_files.py
- name: domainless - run tests not requiring domain data
working-directory: autotest
run: pytest
-m domainless
-n=auto
-vv
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_domainless.xml
- name: sagehen_5yr_no_cascades - generate and manage test data domain, run PRMS and convert csv output to NetCDF
working-directory: autotest
run: |
python generate_test_data.py \
-n=auto --domain=sagehen_5yr --control_pattern=sagehen_no_cascades.control \
--remove_prms_csvs --remove_prms_output_dirs
- name: sagehen_5yr_no_cascades - list netcdf input files
working-directory: test_data
run: |
find sagehen_5yr/output_no_cascades -name '*.nc'
- name: sagehen_5yr_no_cascades - pywatershed tests
working-directory: autotest
run: pytest
-vv
-rs
-n=auto
-m "not domainless"
--domain=sagehen_5yr
--control_pattern=sagehen_no_cascades.control
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_sagehen_5yr_no_cascades.xml
- name: hru_1_nhm - generate and manage test data domain, run PRMS and convert csv output to NetCDF
working-directory: autotest
run: |
python generate_test_data.py \
-n=auto --domain=hru_1 --control_pattern=nhm.control \
--remove_prms_csvs --remove_prms_output_dirs
- name: hru_1_nhm - list netcdf input files
working-directory: test_data
run: |
find hru_1/output -name '*.nc'
- name: hru_1_nhm - pywatershed tests
working-directory: autotest
run: pytest
-vv
-rs
-n=auto
-m "not domainless"
--domain=hru_1
--control_pattern=nhm.control
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_hru_1_nhm.xml
- name: drb_2yr with and without dprst and obsin - generate and manage test data
working-directory: autotest
run: |
python generate_test_data.py \
-n=auto --domain=drb_2yr \
--remove_prms_csvs --remove_prms_output_dirs
- name: drb_2yr_nhm - list netcdf input files
working-directory: test_data
run: |
find drb_2yr/output -name '*.nc'
- name: drb_2yr_no_dprst - list netcdf input files
working-directory: test_data
run: |
find drb_2yr/output_no_dprst -name '*.nc'
- name: drb_2yr_nhm - pywatershed tests
working-directory: autotest
run: pytest
-vv
-rs
-n=auto
-m "not domainless"
--domain=drb_2yr
--control_pattern=nhm.control
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_drb_2yr_nhm.xml
# Specific tests not redundant with dprst
- name: drb_2yr_no_dprst - pywatershed tests
working-directory: autotest
run: pytest
test_prms_runoff.py
test_prms_soilzone.py
test_prms_groundwater.py
test_prms_above_snow.py
test_prms_below_snow.py
-vv
-rs
-n=auto
-m "not domainless"
--domain=drb_2yr
--control_pattern=no_dprst
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_drb_2yr_no_dprst.xml
# Specific tests not redundant with dprst
- name: drb_2yr_obsin - pywatershed tests
working-directory: autotest
run: pytest
test_obsin_flow_node.py
-vv
-n=0
-m "not domainless"
--domain=drb_2yr
--control_pattern=nhm_obsin.control
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_drb_2yr_no_dprst.xml
- name: ucb_2yr_nhm - generate and manage test data
working-directory: autotest
run: |
python generate_test_data.py \
-n=auto --domain=ucb_2yr --control_pattern=nhm.control \
--remove_prms_csvs --remove_prms_output_dirs
- name: ucb_2yr_nhm - list netcdf input files
working-directory: test_data
run: |
find ucb_2yr/output -name '*.nc'
- name: ucb_2yr_nhm - pywatershed tests
working-directory: autotest
run: pytest
-vv
-n=auto
-m "not domainless"
--domain=ucb_2yr
--control_pattern=nhm.control
--durations=0
--cov=pywatershed
--cov-report=xml
--junitxml=pytest_ucb_2yr_nhm.xml
- name: Update version
id: version
run: |
ref="${{ github.ref_name }}"
version="${ref#"v"}"
python .github/scripts/update_version.py -v "$version"
python -c "import pywatershed; print('Version: ', pywatershed.__version__)"
echo "version=$version" >> $GITHUB_OUTPUT
- name: Format files
run: |
ruff check .
ruff format .
- name: Update release branch, draft PR to main
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 pywatershed
git add version.txt
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 `main`. This will trigger jobs to publish the release to PyPI and reset `develop` from `main`.
'
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: Draft release
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
version=$(cat version.txt | xargs)
title="pywatershed $version"
gh release create "$version" \
--target main \
--title "$title" \
--draft \
--latest
publish:
name: Publish package
# runs only when GitHub release is published (manually promoted from draft)
if: ${{ github.event_name == 'release' }}
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
id-token: write # mandatory for trusted publishing
environment: # requires a 'pypi' environment in repo settings
name: pypi
url: https://pypi.org/p/pywatershed
steps:
- name: Checkout main branch
uses: actions/checkout@v3
with:
ref: main
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: 3.10
cache: 'pip'
cache-dependency-path: pyproject.toml
- 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 artifact
uses: actions/upload-artifact@v3
with:
name: dist
path: dist
- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
verbose: true