diff --git a/.github/workflows/v2-build-rc-demos-daily.yml b/.github/workflows/v2-build-rc-demos-daily.yml new file mode 100644 index 0000000000..ae0c17e3e4 --- /dev/null +++ b/.github/workflows/v2-build-rc-demos-daily.yml @@ -0,0 +1,116 @@ +name: Build Daily RC Demos +on: + schedule: + - cron: '0 11 * * 1-5' # Runs weekdays 6 am ET + workflow_dispatch: + push: + +jobs: + check-for-rc-branches: + runs-on: ubuntu-latest + outputs: + branch_exists: ${{ steps.check-rc-branches.outputs.branch_exists }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + repository: PennyLaneAI/pennylane + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install latest setuptools + run: | + python -m pip install --upgrade pip + pip install --upgrade setuptools packaging + + - name: Check for RC branches + id: check-rc-branches + run: | + VERSION=$(python setup.py --version) + echo "Current version: $VERSION" + IFS=. read MAJ MIN PAT <<< "${VERSION%-dev[0-9]*}" + RC_BRANCH="v${MAJ}.$((MIN-2)).${PAT}-rc0" + if git ls-remote --exit-code origin "refs/heads/$RC_BRANCH"; then + echo "branch_exists=true" >> $GITHUB_OUTPUT + echo "rc_branch=$RC_BRANCH" >> $GITHUB_OUTPUT + else + echo "branch_exists=true" >> $GITHUB_OUTPUT # TODO change to false + echo "No RC branch found." + fi + + build-demos-with-rc-branches: + runs-on: ubuntu-latest + needs: check-for-rc-branches + # if: needs.check-for-rc-branches.outputs.branch_exists == 'true' + outputs: + pennylane-version: ${{ steps.setup-rc-versions.outputs.pennylane-version }} + lightning-version: ${{ steps.setup-rc-versions.outputs.lightning-version }} + catalyst-version: ${{ steps.setup-rc-versions.outputs.catalyst-version }} + rc-build-branch: ${{ steps.setup-rc-versions.outputs.rc-build-branch }} + steps: + - name: Checkout QML repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Set up rc versions + id: setup-rc-versions + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + rc_build_branch=rc-daily-build-$(date +'%Y-%m-%d-%H%M%S') + git checkout -b $rc_build_branch + python -m pip index versions pennylane 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true + pennylane_version=$(python -m pip index versions pennylane 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true) + lightning_version=$(python -m pip index versions pennylane-lightning 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 ||true ) + catalyst_version=$(python -m pip index versions pennylane-catalyst 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true) + echo "lightning-version=$lightning_version" >> $GITHUB_OUTPUT + echo "catalyst-version=$catalyst_version" >> $GITHUB_OUTPUT + echo "pennylane-version=$pennylane_version" >> $GITHUB_OUTPUT + echo "rc-build-branch=$rc_build_branch" >> $GITHUB_OUTPUT + echo "PennyLane version: $pennylane_version, PennyLane-Lightning version: $lightning_version, PennyLane-Catalyst version: $catalyst_version" + + - name: Update demo versions + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + sed -i -E "s#git\+https://github.com/PennyLaneAI/pennylane.git\#egg=pennylane\",#pennylane<=${{ steps.setup-rc-versions.outputs.pennylane-version }}\",\\n\\t\\t\\t\"—extra-index-url\",\\n\\t\\t\\t\"https://test.pypi.org/simple/\",\\n\\t\\t\\tpre=True,#" lib/qml/lib/demo.py + sed -i "s/PennyLane-Lightning/pennylane-lightning<=${{ steps.setup-rc-versions.outputs.lightning-version }}/" lib/qml/lib/demo.py + sed -i "s/PennyLane-Catalyst/pennylane-catalyst<=${{ steps.setup-rc-versions.outputs.catalyst-version }}/" lib/qml/lib/demo.py + git commit -am "Set up RC versions for demo builds" + git push --set-upstream origin ${{ steps.setup-rc-versions.outputs.rc-build-branch }} + + build-demos: + needs: build-demos-with-rc-branches + uses: ./.github/workflows/v2-build-demos.yml + with: + ref: '${{ needs.build-demos-with-rc-branches.outputs.rc-build-branch }}' + demo-names: '' + execute: true + dev: false + save-artifact: true + artifact-name: 'demo-build-use-rc' + artifact-retention: 10 + keep-going: false + quiet: false + batch_size: 10 + + cleanup: + runs-on: ubuntu-latest + needs: + - build-demos + - build-demos-with-rc-branches + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Cleanup branch + run: | + echo "Cleaning up branch '${{ needs.build-demos-with-rc-branches.outputs.rc-build-branch }}'" + git push origin --delete '${{ needs.build-demos-with-rc-branches.outputs.rc-build-branch }}'|| true diff --git a/lib/qml/lib/demo.py b/lib/qml/lib/demo.py index d27b82909f..350b1351aa 100644 --- a/lib/qml/lib/demo.py +++ b/lib/qml/lib/demo.py @@ -15,10 +15,56 @@ import lxml.html from qml.context import Context import sphobjinv as soi +import argparse logger = getLogger("qml") +def parse_extra_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--lightning-version", + type=str, + default="PennyLane-Lightning", + help="Specify the version of PennyLane-Lightning to install (default: PennyLane-Lightning)", + nargs='?' + ) + parser.add_argument( + "--catalyst-version", + type=str, + default="PennyLane-Catalyst", + help="Specify the version of PennyLane-Catalyst to install (default: PennyLane-Catalyst)", + nargs='?' + ) + parser.add_argument( + "--pennylane-version", + type=str, + default="git+https://github.com/PennyLaneAI/pennylane.git#egg=pennylane", + help="Specify the version of PennyLane to install (default: git+https://github.com/PennyLaneAI/pennylane.git#egg=pennylane)", + nargs='?' + ) + parser.add_argument( + "--extra-index-url", + type=str, + default=None, + help="Specify an additional index URL for pip to use (default: None)", + nargs='?' + ) + parser.add_argument( + "--testpypi", + type=str, + default=None, + help="Use TestPyPI as an additional package index (default: False)", + nargs='?' + ) + parser.add_argument( + "--prerelease-packages", + type=bool, + default=False, + help="Allow installation of pre-release packages (default: False)", + nargs='?' + ) + return parser.parse_args() class BuildTarget(Enum): """Sphinx-build targets.""" @@ -296,7 +342,7 @@ def _build_demo( "--upgrade", "--extra-index-url", "https://test.pypi.org/simple/", - "PennyLane-Catalyst", + parse_extra_args().catalyst_version, use_uv=False, quiet=False, pre=True, @@ -307,7 +353,7 @@ def _build_demo( "--upgrade", "--extra-index-url", "https://test.pypi.org/simple/", - "PennyLane-Lightning", + parse_extra_args().lightning_version, use_uv=False, quiet=False, pre=True, @@ -317,9 +363,12 @@ def _build_demo( cmds.pip_install( build_venv.python, "--upgrade", - "git+https://github.com/PennyLaneAI/pennylane.git#egg=pennylane", + parse_extra_args().pennylane_version, + parse_extra_args().testpypi, + parse_extra_args().extra_index_url, use_uv=False, quiet=False, + pre=parse_extra_args().prerelease_packages, ) stage_dir = ctx.build_dir / "demonstrations"