diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2bd62b8..c9dcae6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,162 +1,32 @@ -name: Build +name: CI on: push: - branches: main + branches: + - main + tags: + - 'v*' pull_request: - branches: '*' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true jobs: - build: - runs-on: ubuntu-latest - + ci: + name: CI + # `astral-uv` is a self-hosted runner with uv pre-installed, so we can + # skip the setup-uv step entirely. pyproject.toml's + # [tool.hatch.build.hooks.jupyter-builder] handles jlpm install + + # jlpm build:prod before wheel assembly. + runs-on: astral-uv steps: - - name: Checkout - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - name: Build package + run: uv build - - name: Install dependencies - run: python -m pip install -U "jupyterlab>=4.0.0,<5" - - - name: Lint the extension - run: | - set -eux - jlpm - jlpm run lint:check - - - name: Test the extension - run: | - set -eux - jlpm run test - - - name: Build the extension - run: | - set -eux - python -m pip install .[test] - - pytest -vv -r ap --cov snapshot - jupyter server extension list - jupyter server extension list 2>&1 | grep -ie "snapshot.*OK" - - jupyter labextension list - jupyter labextension list 2>&1 | grep -ie "snapshot.*OK" - python -m jupyterlab.browser_check - - - name: Package the extension - run: | - set -eux - - pip install build - python -m build - pip uninstall -y "snapshot" jupyterlab - - - name: Upload extension packages - uses: actions/upload-artifact@v4 - with: - name: extension-artifacts - path: dist/snapshot* - if-no-files-found: error - - test_isolated: - needs: build - runs-on: ubuntu-latest - - steps: - - name: Install Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - architecture: 'x64' - - uses: actions/download-artifact@v4 - with: - name: extension-artifacts - - name: Install and Test - run: | - set -eux - # Remove NodeJS, twice to take care of system and locally installed node versions. - sudo rm -rf $(which node) - sudo rm -rf $(which node) - - pip install "jupyterlab>=4.0.0,<5" snapshot*.whl - - - jupyter server extension list - jupyter server extension list 2>&1 | grep -ie "snapshot.*OK" - - jupyter labextension list - jupyter labextension list 2>&1 | grep -ie "snapshot.*OK" - python -m jupyterlab.browser_check --no-browser-test - - integration-tests: - name: Integration tests - needs: build - runs-on: ubuntu-latest - - env: - PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/pw-browsers - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - - name: Download extension package - uses: actions/download-artifact@v4 - with: - name: extension-artifacts - - - name: Install the extension - run: | - set -eux - python -m pip install "jupyterlab>=4.0.0,<5" snapshot*.whl - - - name: Install dependencies - working-directory: ui-tests - env: - YARN_ENABLE_IMMUTABLE_INSTALLS: 0 - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 - run: jlpm install - - - name: Set up browser cache - uses: actions/cache@v4 - with: - path: | - ${{ github.workspace }}/pw-browsers - key: ${{ runner.os }}-${{ hashFiles('ui-tests/yarn.lock') }} - - - name: Install browser - run: | - set -eux - jlpm playwright install chromium --only-shell - working-directory: ui-tests - - - name: Execute integration tests - working-directory: ui-tests - run: | - jlpm playwright test - - - name: Upload Playwright Test report - if: always() - uses: actions/upload-artifact@v4 - with: - name: snapshot-playwright-tests - path: | - ui-tests/test-results - ui-tests/playwright-report - - check_links: - name: Check Links - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - uses: actions/checkout@v4 - - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 + - name: Upload wheel artifacts + if: success() + uses: actions/upload-artifact@v4 + with: + name: snapshot-dist + path: dist/snapshot-* + if-no-files-found: error diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml deleted file mode 100644 index 0b8a64d..0000000 --- a/.github/workflows/check-release.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Check Release -on: - push: - branches: ["main"] - pull_request: - branches: ["*"] - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - check_release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - 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@v4 - with: - name: snapshot-releaser-dist-${{ github.run_number }} - path: .jupyter_releaser_checkout/dist diff --git a/.github/workflows/enforce-label.yml b/.github/workflows/enforce-label.yml deleted file mode 100644 index 725feab..0000000 --- a/.github/workflows/enforce-label.yml +++ /dev/null @@ -1,13 +0,0 @@ -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 diff --git a/.github/workflows/prep-release.yml b/.github/workflows/prep-release.yml deleted file mode 100644 index 67ecd98..0000000 --- a/.github/workflows/prep-release.yml +++ /dev/null @@ -1,48 +0,0 @@ -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 - # silent: - # description: "Set a placeholder in the changelog and don't publish the release." - # required: false - # type: boolean - 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 - permissions: - contents: write - 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.GITHUB_TOKEN }} - version_spec: ${{ github.event.inputs.version_spec }} - # silent: ${{ github.event.inputs.silent }} - 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 }}" diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml deleted file mode 100644 index c188106..0000000 --- a/.github/workflows/publish-release.yml +++ /dev/null @@ -1,58 +0,0 @@ -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 - environment: release - permissions: - id-token: write - steps: - - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - - uses: actions/create-github-app-token@v1 - id: app-token - with: - app-id: ${{ vars.APP_ID }} - private-key: ${{ secrets.APP_PRIVATE_KEY }} - - - name: Populate Release - id: populate-release - uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2 - with: - token: ${{ steps.app-token.outputs.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: ${{ steps.app-token.outputs.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 }} diff --git a/.github/workflows/update-integration-tests.yml b/.github/workflows/update-integration-tests.yml deleted file mode 100644 index d9c8e77..0000000 --- a/.github/workflows/update-integration-tests.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Update Playwright Snapshots - -on: - issue_comment: - types: [created, edited] - -permissions: - contents: write - pull-requests: write - -jobs: - update-snapshots: - runs-on: ubuntu-latest - if: github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots') - - steps: - - uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots-checkout@main - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - - - name: Base Setup - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - - - name: Install dependencies - run: python -m pip install -U "jupyterlab>=4.0.0,<5" - - - name: Install extension - run: | - set -eux - jlpm - python -m pip install . - - - uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@v1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - # Playwright knows how to start JupyterLab server - start_server_script: 'null' - test_folder: ui-tests - npm_client: jlpm