{"id":50907006,"url":"https://github.com/omnetpp/opp_ci","last_synced_at":"2026-06-16T06:03:28.692Z","repository":{"id":356014879,"uuid":"1230653484","full_name":"omnetpp/opp_ci","owner":"omnetpp","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-11T13:43:12.000Z","size":2276,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T14:18:32.763Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/omnetpp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-06T07:38:13.000Z","updated_at":"2026-06-11T13:44:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/omnetpp/opp_ci","commit_stats":null,"previous_names":["omnetpp/opp_ci"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/omnetpp/opp_ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omnetpp%2Fopp_ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omnetpp%2Fopp_ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omnetpp%2Fopp_ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omnetpp%2Fopp_ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/omnetpp","download_url":"https://codeload.github.com/omnetpp/opp_ci/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/omnetpp%2Fopp_ci/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34393302,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-16T06:03:24.222Z","updated_at":"2026-06-16T06:03:28.680Z","avatar_url":"https://github.com/omnetpp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# opp_ci\n\nContinuous integration and testing service for [OMNeT++](https://omnetpp.org)\nsimulation projects (OMNeT++ is a discrete-event network simulator). Tests any\nproject in the [opp_env](https://github.com/omnetpp/opp_env) catalog — OMNeT++,\nINET, Simu5G, Veins, and 60+ others — across version, platform, and feature\nmatrices.\n\n## The three-tool stack\n\nopp_ci is the orchestration layer of a three-tool stack. The boundary is\nstrict: opp_ci never duplicates test logic, and opp_repl never owns the\nenvironment.\n\n| Tool | Role |\n|---|---|\n| **opp_env** | Installs and manages versions of simulation projects in isolated Nix environments. Provides the project catalog, version list, and dependency graph. |\n| **opp_repl** | Runs the tests (smoke, fingerprint, statistical, feature, …) inside the environment set up by `opp_env`. |\n| **opp_ci** | The orchestrator: expands test matrices, schedules jobs, invokes `opp_env` and `opp_repl`, stores results, integrates with GitHub. No test logic of its own. |\n\nSee [Concepts](doc/concepts.md) for the full vocabulary and how the pieces\nconnect.\n\n## Why opp_ci over per-project GitHub Actions\n\nHistorically each project (omnetpp, inet, simu5g, …) ran its own hand-rolled\nGitHub Actions workflows, which couple to fixed dependency versions, duplicate\nenvironment setup, can't easily test cross-version combinations, and don't\npreserve history. opp_ci decouples versions via matrix configs, reuses one\n`opp_env` build across multiple tests, stores every run in Postgres for\ntrend/regression queries, and supports self-hosted workers (needed for speed\ntests with hardware perf counters). See the [full comparison](doc/concepts.md#what-opp_ci-improves-over-per-project-github-actions).\n\n## Key Features\n\n- **Multi-project testing** — any project supported by `opp_env`\n- **Version matrices** — test across multiple OMNeT++/INET/model versions with automatic dependency resolution\n- **Platform matrices** — OS, compiler type/version, build mode (debug/release)\n- **Reproducible builds** — `opp_env` provides isolated Nix environments\n- **Test execution** — delegates to `opp_repl` for smoke, fingerprint, statistical, feature, and other tests\n- **Result storage** — PostgreSQL database for structured querying and historical tracking\n- **GitHub integration** — webhook-driven testing on push/PR, status checks\n- **Web dashboard** — browse results, start tests, compare runs\n- **Remote workers and remote CLI control** — distributed execution on self-hosted or cloud machines, plus full coordinator control from your laptop via `opp_ci --remote`\n\n## Related Projects\n\n- [opp_env](https://github.com/omnetpp/opp_env) — reproducible OMNeT++ environment management via Nix\n- [opp_repl](https://github.com/omnetpp/opp_repl) — interactive Python REPL for running and testing OMNeT++ simulations\n\n## Documentation\n\nStart here:\n\n- [Concepts](doc/concepts.md) — opp_env / opp_repl / opp_ci roles, vocabulary, matrices\n- [Operational Questions](doc/operational_questions.md) — is a release ready? do dependents work? do we support a new OS/compiler? what's the state of every project?\n- [Getting Started](doc/getting_started.md) — installation and first run\n- [CLI Reference](doc/cli_reference.md) — command-line interface\n- [Configuration](doc/configuration.md) — environment variables\n- [Troubleshooting](doc/troubleshooting.md) — common first-run problems\n\nDay-to-day:\n\n- [Web UI](doc/web_ui.md) — dashboard, run detail, multi-dimensional results search\n- [Deployment](doc/deployment.md) — local, cloud, hybrid\n- [systemd service](doc/systemd.md) — run as a service on Ubuntu\n- [launchd service](doc/launchd.md) — run a worker as a service on macOS\n- [Workers](doc/workers.md) — register and run remote workers\n- [Remote CLI control](doc/remote_cli.md) — drive the coordinator from your laptop with `opp_ci --remote`\n- [GitHub integration](doc/github_integration.md) — webhooks, statuses, rules\n- [Git notes](doc/git_notes.md) — per-commit CI summaries delivered via `git fetch`\n- [Python client](doc/python_client.md) — programmatic API access\n\nReference (deep dive):\n\n- [Test Matrix Dimensions](doc/test_matrix_dimensions.md) — every matrix axis in detail\n- [Single Test Parameters](doc/single_test_parameters.md) — every field on a single test run\n\nFor developers:\n\n- [Architecture](doc/architecture.md) — components, schema, execution flow\n- [Data Model](doc/data_model.md) — every database table and column\n- [REST API](doc/rest_api.md) — endpoints and authentication\n\n## License\n\nLGPL-3.0-or-later","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomnetpp%2Fopp_ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fomnetpp%2Fopp_ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fomnetpp%2Fopp_ci/lists"}