{"id":19423557,"url":"https://github.com/johankson/tinyappcenterclown","last_synced_at":"2026-05-07T19:04:29.802Z","repository":{"id":149032620,"uuid":"136817313","full_name":"johankson/TinyAppCenterClown","owner":"johankson","description":" An appcenter branch configuration tool that listens to github via githooks.","archived":false,"fork":false,"pushed_at":"2018-06-10T20:06:29.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-07T18:55:35.693Z","etag":null,"topics":["appcenter","github","xamarin"],"latest_commit_sha":null,"homepage":"","language":"C#","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/johankson.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":"2018-06-10T14:46:15.000Z","updated_at":"2018-06-11T08:43:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6ec53cf-517c-4f08-93f0-702de74bb5c2","html_url":"https://github.com/johankson/TinyAppCenterClown","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johankson%2FTinyAppCenterClown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johankson%2FTinyAppCenterClown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johankson%2FTinyAppCenterClown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johankson%2FTinyAppCenterClown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johankson","download_url":"https://codeload.github.com/johankson/TinyAppCenterClown/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240603587,"owners_count":19827723,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["appcenter","github","xamarin"],"created_at":"2024-11-10T13:39:50.910Z","updated_at":"2026-05-07T19:04:24.753Z","avatar_url":"https://github.com/johankson.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TinyAppCenterClown (TACC)\n\nAn appcenter branch configuration tool that listens to github via githooks.\n\n## What does it do?\n\nIt's a website/code thingy that you can connect to github via a githook that listens for new branches after a certain pattern. After a new branch is detected it configures it in AppCenter for you.\n\n## Features\n\n* Multiple projects within a single installation\n\n\n## Status\n\nConceptual - no code is written yet! :D\n\n## Roadmap\n\n1. iOS builds\n2. The rest\n\n## Detailed explanation\n\nFirst you need to configure some base branches that will be the template for the configuration. These are known as Branch templates.\n\n### Project\n\nA project is a grouping of several routes. They are totally isolated from each other.\n\n\n\n\n### Branch templates\n\nUsually you have the **master** that will be the template for release builds and a **develop** that will be the for a development build.\n\nThese to branches are defined in TinyAppCenterClown as branch templates\n\n| id | name | basedOnBranch  | certificatePassword | \n| ---|------| ---------------| --------------------| \n| develop-template        | Development template | develop|  ducksRus |\n| release-template        | Release template | master | magicUnicorns |\n\n### Build routes\n\nA build route is a naming filter that you apply to the name of the incoming created branch and what branch template you want to match it to. If the filter match and there is no branch already configures in appcenter, it will configure it for you.\n\n| id | name | filter  | branchTemplate | \n| ---|------| ---------------| --------------------| \n|    | feature-filter | feature/* | develop-template |\n|    | releaseQA-filter  | releaseQA/* | develop-template |\n|    | release-filter | release/* | release-template |\n\n## Security issues\n\nIn order for the tool to work you need to submit/configure it with the certificate passwords.\n\n## Other ideas\n\nRandom ideas.\n\n### Automatic creation of builds and branches\n\nConfigure a route to automatically create a test and release branch for you. (avoid recursion here).\n\nFor example, if you check into a release/* branch then the TinyAppCenterClown will create a releaseQA/* branch with the development template beside the original template. However it will be a little bit messy what happens after the initial create. What happens if you push something to release/*, should the releaseQA also get the same commit automatically?\n\n\n## TACC API\n\nDraft of the public API (will be replaced by a swagger link later on)\n\n### Configuration\n\n\n\n### Projects\n\n|Route|Method|Body|Description|\n|----|----|---|---|\n|```/projects```|GET|array of project-model|Gets all projects|\n|```/projects/{id}```|GET|project-model|Get a specific project|\n|```/projects```|POST|project-model|Creates a new project|\n|```/projects/{id}```|DELETE||Creates a new project|\n|```/projects/{id}```|PUT||Updates an existing project|\n\n### Webhook\n\n|Route|Method|Body|Description|\n|----|----|---|---|\n|```/projects/{id}/webhook```|POST|(github model)|Entrypoint of github webhook|\n\n### Build templates\n\n|Route|Method|Body|Description|\n|----|----|---|---|\n|```/projects/{project-id}/templates```|GET|array of template-model|Gets all build templates|\n|```/projects/{project-id}/templates}/{id}```|GET|template-model|Get a specific build template|\n|```/projects/{project-id}/templates```|POST|template-model|Creates a new project|\n|```/projects/{project-id}/templates/{id}```|DELETE||Creates a new build template|\n|```/projects/{project-id}/templates/{id}```|PUT||Updates an existing build template|\n\n### Models\n\n#### project-model\n\nDescribes one project\n\n```json\n{\n    \"id\": 1,\n    \"name\": \"My fancy app\",\n    \"appCenterToken\": \"213123\"\n}\n```\n\n#### template-model\n\nDescribes one build template\n\n```json\n{\n    \"id\": 3,\n    \"name\": \"Develop template\",\n    \"basedOnBranch\": \"develop\",\n    \"certificatePassword\": \"InvalidDonkey\"\n}\n```\n\n\n#### route-model\n\nDescribes one build route\n\n```json\n{\n    \"id\": 5,\n    \"name\": \"feature-filter\",\n    \"branchTemplate\": 3\n}\n```\n\n## TACC Services\n\n### IBuildSystemServiceFactory\n\nInterface definition for building a IBuildSystemService for a specific project.\n\n```csharp\npublic interface IBuildSystemServiceFactory\n{\n    IBuildSystemService Create(int projectId);\n}\n```\n\n### IBuildSystemService\n\nInterface definition for AppCenter (or a generic build system).\n\n```csharp\npublic interface IBuildSystemService\n{\n    bool DoesBranchExist(string branch);\n    bool IsBranchConfigured(string branch);\n    void ConfigureBranch(BranchConfiguration configuration);\n}\n```\n\n### IWebHookHandler\n\nDefinition of interface to handle incoming github requests\n\n```csharp\npublic interface IWebHookHandler\n{\n    bool Handle(WebHookRequest request);\n}\n```\n\n\n### Process\n\n1. User creates a feature branch called ```feature/takeoverworld``` and pushes the branch to origin (github).\n2. Github fires a webhook thingy to TACC.\n3. TACC handles the request through an implementation of IWebHookHandler\n4. TACC runs through the filter engine to determine if any Build Routes matches the push made.\n5. If there is a match we call AppCenter to see if that branch exists and if it's unconfigured.\n6. Configure the branch if it exists and is unconfigured.\n7. Profit!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohankson%2Ftinyappcenterclown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohankson%2Ftinyappcenterclown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohankson%2Ftinyappcenterclown/lists"}