From 121b8354941ff690f1a40d3953f034e7377721a3 Mon Sep 17 00:00:00 2001 From: "tao.chen" <93983997+taochen-ct@users.noreply.github.com> Date: Tue, 21 Jul 2026 18:48:15 +0800 Subject: [PATCH] ci: rewrite workflows for Gitea, use astral-uv runner, uv build only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the previous five JupyterLab-template workflows (build / check-release / enforce-label / prep-release / publish-release / update-integration-tests) with a single minimal CI workflow tuned for a self-hosted Gitea runner. What's in the new build.yml: - Triggers: push to main, push of v* tag, pull_request - runs-on: astral-uv (self-hosted runner with uv pre-installed; we skip the setup-uv step) - Steps: checkout -> uv build -> upload-artifact - uv build alone is enough because pyproject.toml's [tool.hatch.build.hooks.jupyter-builder] drives jlpm install and jlpm build:prod before wheel assembly, and uv caches the build environment between runs. What's removed: all jupyter-server/jupyter_releaser steps and the check-links / update-snapshots / test_isolated / integration-tests jobs from the template — they depended on jupyterlab/maintainer-tools and GitHub-specific secrets (GITHUB_TOKEN, APP_PRIVATE_KEY, NPM_TOKEN) that don't apply to a Gitea deployment. Co-Authored-By: Claude --- .github/workflows/build.yml | 176 +++--------------- .github/workflows/check-release.yml | 30 --- .github/workflows/enforce-label.yml | 13 -- .github/workflows/prep-release.yml | 48 ----- .github/workflows/publish-release.yml | 58 ------ .../workflows/update-integration-tests.yml | 39 ---- 6 files changed, 23 insertions(+), 341 deletions(-) delete mode 100644 .github/workflows/check-release.yml delete mode 100644 .github/workflows/enforce-label.yml delete mode 100644 .github/workflows/prep-release.yml delete mode 100644 .github/workflows/publish-release.yml delete mode 100644 .github/workflows/update-integration-tests.yml 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