{"id":20951392,"url":"https://github.com/lgug2z/call-me","last_synced_at":"2026-05-19T11:43:54.132Z","repository":{"id":104319115,"uuid":"192046049","full_name":"LGUG2Z/call-me","owner":"LGUG2Z","description":"A ci-agnostic orchestrator for triggering tests on a shared environment pool across multiple pipelines","archived":false,"fork":false,"pushed_at":"2019-06-23T07:00:33.000Z","size":29,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-01T09:09:23.300Z","etag":null,"topics":["ci","continuous-integration","golang","testing"],"latest_commit_sha":null,"homepage":"","language":"Go","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/LGUG2Z.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}},"created_at":"2019-06-15T06:40:15.000Z","updated_at":"2024-01-23T09:47:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"fa968637-80cc-4fbe-b3f5-ef26edd77ea4","html_url":"https://github.com/LGUG2Z/call-me","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LGUG2Z/call-me","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGUG2Z%2Fcall-me","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGUG2Z%2Fcall-me/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGUG2Z%2Fcall-me/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGUG2Z%2Fcall-me/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LGUG2Z","download_url":"https://codeload.github.com/LGUG2Z/call-me/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGUG2Z%2Fcall-me/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33214695,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-19T07:54:09.561Z","status":"ssl_error","status_checked_at":"2026-05-19T07:54:08.508Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ci","continuous-integration","golang","testing"],"created_at":"2024-11-19T00:58:39.134Z","updated_at":"2026-05-19T11:43:54.102Z","avatar_url":"https://github.com/LGUG2Z.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Call Me\nA ci-agnostic orchestrator for triggering tests on a shared environment pool across multiple pipelines.\n\n# Background\nAt a certain scale, user acceptance and integration tests need to be run against live environments that are\neither mirrors of a production environment or scaled down mirrors of a production environment. Scheduling\nthese tests can become complicated when they need to be triggered from multiple pipelines and repositories:\n\n`Push to Repo A -\u003e Deploy to Test Environment -\u003e Run Tests`\n\n`Push to Repo B -\u003e Deploy to Test Environment -\u003e Run Tests`\n\nIf the push to `Repo B` triggers a deployment and test run while the test run for `Repo A` is still in progress,\nthere is a high likelihood that this will produce side effects on the tests running for `Repo A` and produce\ninaccurate results and false-failures.\n\nIf an unique test environment takes a short time to provision and destroy after every test, this would be\nthe preferred way to handle such scenarios, but if the environment provisioning takes longer than is acceptable\nand is significantly detrimental to the development feedback loop, pre-provisioned environments become the\nmore attractive alternative.\n\nPre-provisioned environments can be managed at a small scale with manual triggers and a bit of discipline, but\nthis usually can't be maintained as the development team and number of repositories or projects grows.\n\n# API Overview\n`call-me` provides a RESTful API for managing slots and locks on pre-provisioned testing environments. Under the\nhood, `call-me` uses [bbolt](https://github.com/etcd-io/bbolt) as a fast and reliable key/value store that is\noptimised for read-intensive workloads As `bbolt` uses an exclusive write lock on the database, this nicely\nhandles the potential problem of multiple concurrent updates.\n\n`call-me` exposes the following routes:\n## `/maybe`\n### `GET`\nChecks if a slot on the desired environment is free.\n\nIf the slot is free:\n```bash\ncurl -I -X GET 'http://call.me/maybe?environment=uat' -H 'X-API-KEY: E-MO-TION'\n\nHTTP/1.1 200 OK\nDate: Sun, 16 Jun 2019 19:29:16 GMT\nContent-Length: 0\n```\n\nIf the slot is locked:\n```bash\ncurl -I -X GET 'http://call.me/maybe?environment=uat' -H 'X-API-KEY: E-MO-TION'\n\nHTTP/1.1 403 Forbidden\nDate: Sun, 16 Jun 2019 19:31:16 GMT\nContent-Length: 0\n```\n### `POST`\nRequests a slot on the desired environment.\n\nIf the slot is free and given to the requester:\n```bash\ncurl -I -X POST 'http://call.me/maybe?environment=uat' -H 'X-API-KEY: E-MO-TION'\n\nHTTP/1.1 201 Created\nDate: Sun, 16 Jun 2019 19:29:44 GMT\nContent-Length: 0\n```\n\nIf the slot is locked at the time of the request:\n```bash\ncurl -I -X POST 'http://call.me/maybe?environment=uat' -H 'X-API-KEY: E-MO-TION'\n\nHTTP/1.1 403 Forbidden\nDate: Sun, 16 Jun 2019 19:33:14 GMT\nContent-Length: 0\n```\n\n### `DELETE`\nReleases a slot on the specified environment.\n\nGet the latest manifest for a specific hostname.\n```bash\ncurl -I -X POST 'http://call.me/maybe?environment=uat' -H 'X-API-KEY: E-MO-TION'\n\nHTTP/1.1 204 No Content\nDate: Sun, 16 Jun 2019 19:35:39 GMT\n```\n\n# Server\nThe server takes two environment variables as configuration:\n* `PORT`\n* `API_KEY`\n\n```bash\n# docker\ndocker build -t call-me .\ndocker run -e PORT=8000 -e API_KEY=crj -p 8000:8000 call-me\n\n# binary\nGO111MODULE=on go install ./cmd/call-me-server\nPORT=8000 API_KEY=crj call-me-server\n```\n\n# Client\nThe client requires two environment variables:\n* `HOST`\n* `API_KEY`\n\n```\nGO111MODULE=on go install ./cmd/call-me-client\n\nexport HOST=call-me-server:8000\nexport API_KEY=crj\n```\n\nRequest a free slot:\n```\n# request a free slot\ncall-me-client request uat\n\nacquired slot for environment: uat\nwaited 57.134996ms\n```\n\nWait until a request is free and then lock the slot:\n```\ncall-me-client request uat\n\nwaiting for free slot on environment: uat\nwaiting for free slot on environment: uat\nacquired slot for environment: uat\nwaited 10.089027168s\n```\n\nRelease a slot when finished:\n\n```\ncall-me-client release uat\n\nslot has been freed for environment: uat\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgug2z%2Fcall-me","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flgug2z%2Fcall-me","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgug2z%2Fcall-me/lists"}