cytoscape
Version:
Graph theory (a.k.a. network) library for analysis and visualisation
225 lines (215 loc) • 8.54 kB
YAML
name: Release
run-name: Release (${{ inputs.type }})
# Single entry point for all releases. Trusted publishing on npmjs.com
# validates the filename of the top-level workflow of the run, and only one
# trusted publisher configuration is allowed per package, so every release
# must start from this workflow. The trusted publisher config on npmjs.com
# must name release.yml as the workflow filename.
#
# If the npm_publish job fails after the release job succeeded (e.g. a
# transient registry error), recover with 'Re-run failed jobs' on the failed
# run. Do NOT dispatch a new release: the version bump has already been
# committed and pushed, so a fresh dispatch would bump the version again and
# leave the previous version unpublished on npm.
on:
workflow_dispatch:
inputs:
type:
# No default: an input-less API/CLI dispatch must fail (422) rather
# than silently run a release; the UI dropdown still works.
description: 'Release type'
required: true
type: choice
options:
- patch
- feature
# Serialize releases: overlapping runs would race their pushes to master and
# unstable and could publish an untagged tree.
concurrency:
group: release
cancel-in-progress: false
jobs:
patch-release:
if: ${{ inputs.type == 'patch' }}
runs-on: ubuntu-latest
timeout-minutes: 60
environment: prod
steps:
- name: Set branch name
shell: bash
run: |
echo "BRANCH=master" >> $GITHUB_ENV
echo "Branch: master"
- name: checkout patch branch
uses: actions/checkout@v7
with:
ref: ${{ env.BRANCH }}
- uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: 'npm'
- name: Install dependencies
run: npm install
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run tests
run : |
npm test
- name: Get new version string
id: get_new_patch_version
run: |
chmod +rx ./.github/workflows/scripts/new-patch-version.sh
. ./.github/workflows/scripts/new-patch-version.sh
shell: bash
- name: See patch branch
run: echo branch ${{ env.BRANCH }}
shell: bash
- name: See new patch version
run: echo "# version:" ${{ env.VERSION }}
shell: bash
- name: checkout master branch
uses: actions/checkout@v7
with:
ref: master
fetch-depth: 0
- name: Set Git Config
run : |
# Set git configs
git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
- name: Update Version on master
id: update_backport_version_master
run: |
jq --arg ver "${{ env.VERSION }}" '.versions += [$ver]' ./documentation/versions.json >> /tmp/temp.json
mv /tmp/temp.json ./documentation/versions.json
git add . && git commit -m "Docs: Add ${{ env.VERSION }} to versions.json"
git push
- name: checkout unstable branch
uses: actions/checkout@v7
with:
ref: unstable
fetch-depth: 0
- name: Update Version on unstable
id: update_backport_version_unstable
run: |
jq --arg ver "${{ env.VERSION }}" '.versions += [$ver]' ./documentation/versions.json >> /tmp/temp.json
mv /tmp/temp.json ./documentation/versions.json
git add . && git commit -m "Docs: Add ${{ env.VERSION }} to versions.json"
git push
git checkout ${{ env.BRANCH }}
- name: Set Git Config
run : |
# Set git configs
git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
- name: Make Release
id: release
run: |
chmod +rx .github/workflows/scripts/pre_release_test.sh
. .github/workflows/scripts/pre_release_test.sh ${{ env.BRANCH }}
- name: Archive action failure results
uses: actions/upload-artifact@v7
if: ${{ failure() && steps.release.conclusion == 'failure' }}
with:
name: npm-release--failure-report
path: /home/runner/.npm/_logs/
- name: Publish Package to GitHub Releases
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.MAIN_GH_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases \
-d '{"tag_name":"v${{ env.VERSION }}","target_commitish":"master","name":"v${{ env.VERSION }}","body":"Release version v${{ env.VERSION }}","draft":false,"prerelease":false,"generate_release_notes":false}'
- name: Deploy to Github Pages 🚀
if: ${{ env.BRANCH == 'master' }}
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: documentation
feature-release:
if: ${{ inputs.type == 'feature' }}
runs-on: ubuntu-latest
environment: prod
timeout-minutes: 60
steps:
- name: checkout unstable branch
uses: actions/checkout@v7
with:
ref: 'unstable'
fetch-depth: 0
- uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: 'npm'
- name: Install dependencies
run: npm install
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run tests
run : |
npm test
- name: Determine version for the release
id: get_new_patch_version
run: |
pwd
chmod 777 -R ./* ./.[!.]*
. ./.github/workflows/scripts/new-feature-version.sh
shell: bash
- name: See new master version and jq version
run: |
echo VERSION ${{ env.VERSION }}
jq --version
shell: bash
- name: Checkout Master Branch
uses: actions/checkout@v7
with:
ref: master
fetch-depth: 0
- name: Update documentation and Merge unstable to master branch
run: |
. ./.github/workflows/scripts/merge_unstable_to_master.sh
- name: Build release and verify changes
id: release
run: |
. .github/workflows/scripts/pre_release_test.sh master
- name: Archive code coverage results
uses: actions/upload-artifact@v7
if: ${{ failure() && steps.release.conclusion == 'failure' }}
with:
name: npm-release--failure-report
path: /home/runner/.npm/_logs/
- name: Publish Package to GitHub Releases
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.MAIN_GH_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases \
-d '{"tag_name":"v${{ env.VERSION }}","target_commitish":"master","name":"v${{ env.VERSION }}","body":"Release version v${{ env.VERSION }}","draft":false,"prerelease":false,"generate_release_notes":false}'
- name: Deploy to Github Pages 🚀
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: documentation
- name: Create Issue
run: |
TITLE="Create a blog post for release v$VERSION"
echo "Issue title: $TITLE"
sed ':a;N;$!ba;s/\n/\\n/g' ./.github/workflows/md/blog-issue-template.md > output_file.txt
BODY="$(cat output_file.txt)"
echo "Body: $BODY"
curl -X POST \
-H "Authorization: token ${{ secrets.CYTOSCAPE_JS_BLOG_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/cytoscape/cytoscape.js-blog/issues" \
-d "{\"title\":\"$TITLE\",\"body\":\"$BODY\"}"
# Exactly one of the release jobs above runs per dispatch; publish after
# whichever one ran, but not if it failed or the run was cancelled.
npm_publish:
needs: [patch-release, feature-release]
if: ${{ !cancelled() && (needs.patch-release.result == 'success' || needs.feature-release.result == 'success') }}
permissions:
contents: read
id-token: write
uses: ./.github/workflows/npm-publish.yml