{"id":16068003,"url":"https://github.com/ged/assemblage","last_synced_at":"2025-09-03T02:07:43.422Z","repository":{"id":65987987,"uuid":"125134518","full_name":"ged/assemblage","owner":"ged","description":"Git mirror of the Assemblage continuous integration toolkit","archived":false,"fork":false,"pushed_at":"2018-06-05T17:48:00.000Z","size":102,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-05T10:13:59.434Z","etag":null,"topics":["continuous-integration","distributed","git","mercurial","ruby"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ged.png","metadata":{"files":{"readme":"README.md","changelog":"History.md","contributing":null,"funding":null,"license":"LICENSE.txt","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-03-14T00:58:17.000Z","updated_at":"2024-01-05T14:57:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"f6a9f2ff-9a42-4d04-9f14-127a264f9647","html_url":"https://github.com/ged/assemblage","commit_stats":{"total_commits":10,"total_committers":1,"mean_commits":10.0,"dds":0.0,"last_synced_commit":"8b50d2e02d43d730a8af5e9d631274deceeb9917"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ged/assemblage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ged%2Fassemblage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ged%2Fassemblage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ged%2Fassemblage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ged%2Fassemblage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ged","download_url":"https://codeload.github.com/ged/assemblage/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ged%2Fassemblage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273377153,"owners_count":25094528,"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","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"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":["continuous-integration","distributed","git","mercurial","ruby"],"created_at":"2024-10-09T06:07:46.327Z","updated_at":"2025-09-03T02:07:43.399Z","avatar_url":"https://github.com/ged.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Assemblage\n\nA continuous integration toolkit.\n\nhome\n: https://assembla.ge/\n\ncode\n: https://bitbucket.org/sascrotch/assemblage\n\ngithub\n: https://github.com/ged/assemblage\n\ndocs\n: http://assembla.ge/docs/assemblage\n\n\n## Description\n\nAssemblage is a continuous integration library. It's intended to provide you\nwith a minimal toolkit for distributing and performing automated tasks\nfor one or more version control repositories. It makes as few assumptions as\npossible as to what those tasks might be.\n\nA task in Assemblage is called an Assembly. Assemblage has three primary parts for manipulating Assemblies: the **Assembly Server**, **Assembly\nWorkers**, and **Repositories**.\n\n\u003cdl\u003e\n  \u003cdt\u003eAssembly Server\u003c/dt\u003e\n  \u003cdd\u003eAggregates and distributes events from \u003cem\u003erepositories\u003c/em\u003e to\n  \u003cem\u003eworkers\u003c/em\u003e via one or more \"assemblies\".\u003c/dd\u003e\n\n  \u003cdt\u003eAssembly Workers\u003c/dt\u003e\n  \u003cdd\u003eListens for events published by the \u003cem\u003eassembly server\u003c/em\u003e, checks out\n  a \u003cem\u003erepository\u003c/em\u003e, and runs an assembly script in that repository.\u003c/dd\u003e\n\n  \u003cdt\u003eRepository\u003c/dt\u003e\n  \u003cdd\u003eA distributed version control repository. Assemblage currently supports\n  Mercurial and Git.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n## Prerequisites\n\n* Ruby\n* libzmq \u003e= 4.2.3 (with drafts enabled)\n* czmq \u003e= 4.1.0 (with drafts enabled)\n* A DVCS; Assemblage currently supports Mercurial and Git.\n\n\n## Installation\n\nThis example uses three different hosts for the three parts, but you can, of\ncourse, run all of this on a single host.\n\nYou'll first need a server to manage your assemblies:\n\n    example $ sudo gem install assemblage\n    example $ assemblage create server /usr/local/assemblage\n    Creating a server run directory in /usr/local/assemblage...\n    Generating a server key...\n    Creating the assemblies database...\n    done.\n\n    You can start the assembly server like so:\n      assemblage -c /usr/local/assemblage/config.yml start server\n    \n    Server public key is:\n      \u0026}T0.[{MZSJC]roN-{]x2QCkG+dXki!6j!.1JU1u\n\n    example $ assemblage -c /usr/local/assemblage/config.yml start server\n    Starting assembly server at:\n      tcp://example.com:7872\n\nNow (possibly on a different host) you can create a new worker installation.\nWorkers have a name and a list of tags that describe its capabilities, e.g.,\nthe OS it's running on, installed software, etc. Our example is running on\nFreeBSD 11, and has Ruby 2.4, Ruby 2.5, Python 2.7, ZeroMQ, and the PostgreSQL\nclient libraries available. We'll use a pretty simple tag convention but you\ncan make it as simple or complex as you want.\n\n    user@example-client $ sudo gem install assemblage\n    user@example-client $ mkdir -p /usr/local/assemblage\n    user@example-client $ cd /usr/local/assemblage\n    user@example-client $ assemblage create worker \\\n      -t freebsd,freebsd11,ruby,ruby24,ruby25,python,python27,zeromq,libpq worker1\n    Creating a new assembly worker run directory in\n      /usr/local/assemblage/worker1...\n    Set up with worker name: example-client-worker1\n    Client public key is:\n      PJL=qK@SHy3#re-w@W)4C]Aj+aD}toGf*Y*SOOZ4\n    done.\n\nNow we need to register the client with the server. On the server host:\n\n    user@example $ assemblage add worker example-client-worker1 \\\n      \"PJL=qK@SHy3#re-w@W)4C]Aj+aD}toGf*Y*SOOZ4\"\n    Approving connections from example-client-worker1...\n    done.\n\nNow go back to the worker and tell it that it should talk to the new server we\njust set up:\n\n    user@example-client $ cd /usr/local/assemblage/worker1\n    user@example-client $ assemblage add server \\\n      tcp://example.com:7872 \"\u0026}T0.[{MZSJC]roN-{]x2QCkG+dXki!6j!.1JU1u\"\n    Talking to tcp://example.com:7872...\n    Testing registration... success.\n    done.\n\nNow you can start the worker, which will listen for jobs it can work on.\n\n    user@example-client $ cd /usr/local/assemblage/worker1\n    user@example-client $ assemblage start worker\n    Starting assembly worker `worker1`...\n    Connecting to assembly servers...\n       example... done.\n    Waiting for jobs...\n\nNow we need our repositories to notify the assembly server when events occur.\nWe'll hook up a Mercurial repo for a Ruby library so that it runs unit tests\nwhenever there's a new commit. First we'll install assemblage on the repo\nserver and create a run directory for repo operations:\n\n    user@example-repo $ sudo gem install assemblage hglib\n    user@example-repo $ mkdir /usr/local/hg/repos/.assemblage\n    user@example-repo $ cd /usr/local/hg/repos/.assemblage\n    user@example-repo $ assemblage create repo project1\n    Creating a new assemblage repo run directory in\n      /usr/local/hg/repos/.assemblage...\n    Set up with repo name: project1\n    Client public key is:\n      bq9VheQbLtcu]LGK4I\u0026xzK3^UW0Iyak/6\u003cYS=^$w\n    done.\n\nNow we'll need to register the repo on the server like we did before for the\nworker:\n\n    user@example $ assemblage add repo project1 http://repo.example.com/project1\n    Looking for repo registration... found.\n    Approving repo events from http://repo.example.com/project1...\n    done.\n\nWe'll add a hook to the repository's .hg/hgrc that looks like:\n\n    [hooks]\n    incoming.assemblage = /usr/local/bin/assemblage send-event commit \\\n      project1 $HG_NODE\n\nAnd finally, we'll combine all the parts into an assembly called\n`project1-freebsd-tests` that will run on a worker with the `freebsd`, `ruby`,\nand `libpq` tags for each commit to the repo at\n`http://repo.example.com/project1`:\n\n    user@example $ assemblage add -t freebsd,ruby,libpq \\\n      http://repo.example.com/project1\n\nNow when commits arrive at our repo, it will send events to the assembly server, which will queue up an assembly. Because the worker we added has all of the required tags, it will:\n\n- get a notification of the commit\n- clone the repository checked out to that commit\n- look for an assembly script called `commit` in a directory called `.assemblies/` (by default)\n- if it finds one, it will run the script from the cloned repo\n- it will then send back any files contained in the `.assemblies/` subdirectory with the SHA of the commit (if it exists) along with the exit code of the script.\n\n\n\n## Contributing\n\nYou can check out the current development source with Mercurial via\n[Bitbucket](http://bitbucket.org/sascrotch/assemblage). Or if you prefer Git,\nvia [its Github mirror](https://github.com/ged/assemblage).\n\nAfter checking out the source, run:\n\n    $ rake newb\n\nThis task will install any missing dependencies, run the tests/specs,\nand generate the API documentation.\n\n\n## License\n\nCopyright (c) 2018, Michael Granger\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice,\n  this list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the author/s, nor the names of the project's\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fged%2Fassemblage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fged%2Fassemblage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fged%2Fassemblage/lists"}