From 16e3882ab886f6aeda425945db40db0935a2bec1 Mon Sep 17 00:00:00 2001 From: Ben Gamble Date: Sat, 25 Jul 2026 22:58:16 +0100 Subject: [PATCH] AGS-22: add CI that builds and tests every language surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this the only automation was the two PyPI publish jobs. Nothing compiled Java, ran pytest, go test, or clojure -X:test — which is why AGS-9 (a compile error leaving the whole JVM tree unbuildable) sat unnoticed. Four parallel jobs: jvm Java 21. jagentic-core -> agentic-flink -> 6 ports -> agentic-pekko -> tool-services -> a2a-gateway -> banking-job. Ordering is manual because there is no reactor (AGS-10); jagentic-core is an unpublished hard dependency so it must be installed first. Uploads surefire reports on failure. go go vet + go test over ports/go. clojure clojure -X:test over agentic-clj. python pyagentic + the port adapter suite. Also fixes two things CI immediately surfaced: - ports/pyagentic declared no PyYAML, so test_cep_weave failed on any clean machine (1 failed / 87 passed). Added to the test extra; now 88 pass. - ports/tests hard-failed without Celery rather than skipping, so the job installs it — the adapter tests then run for real in eager mode, no broker. And corrects the publish workflows + python/pyproject URLs, which still pointed at the pre-rename Agentic-Flink repo. Flags that the PyPI trusted publisher must be re-registered against Agentic-Streaming, since PyPI matches the OIDC repository claim exactly (AGS-30). Verified locally on JDK 21 with ~/.m2/repository/org/{jagentic,agentic} purged, running the exact step sequence: 922 tests green across 13 JVM modules, go vet clean + 6/6 packages, 64 Clojure tests, 88 pyagentic + 7 adapter tests. Spotless is deliberately not a gate yet: spotless:check fails on code already in main, and `apply` is bound to the default lifecycle so builds rewrite sources. Flipping it to `check` needs a repo-wide format commit first. Co-Authored-By: Claude --- .github/workflows/ci.yml | 155 +++++++++++++++++++++++++ .github/workflows/publish-pypi.yml | 6 +- .github/workflows/publish-testpypi.yml | 5 +- ports/pyagentic/pyproject.toml | 4 +- python/pyproject.toml | 8 +- 5 files changed, 171 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..8bc3b57 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,155 @@ +name: CI + +# Builds and tests every language surface in the repo. Until this existed, the +# only automation was the two PyPI publish jobs — nothing compiled Java, and a +# compile error in ports/jagentic-core (AGS-9) left the whole JVM tree +# unbuildable from a clean checkout without anyone noticing. + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + jvm: + name: JVM (Java 21) + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: maven + + # The build order below is manual because there is no Maven reactor: the + # root pom has no and every module is built by an explicit -f. + # ports/jagentic-core is a hard compile-scope dependency of the main + # module and is not published anywhere, so it has to be installed first. + # AGS-10 tracks replacing this with a real parent pom. + - name: jagentic-core (shared JVM core) + run: mvn -B -ntp -f ports/jagentic-core/pom.xml install + + # `install` rather than `test`: runs the main suite AND publishes the + # artifact that a2a-gateway and banking-job depend on. + - name: agentic-flink (main module) + run: mvn -B -ntp install + + - name: ports/kafka-streams + run: mvn -B -ntp -f ports/kafka-streams/pom.xml test + - name: ports/spring + run: mvn -B -ntp -f ports/spring/pom.xml test + - name: ports/quarkus + run: mvn -B -ntp -f ports/quarkus/pom.xml test + - name: ports/temporal + run: mvn -B -ntp -f ports/temporal/pom.xml test + - name: ports/pekko + run: mvn -B -ntp -f ports/pekko/pom.xml test + - name: ports/pulsar + run: mvn -B -ntp -f ports/pulsar/pom.xml test + + - name: agentic-pekko (actor runtime) + run: mvn -B -ntp -f agentic-pekko/pom.xml test + + - name: tool-services (packs, then app) + run: | + mvn -B -ntp -f tool-services/tool-services-packs/pom.xml install + mvn -B -ntp -f tool-services/tool-services-app/pom.xml test + + - name: a2a-gateway + run: mvn -B -ntp -f a2a-gateway/pom.xml test + + - name: banking-job (uber-jar assembly) + run: mvn -B -ntp -f banking-job/pom.xml test + + - name: Collect surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports + path: "**/target/surefire-reports/*.txt" + if-no-files-found: warn + retention-days: 7 + + go: + name: Go + runs-on: ubuntu-latest + timeout-minutes: 20 + defaults: + run: + working-directory: ports/go + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: ports/go/go.mod + cache-dependency-path: ports/go/go.sum + + - name: go vet + run: go vet ./... + + - name: go test + run: go test ./... + + clojure: + name: Clojure (Datomic runtime) + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + + - uses: DeLaGuardo/setup-clojure@13.6.1 + with: + cli: latest + + - name: Cache clojure deps + uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: clj-${{ runner.os }}-${{ hashFiles('agentic-clj/deps.edn') }} + restore-keys: clj-${{ runner.os }}- + + - name: clojure -X:test + working-directory: agentic-clj + run: clojure -X:test + + python: + name: Python (pyagentic + adapters) + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + # `celery` is needed because ports/tests exercises the Celery adapter + # against the real engine in eager mode (no broker required); without it + # two tests hard-fail rather than skipping. + - name: Install + run: | + python -m pip install --upgrade pip + python -m pip install -e "ports/pyagentic[test]" celery + + - name: pyagentic + run: python -m pytest ports/pyagentic/tests -q + + - name: port adapters + run: python -m pytest ports/tests -q diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 5ea2564..b061bee 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -3,8 +3,12 @@ name: Publish Python package to PyPI # Fires on every published GitHub Release. # Uses PyPI Trusted Publishing (OIDC) — no API tokens stored in this repo. # Configure the trusted publisher once on https://pypi.org/manage/account/publishing/ -# (project: agentic-flink, owner: Ugbot, repo: Agentic-Flink, workflow: publish-pypi.yml, +# (project: agentic-flink, owner: Ugbot, repo: Agentic-Streaming, workflow: publish-pypi.yml, # environment: pypi). +# +# NOTE: the repo was renamed Agentic-Flink -> Agentic-Streaming. PyPI matches the +# OIDC token's `repository` claim exactly, so the trusted publisher must be +# re-registered against Agentic-Streaming on pypi.org or this upload is rejected. on: release: diff --git a/.github/workflows/publish-testpypi.yml b/.github/workflows/publish-testpypi.yml index 0c0f9b7..5b8dfeb 100644 --- a/.github/workflows/publish-testpypi.yml +++ b/.github/workflows/publish-testpypi.yml @@ -2,8 +2,11 @@ name: Publish Python package to TestPyPI # Manual dispatch only — use this to rehearse a release on TestPyPI before the # real one. Trusted Publishing must be configured separately on test.pypi.org. -# (project: agentic-flink, owner: Ugbot, repo: Agentic-Flink, workflow: +# (project: agentic-flink, owner: Ugbot, repo: Agentic-Streaming, workflow: # publish-testpypi.yml, environment: testpypi). +# +# NOTE: the repo was renamed Agentic-Flink -> Agentic-Streaming; re-register the +# trusted publisher against the new name or the upload is rejected. on: workflow_dispatch: diff --git a/ports/pyagentic/pyproject.toml b/ports/pyagentic/pyproject.toml index 4f0980e..218f929 100644 --- a/ports/pyagentic/pyproject.toml +++ b/ports/pyagentic/pyproject.toml @@ -10,7 +10,9 @@ requires-python = ">=3.9" dependencies = [] [project.optional-dependencies] -test = ["pytest>=7"] +# PyYAML is needed by tests/test_cep_weave.py, which drives the sibling +# agentic-pipeline YAML loader. The library itself still has no runtime deps. +test = ["pytest>=7", "PyYAML>=6"] [tool.setuptools.packages.find] include = ["pyagentic*"] diff --git a/python/pyproject.toml b/python/pyproject.toml index 1e4a799..5582cb9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -33,10 +33,10 @@ test = ["pytest>=7"] all = ["agentic-flink[pyflink,test]"] [project.urls] -Homepage = "https://github.com/Ugbot/Agentic-Flink" -Repository = "https://github.com/Ugbot/Agentic-Flink" -Issues = "https://github.com/Ugbot/Agentic-Flink/issues" -Documentation = "https://github.com/Ugbot/Agentic-Flink/blob/main/docs/python.md" +Homepage = "https://github.com/Ugbot/Agentic-Streaming" +Repository = "https://github.com/Ugbot/Agentic-Streaming" +Issues = "https://github.com/Ugbot/Agentic-Streaming/issues" +Documentation = "https://github.com/Ugbot/Agentic-Streaming/blob/main/docs/python.md" [tool.setuptools.packages.find] where = ["."]