MODFLOW 6 release dispatch #27
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: MODFLOW 6 release dispatch | |
on: | |
push: | |
branches: | |
# initial phase of the release procedure is triggered by pushing a release branch | |
- v[0-9]+.[0-9]+.[0-9]+* | |
# intermediate phase is triggered by merging the release branch to master | |
- master | |
# final phase is triggered by promoting/publishing a GitHub release draft to a full release | |
release: | |
types: | |
- published | |
# workflow_dispatch trigger to start release via GitHub UI or CLI, | |
# as an alternative to triggering when a release branch is pushed. | |
# see https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow | |
workflow_dispatch: | |
inputs: | |
approve: | |
description: 'Approve the release. Otherwise it is preliminary/provisional.' | |
required: false | |
type: boolean | |
default: false | |
branch: | |
description: 'Branch to release from.' | |
required: true | |
type: string | |
compiler_toolchain: | |
description: 'Compiler toolchain to use. For supported options see https://github.com/MODFLOW-USGS/modflow6/blob/develop/DEVELOPER.md#compiler-compatibility.' | |
required: false | |
type: string | |
default: 'intel-classic' | |
compiler_version: | |
description: 'Compiler version to use. For supported options see https://github.com/MODFLOW-USGS/modflow6/blob/develop/DEVELOPER.md#compiler-compatibility.' | |
required: false | |
type: string | |
default: '2021.7' | |
developmode: | |
description: 'Build binaries in develop mode. If false, IDEVELOPMODE is set to 0.' | |
required: false | |
type: boolean | |
default: true | |
run_tests: | |
description: 'Run tests after building binaries.' | |
required: false | |
type: boolean | |
default: true | |
version: | |
description: 'Version number to use for release.' | |
required: true | |
type: string | |
models: | |
description: 'Models to include in the release documentation' | |
required: false | |
type: string | |
jobs: | |
set_options: | |
name: Set release options | |
if: github.ref_name != 'master' | |
runs-on: ubuntu-22.04 | |
defaults: | |
run: | |
shell: bash -l {0} | |
outputs: | |
branch: ${{ steps.set_branch.outputs.branch }} | |
compiler_toolchain: ${{ steps.set_compiler.outputs.compiler_toolchain }} | |
compiler_version: ${{ steps.set_compiler.outputs.compiler_version }} | |
version: ${{ steps.set_version.outputs.version }} | |
steps: | |
- name: Set branch | |
id: set_branch | |
run: | | |
# if branch was provided explicitly via workflow_dispatch, use it | |
if [[ ("${{ github.event_name }}" == "workflow_dispatch") && (-n "${{ inputs.branch }}") ]]; then | |
branch="${{ inputs.branch }}" | |
# prevent releases from master | |
if [[ "$branch" == "master" ]]; then | |
echo "error: releases may not be triggered from branch $branch" | |
exit 1 | |
fi | |
echo "using branch $branch from workflow_dispatch" | |
elif [[ ("${{ github.event_name }}" == "push") && ("${{ github.ref_name }}" != "master") ]]; then | |
# if release was triggered by pushing a release branch, use that branch | |
branch="${{ github.ref_name }}" | |
echo "using branch $branch from ref ${{ github.ref }}" | |
else | |
# otherwise exit with an error | |
echo "error: this workflow should not have triggered for event ${{ github.event_name }} on branch ${{ github.ref_name }}" | |
exit 1 | |
fi | |
echo "branch=$branch" >> $GITHUB_OUTPUT | |
- name: Set compiler | |
id: set_compiler | |
run: | | |
# if compiler toolchain was provided explicitly via workflow_dispatch, use it | |
if [[ ("${{ github.event_name }}" == "workflow_dispatch") && (-n "${{ inputs.compiler_toolchain }}") ]]; then | |
compiler_toolchain="${{ inputs.compiler_toolchain }}" | |
compiler_version="${{ inputs.compiler_version }}" | |
echo "using compiler toolchain $compiler_toolchain version $compiler_version from workflow_dispatch" | |
elif [[ ("${{ github.event_name }}" == "push") && ("${{ github.ref_name }}" != "master") ]]; then | |
# if release was triggered by pushing a release branch, use the default toolchain and version | |
compiler_toolchain="intel-classic" | |
compiler_version="2021.7" | |
echo "using default compiler toolchain $compiler_toolchain version $compiler_version" | |
else | |
# otherwise exit with an error | |
echo "error: this workflow should not have triggered for event ${{ github.event_name }} on branch ${{ github.ref_name }}" | |
exit 1 | |
fi | |
echo "compiler_toolchain=$compiler_toolchain" >> $GITHUB_OUTPUT | |
echo "compiler_version=$compiler_version" >> $GITHUB_OUTPUT | |
- name: Set version | |
id: set_version | |
run: | | |
# if version number was provided explicitly via workflow_dispatch, use it | |
if [[ ("${{ github.event_name }}" == "workflow_dispatch") && (-n "${{ inputs.version }}") ]]; then | |
ver="${{ inputs.version }}" | |
echo "using version number $ver from workflow_dispatch" | |
elif [[ ("${{ github.event_name }}" == "push") && ("${{ github.ref_name }}" != "master") ]]; then | |
# if release was triggered by pushing a release branch, parse version number from branch name (sans leading 'v') | |
ref="${{ github.ref_name }}" | |
ver="${ref#"v"}" | |
echo "parsed version number $ver from branch name $ref" | |
else | |
# otherwise exit with an error | |
echo "error: version number not provided explicitly (via workflow_dispatch input) or implicitly (via branch name)" | |
exit 1 | |
fi | |
echo "version=$ver" >> $GITHUB_OUTPUT | |
make_dist: | |
name: Make distribution | |
uses: MODFLOW-USGS/modflow6/.github/workflows/release.yml@develop | |
needs: set_options | |
with: | |
# If the workflow is manually triggered, the maintainer must manually set approve=true to approve a release. | |
# If triggered by pushing a release branch, the release is approved if the branch name doesn't contain "rc". | |
approve: ${{ (github.event_name == 'workflow_dispatch' && inputs.approve == 'true') || (github.event_name != 'workflow_dispatch' && !contains(github.ref_name, 'rc')) }} | |
compiler_toolchain: ${{ needs.set_options.outputs.compiler_toolchain }} | |
compiler_version: ${{ needs.set_options.outputs.compiler_version }} | |
branch: ${{ needs.set_options.outputs.branch }} | |
developmode: ${{ inputs.developmode }} | |
full: true | |
run_tests: ${{ inputs.run_tests }} | |
version: ${{ needs.set_options.outputs.version }} | |
models: ${{ inputs.models }} | |
pr: | |
name: Draft release PR | |
if: ${{ github.ref_name != 'master' && ((github.event_name == 'workflow_dispatch' && inputs.approve == 'true') || (github.event_name != 'workflow_dispatch' && !contains(github.ref_name, 'rc'))) }} | |
needs: | |
- set_options | |
- make_dist | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
pull-requests: write | |
defaults: | |
run: | |
shell: bash -l {0} | |
steps: | |
- name: Checkout modflow6 | |
uses: actions/checkout@v4 | |
with: | |
repository: ${{ github.repository_owner }}/modflow6 | |
ref: ${{ github.ref }} | |
- name: Setup Micromamba | |
uses: mamba-org/setup-micromamba@v1 | |
with: | |
environment-file: environment.yml | |
cache-downloads: true | |
cache-environment: true | |
- name: Update version | |
working-directory: distribution | |
run: | | |
# update version files | |
ver="${{ needs.set_options.outputs.version }}" | |
# approve will be empty if workflow was triggered by pushing a release branch | |
# todo: pull approve into set_options job/output? | |
if [[ ("${{ inputs.approve }}" == "true") || ("${{ inputs.approve }}" == "") ]]; then | |
python update_version.py -v "$ver" --approve | |
else | |
python update_version.py -v "$ver" | |
fi | |
# lint version.f90 | |
fprettify -c ../.fprettify.yaml ../src/Utilities/version.f90 | |
# commit and push | |
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 version to $ver" | |
git push origin "${{ github.ref }}" | |
- name: Create pull request | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: | | |
ver="${{ needs.set_options.outputs.version }}" | |
body=' | |
# MODFLOW '$ver' release | |
The release can be approved by merging this PR into `master`. Merging rather than squashing is necessary to preserve the commit history. | |
When this PR is merged, a final job will be triggered to draft a tagged GitHub release, then upload assets (OS distributions and release notes). | |
' | |
gh pr create -B "master" -H "${{ github.ref }}" --title "Release $ver" --draft --body "$body" | |
release: | |
name: Draft release | |
# runs only after release PR is merged to master | |
if: github.event_name == 'push' && github.ref_name == 'master' | |
runs-on: ubuntu-22.04 | |
defaults: | |
run: | |
shell: bash -l {0} | |
steps: | |
- name: Checkout modflow6 | |
uses: actions/checkout@v4 | |
with: | |
repository: ${{ github.repository_owner }}/modflow6 | |
path: modflow6 | |
- name: Setup Micromamba | |
uses: mamba-org/setup-micromamba@v1 | |
with: | |
environment-file: modflow6/environment.yml | |
cache-downloads: true | |
cache-environment: true | |
- name: Download artifacts | |
uses: dawidd6/action-download-artifact@v3 | |
- name: Draft release | |
working-directory: modflow6 | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: | | |
# create draft release | |
version=$(python distribution/update_version.py -g) | |
title="MODFLOW $version" | |
citation=$(python distribution/update_version.py -c) | |
notes=' | |
This is the approved USGS MODFLOW '$version' release. | |
'$citation' | |
Visit the USGS "MODFLOW and Related Programs" site for information on MODFLOW 6 and related software: https://doi.org/10.5066/F76Q1VQV | |
' | |
gh release create "$version" ../mf*/mf*.zip ../release_notes/release.pdf --target master --title "$title" --notes "$notes" --draft --latest |