diff --git a/.github/workflows/binder-on-pr.yml b/.github/workflows/binder-on-pr.yml new file mode 100644 index 00000000..87e9cd29 --- /dev/null +++ b/.github/workflows/binder-on-pr.yml @@ -0,0 +1,14 @@ +name: Binder Badge +on: + pull_request_target: + types: [opened] + +jobs: + binder: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: jupyterlab/maintainer-tools/.github/actions/binder-link@v1 + with: + github_token: ${{ secrets.github_token }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..741aefc5 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,259 @@ +name: Build + +on: + push: + branches: main + pull_request: + branches: '*' + +jobs: + build: + name: Build jupytercad + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: cad + create-args: >- + python=3.9 + jupyterlab=4 + yarn=3 + + - name: Setup pip cache + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: pip-3.9-${{ hashFiles('package.json') }} + restore-keys: | + pip-3.9- + pip- + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - name: Setup yarn cache + uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: yarn-${{ hashFiles('yarn.lock') }} + restore-keys: | + yarn- + + - name: Setup OpenCascade build cache + uses: actions/cache@v2 + with: + path: | + packages/opencascade/lib/jupytercad.opencascade.js + packages/opencascade/lib/jupytercad.opencascade.wasm + packages/opencascade/lib/jupytercad.opencascade.d.ts + packages/opencascade/lib/jupytercad.opencascade.version + key: ${{ hashFiles('packages/opencascade/build.yml') }} + + - name: Build the extension + shell: bash -l {0} + run: | + set -eux + yarn install + yarn dev + jupyter labextension list 2>&1 | grep -ie "jupytercad-core.*OK" + jupyter labextension list 2>&1 | grep -ie "jupytercad-lab.*OK" + + - name: Test import + shell: bash -l {0} + run: python -c "import jupytercad_app" + + - name: Package the extension + shell: bash -l {0} + run: | + set -eux + pip install hatch + yarn build:packages + + - name: Upload extension packages + uses: actions/upload-artifact@v3 + with: + name: extension-artifacts + path: | + python/jupytercad_core/dist/jupytercad* + python/jupytercad_lab/dist/jupytercad* + python/jupytercad_app/dist/jupytercad* + if-no-files-found: error + + test_isolated: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: '3.9' + architecture: 'x64' + + - uses: actions/download-artifact@v3 + with: + name: extension-artifacts + + - name: Install and Test + # TODO Update JupyterLab version + 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) + + cp ./jupytercad_core/dist/jupytercad*.whl ./jupytercad_lab/dist/jupytercad*.whl ./jupytercad_app/dist/jupytercad*.whl . + python -m pip install "jupyterlab>=4.0.0" jupytercad*.whl + + jupyter labextension list + jupyter labextension list 2>&1 | grep -ie "jupytercad.*OK" + jupyter cad --version + # jupyterlab.browser_check will fail due to the core extension jupyterlab_pygments. + # It does not support lab v4.0.0 + #python -m jupyterlab.browser_check --no-chrome-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@v3 + + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + micromamba-version: '1.5.5-0' + environment-name: cad + create-args: >- + python=3.9 + jupyterlab + pythonocc-core=7.7.0 + + - name: Download extension package + uses: actions/download-artifact@v3 + with: + name: extension-artifacts + + - name: Install the extension + shell: bash -l {0} + run: | + set -eux + cp ./jupytercad_core/dist/jupytercad*.whl ./jupytercad_lab/dist/jupytercad*.whl ./jupytercad_app/dist/jupytercad*.whl . + python -m pip install jupytercad*.whl + + - name: Install dependencies + shell: bash -l {0} + working-directory: ui-tests + env: + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + run: jlpm install + + - name: Set up browser cache + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/pw-browsers + key: ${{ runner.os }}-${{ hashFiles('ui-tests/yarn.lock') }} + + - name: Install browser + shell: bash -l {0} + run: npx playwright install chromium + working-directory: ui-tests + + - name: Execute integration tests + shell: bash -l {0} + working-directory: ui-tests + run: | + npx playwright test + + - name: Upload Playwright Test report + if: always() + uses: actions/upload-artifact@v3 + with: + name: jupytercad-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@v3 + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 + + build-lite: + name: Build JupyterLite + needs: integration-tests + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + micromamba-version: '1.5.5-0' + environment-name: build-env + create-args: >- + python=3.10 + pip + jupyterlite-core>=0.2.0,<0.3.0 + jupyterlite-xeus>=0.1.2,<0.2 + + - name: Download extension package + uses: actions/download-artifact@v3 + with: + name: extension-artifacts + + - name: Install the extension + shell: bash -l {0} + run: | + set -eux + cp ./jupytercad_core/dist/jupytercad*.whl ./jupytercad_lab/dist/jupytercad*.whl ./jupytercad_app/dist/jupytercad*.whl . + python -m pip install jupytercad*.whl + + - name: Build the lite site + shell: bash -l {0} + working-directory: lite + run: | + set -eux + mkdir -p content && cp ../examples/test.jcad ./content + jupyter lite build --contents content --output-dir dist + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./lite/dist + + deploy: + needs: build-lite + if: github.ref == 'refs/heads/main' + permissions: + pages: write + id-token: write + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml new file mode 100644 index 00000000..187beb4d --- /dev/null +++ b/.github/workflows/check-release.yml @@ -0,0 +1,37 @@ +name: Check Release +on: + push: + branches: ['main'] + pull_request: + branches: ['*'] + +jobs: + check_release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: cad + create-args: >- + python=3.9 + jupyterlab=4 + yarn=3 + pip + jupyter-releaser + + - name: Check Release + uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + version_spec: next + shell: bash -l {0} + + - name: Upload Distributions + uses: actions/upload-artifact@v3 + with: + name: jupytercad-releaser-dist-${{ github.run_number }} + path: .jupyter_releaser_checkout/dist diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml new file mode 100644 index 00000000..354a0468 --- /dev/null +++ b/.github/workflows/enforce-labels.yml @@ -0,0 +1,11 @@ +name: Enforce PR label + +on: + pull_request: + types: [labeled, unlabeled, opened, edited, synchronize] +jobs: + enforce-label: + runs-on: ubuntu-latest + 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 new file mode 100644 index 00000000..2ab42761 --- /dev/null +++ b/.github/workflows/prep-release.yml @@ -0,0 +1,42 @@ +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 }} + target: ${{ github.event.inputs.target }} + 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 new file mode 100644 index 00000000..8913a3ee --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,61 @@ +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 + steps: + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: cad + create-args: >- + python=3.9 + jupyterlab=4.0.12 + yarn=3 + + - name: Populate Release + id: populate-release + uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2 + with: + token: ${{ secrets.ADMIN_GITHUB_TOKEN }} + target: ${{ github.event.inputs.target }} + 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: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + PYPI_TOKEN_MAP: ${{ secrets.PYPI_TOKEN_MAP }} + TWINE_USERNAME: __token__ + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + uses: jupyter-server/jupyter-releaser/.github/actions/finalize-release@v2 + with: + token: ${{ secrets.ADMIN_GITHUB_TOKEN }} + target: ${{ github.event.inputs.target }} + 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_galata_references.yaml b/.github/workflows/update_galata_references.yaml new file mode 100644 index 00000000..290fcd01 --- /dev/null +++ b/.github/workflows/update_galata_references.yaml @@ -0,0 +1,74 @@ +name: Update Galata References + +on: + issue_comment: + types: [created, edited] + +permissions: + contents: write + pull-requests: write + +defaults: + run: + shell: bash -l {0} + +jobs: + update-reference-screenshots: + name: Update Galata References + if: ${{ github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots') }} + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure git to use https + run: git config --global hub.protocol https + + - name: Install hub + run: sudo apt-get update && sudo apt-get install -y hub + + - name: Checkout the branch from the PR that triggered the job + run: hub pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Download extension package + uses: dawidd6/action-download-artifact@v2 + with: + pr: ${{github.event.issue.number}} + workflow: 'build.yml' + workflow_conclusion: '' + name: extension-artifacts + + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: cad + create-args: >- + python=3.9 + jupyterlab=4 + pythonocc-core=7.7.0 + + - name: Install the extension + shell: bash -l {0} + run: | + whereis python + cp ./jupytercad_core/dist/jupytercad*.whl ./jupytercad_lab/dist/jupytercad*.whl ./jupytercad_app/dist/jupytercad*.whl . + python -m pip install jupytercad*.whl + + - name: Install dependencies + shell: bash -l {0} + working-directory: ui-tests + env: + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + run: jlpm install + + - uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@main + with: + npm_client: jlpm + github_token: ${{ secrets.GITHUB_TOKEN }} + start_server_script: 'null' + test_folder: ui-tests