diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..87ebdd2 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,148 @@ +name: release + +on: + workflow_dispatch: + inputs: + version: + required: true + default: 'x.y.z' + +permissions: + contents: write + pull-requests: write + +jobs: + checks: + name: Version check + runs-on: ubuntu-24.04 + steps: + - name: Checkout repository + id: repo + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + + - name: Set up Python + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 + with: + python-version: 3.14.0 + + - name: Get latest release from pip + id: latestreleased + run: | + PREVIOUS_VERSION=$(python -m pip index versions CCPBioSim-Python-Template | grep "CCPBioSim-Python-Template" | cut -d "(" -f2 | cut -d ")" -f1) + echo "pip_tag=$PREVIOUS_VERSION" >> "$GITHUB_OUTPUT" + echo $PREVIOUS_VERSION + + - name: version comparison + id: compare + run: | + pip3 install semver + output=$(pysemver compare ${{ steps.latestreleased.outputs.pip_tag }} ${{ github.event.inputs.version }}) + if [ $output -ge 0 ]; then exit 1; fi + + version: + name: prepare ${{ github.event.inputs.version }} + needs: checks + runs-on: ubuntu-24.04 + steps: + + - name: checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + + - name: Change version in repo and CITATION.cff + run: | + # Update Python package version + sed -i "s/__version__ =.*/__version__ = \"${{ github.event.inputs.version }}\"/g" src/example_package_YOUR_USERNAME_HERE/__init__.py + + # Update CITATION.cff version and date-released + if [ -f CITATION.cff ]; then + sed -i -E "s/^(version:\s*).*/\1${{ github.event.inputs.version }}/" CITATION.cff + sed -i -E "s/^(date-released:\s*).*/\1'$(date -u +%F)'/" CITATION.cff + fi + + - name: send PR + id: pr_id + uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0 + with: + commit-message: Update version to ${{ github.event.inputs.version }} + branch: version-update + title: "Update to version ${{ github.event.inputs.version }}" + body: | + Update version + - Update the __init__.py with new release + - Update CITATION.cff version & date-released + - Auto-generated by [CI] + committer: version-updater + author: version-updater + base: main + signoff: false + draft: false + + - name: auto approve review + uses: hmarr/auto-approve-action@f0939ea97e9205ef24d872e76833fa908a770363 # v4.0.0 + with: + pull-request-number: ${{ steps.pr_id.outputs.pull-request-number }} + review-message: "Auto approved version bump PR" + github-token: ${{ secrets.AUTO_PR_MERGE }} + + - name: merge PR + run: gh pr merge --merge --delete-branch --auto "${{ steps.pr_id.outputs.pull-request-number }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + tag: + name: tag release + needs: version + runs-on: ubuntu-24.04 + steps: + - name: Checkout repository + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + with: + ref: main + + - name: tag v${{ github.event.inputs.version }} + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git tag ${{ github.event.inputs.version }} + git push origin tag ${{ github.event.inputs.version }} + + release: + name: make github release + needs: tag + runs-on: ubuntu-24.04 + steps: + + - name: create release + uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 + with: + name: v${{ github.event.inputs.version }} + generate_release_notes: true + tag_name: ${{ github.event.inputs.version }} + + pypi: + name: make pypi release + needs: [tag, release] + runs-on: ubuntu-24.04 + steps: + + - name: checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + with: + ref: main + + - name: Set up Python + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 + with: + python-version: 3.14.0 + + - name: Install flit + run: | + python -m pip install --upgrade pip + python -m pip install flit~=3.9 + + - name: Build and publish + run: | + flit publish + env: + FLIT_USERNAME: __token__ + FLIT_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}