Skip to content

Commit

Permalink
Set up releaser
Browse files Browse the repository at this point in the history
  • Loading branch information
fcollonval committed Oct 12, 2023
1 parent 1256224 commit 11634d0
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 21 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/check-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Check Release
on:
push:
branches: ["master", "*"]
pull_request:
branches: ["*"]

jobs:
check_release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Base Setup
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
- name: Check Release
uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload Distributions
uses: actions/upload-artifact@v3
with:
name: nbdime-releaser-dist-${{ '{{ github.run_number }}' }}
path: .jupyter_releaser_checkout/dist
13 changes: 13 additions & 0 deletions .github/workflows/enforce-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Enforce PR label

on:
pull_request:
types: [labeled, unlabeled, opened, edited, synchronize]
jobs:
enforce-label:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: enforce-triage-label
uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@v1
41 changes: 41 additions & 0 deletions .github/workflows/prep-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: "Step 1: Prep Release"
on:
workflow_dispatch:
inputs:
version_spec:
description: "New Version Specifier"
default: "next"
required: false
branch:
description: "The branch to target"
required: false
post_version_spec:
description: "Post Version Specifier"
required: false
since:
description: "Use PRs with activity since this date or git reference"
required: false
since_last_stable:
description: "Use PRs with activity since the last stable git tag"
required: false
type: boolean
jobs:
prep_release:
runs-on: ubuntu-latest
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1

- name: Prep Release
id: prep-release
uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
with:
token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
version_spec: ${{ github.event.inputs.version_spec }}
post_version_spec: ${{ github.event.inputs.post_version_spec }}
branch: ${{ github.event.inputs.branch }}
since: ${{ github.event.inputs.since }}
since_last_stable: ${{ github.event.inputs.since_last_stable }}

- name: "** Next Step **"
run: |
echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}"
53 changes: 53 additions & 0 deletions .github/workflows/publish-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: "Step 2: Publish Release"
on:
workflow_dispatch:
inputs:
branch:
description: "The target branch"
required: false
release_url:
description: "The URL of the draft GitHub release"
required: false
steps_to_skip:
description: "Comma separated list of steps to skip"
required: false

jobs:
publish_release:
runs-on: ubuntu-latest
permissions:
# This is useful if you want to use PyPI trusted publisher
# and NPM provenance
id-token: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1

- name: Populate Release
id: populate-release
uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
with:
token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
branch: ${{ github.event.inputs.branch }}
release_url: ${{ github.event.inputs.release_url }}
steps_to_skip: ${{ github.event.inputs.steps_to_skip }}

- name: Finalize Release
id: finalize-release
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
with:
token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
release_url: ${{ steps.populate-release.outputs.release_url }}

- name: "** Next Step **"
if: ${{ success() }}
run: |
echo "Verify the final release"
echo ${{ steps.finalize-release.outputs.release_url }}
- name: "** Failure Message **"
if: ${{ failure() }}
run: |
echo "Failed to Publish the Draft Release Url:"
echo ${{ steps.populate-release.outputs.release_url }}
20 changes: 2 additions & 18 deletions docs/source/installing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ and nbdime's web-based viewers depend on the following Node.js packages:

- codemirror
- json-stable-stringify
- jupyter-js-services
- jupyterlab
- lumino

Expand Down Expand Up @@ -90,31 +89,16 @@ Installing Jupyter extensions
If you want to use the development version of the notebook and lab extensions,
you will also have to run the following commands after the pip dev install::

jupyter serverextension enable --py nbdime --sys-prefix # if developing for jupyter notebook

jupyter server extension enable nbdime # if developing for jupyter lab or nbclassic

jupyter nbextension install --py nbdime --sys-prefix [--sym-link]
jupyter nbextension enable --py nbdime --sys-prefix

jupyter labextension link ./packages/nbdime --no-build
jupyter labextension install ./packages/labextension
jupyter labextension develop --overwrite .


If you do any changes to the front-end code, run :command:`npm run build` from the
repoistory root to rebuild the extensions. If you make any changes to the
repository root to rebuild the extensions. If you make any changes to the
server extension, you will have to restart the server to pick up the changes!


.. note::

The optional ``--sym-link`` flag for :command:`jupyter nbextension install` allows
the notebook frontend to pick up a newly built version of the extension on
a page refresh. For details on the other flags, see
:doc:`extensions`.



.. toctree::
:hidden:

Expand Down
4 changes: 2 additions & 2 deletions docs/source/nodevenv.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ The following steps will: create a virtualenv, named ``myenv``, in the current
directory; activate the virtualenv; and install npm inside the virtualenv
using :command:`nodeenv`::

python3 -m venv myenv # For Python 2: python2 -m virtualenv myenv
python -m venv myenv
source myenv/bin/activate
pip install nodeenv
nodeenv -p
Expand All @@ -15,7 +15,7 @@ dependencies using :command:`pip`.

For example with Python 3.5, the steps with output are::

$ python3 -m venv myenv
$ python -m venv myenv
$ source myenv/bin/activate
(myenv) $ pip install nodeenv
Collecting nodeenv
Expand Down
8 changes: 8 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
[build-system]
requires = ["jupyterlab~=4.0", "setuptools>=40.8.0", "wheel"]
build-backend = "setuptools.build_meta"

[tool.jupyter-releaser.options]
version-cmd = "python scripts/bump_version.py --force"

[tool.jupyter-releaser.hooks]
before-bump-version = [
"npm install"
]
77 changes: 77 additions & 0 deletions scripts/bump_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

import argparse
import json
import shlex
import sys
from pathlib import Path
from subprocess import check_output, run

from packaging.version import parse

LERNA_CMD = "npm run lerna version --no-push --force-publish --no-git-tag-version"


def install_dependencies() -> None:
pkgs = []
try:
import hatch
except ImportError:
pkgs.append("hatch")

if pkgs:
run([sys.executable, "-m", "pip", "install"] + pkgs)


def bump(force: bool, spec: str) -> None:
install_dependencies()

HERE = Path(__file__).parent.parent.resolve()
output = check_output(
shlex.split("git status --porcelain"), cwd=HERE, encoding="utf-8"
)
if len(output) > 0:
raise Exception("Must be in a clean git state with no untracked files")

run(
[sys.executable, "-m", "hatch", "version", spec], cwd=HERE, encoding="utf-8", check=True
)

version = parse(
# Output maybe multi-lines if build dependencies needs to be installed.
check_output(
[sys.executable, "-m", "hatch", "version"], cwd=HERE, encoding="utf-8"
).strip("\n").split("\n")[-1]
)

# convert the Python version
js_spec = "prerelease" if spec in ["alpha", "a", "beta", "b", "rc"] else spec

# bump the JS packages
lerna_cmd = f"{LERNA_CMD} {js_spec}"
if force:
lerna_cmd += " --yes"
run(shlex.split(lerna_cmd), cwd=HERE, check=True)

path = HERE.joinpath("package.json")
if path.exists():
with path.open(mode="r") as f:
data = json.load(f)

data["version"] = js_version

with path.open(mode="w") as f:
json.dump(data, f, indent=2)

else:
raise FileNotFoundError(f"Could not find package.json under dir {path!s}")


if __name__ == "__main__":
parser = argparse.ArgumentParser("bump_version", "Bump package version")
parser.add_argument("--force", action="store_true")
parser.add_argument("spec")

args = parser.parse_args()
bump(args.force, args.spec)
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ignore=E123,E265,E261,E226,E241,E221,E251s
max-line-length=140

[metadata]
license_file = LICENSE.md
license_files = LICENSE.md

[manifix]
known-excludes =
Expand Down

0 comments on commit 11634d0

Please sign in to comment.