E2E #58
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E | |
| # Runs the plugin against the real latest Hermes image, driven by a mock LLM | |
| # and a mock Opik — fully self-contained (no real keys, the agent has no | |
| # internet). The daily cron catches new Hermes releases that break the plugin, | |
| # same intent as the OpenClaw integration's scheduled E2E. | |
| on: | |
| pull_request: | |
| paths: | |
| - "observability/**" | |
| - "e2e/**" | |
| - ".github/workflows/e2e.yml" | |
| - "pyproject.toml" | |
| push: | |
| branches: [main] | |
| paths: | |
| - "observability/**" | |
| - "e2e/**" | |
| - ".github/workflows/e2e.yml" | |
| schedule: | |
| - cron: "17 6 * * *" # daily ~06:17 UTC — catch Hermes `latest` drift | |
| workflow_dispatch: | |
| inputs: | |
| hermes_image: | |
| description: "Hermes image to test against" | |
| default: "nousresearch/hermes-agent:latest" | |
| permissions: | |
| contents: read | |
| jobs: | |
| e2e: | |
| name: E2E against latest Hermes | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Run mock E2E | |
| env: | |
| HERMES_IMAGE: ${{ inputs.hermes_image || 'nousresearch/hermes-agent:latest' }} | |
| run: bash e2e/run_e2e.sh | |
| - name: Upload journal on failure | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: opik-e2e-journal | |
| path: /tmp/opik-e2e-journal.jsonl | |
| if-no-files-found: ignore | |
| # Heavier variant: real Hermes container + real Opik backend (its own compose | |
| # stack — mysql/redis/clickhouse/minio/backend, no host ports) with the trace | |
| # asserted via the real REST API. LLM is still mocked (no cost/keys). Runs on | |
| # every PR (and push/cron/dispatch) for full real-Hermes + real-Opik coverage; | |
| # it's slower than the mock E2E (stands up ~6 Opik services), hence its own | |
| # job + a longer timeout, and it does not block the fast mock signal. | |
| e2e-real-opik: | |
| name: E2E against real Opik | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Run real-Opik E2E | |
| env: | |
| HERMES_IMAGE: ${{ inputs.hermes_image || 'nousresearch/hermes-agent:latest' }} | |
| run: bash e2e/run_e2e_real_opik.sh | |
| # PIP-INSTALL path: build the wheel from source, `pip install` it into Hermes, | |
| # and drive a turn — so the plugin is discovered via its hermes_agent.plugins | |
| # ENTRY POINT (no plugin directory copied in). The mock E2E above covers the | |
| # directory-install path; both install methods are supported, so both are | |
| # tested. This is the path that would have caught the entry-point-resolves-to- | |
| # a-function regression (opik_hermes:register vs opik_hermes). | |
| e2e-pip-wheel: | |
| name: E2E via pip (entry point) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.12" | |
| - name: Run pip/wheel E2E | |
| env: | |
| HERMES_IMAGE: ${{ inputs.hermes_image || 'nousresearch/hermes-agent:latest' }} | |
| run: bash e2e/run_e2e_wheel.sh | |
| - name: Upload journal on failure | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: opik-e2e-wheel-journal | |
| path: /tmp/opik-e2e-wheel-journal.jsonl | |
| if-no-files-found: ignore |