{"id":18186032,"url":"https://github.com/cpg1111/maestro","last_synced_at":"2025-10-15T06:14:32.980Z","repository":{"id":57522788,"uuid":"56472432","full_name":"cpg1111/maestro","owner":"cpg1111","description":"Faster CI/CD for multi-artifact projects","archived":false,"fork":false,"pushed_at":"2017-05-21T21:38:33.000Z","size":149,"stargazers_count":13,"open_issues_count":5,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-01T21:48:36.383Z","etag":null,"topics":["build-automation","build-pipelines","builder","continuous-delivery","continuous-deployment","continuous-integration","maestro"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cpg1111.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-04-18T02:58:47.000Z","updated_at":"2020-06-15T22:46:14.000Z","dependencies_parsed_at":"2022-08-28T08:11:40.053Z","dependency_job_id":null,"html_url":"https://github.com/cpg1111/maestro","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/cpg1111/maestro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg1111%2Fmaestro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg1111%2Fmaestro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg1111%2Fmaestro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg1111%2Fmaestro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cpg1111","download_url":"https://codeload.github.com/cpg1111/maestro/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cpg1111%2Fmaestro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279057534,"owners_count":26094839,"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-10-15T02:00:07.814Z","response_time":56,"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":["build-automation","build-pipelines","builder","continuous-delivery","continuous-deployment","continuous-integration","maestro"],"created_at":"2024-11-02T23:04:32.016Z","updated_at":"2025-10-15T06:14:32.949Z","avatar_url":"https://github.com/cpg1111.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# maestro\nDeploy only what's changed for your multiple services in mono-repos\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/cpg1111/maestro)](https://goreportcard.com/report/github.com/cpg1111/maestro) [![Code Climate](https://codeclimate.com/github/cpg1111/maestro/badges/gpa.svg)](https://codeclimate.com/github/cpg1111/maestro)\n\n## How it Works\n\nMaestro pulls a given repository then builds a dependency graph based on a given config file.\nOnce the dependency graph is created, Maestro diffs against a given previous commit, with the pathspec being the root directory for each artifact.\nMaestro then flags only the changed artifacts for the pipeline, which are then ran concurrently per teir of dependencies, therefore siblings in the graph will build, test and deploy concurrently, but parents and children dependencies will always be built in the correct order.\n\nUsed with [Maestrod](https://github.com/cpg1111/maestrod) you can have a build manager that integrates with Github webhooks and runs on Kubernetes or a single-host Docker setup.\n\nFor more details see this talk: https://www.youtube.com/watch?v=dGM8mYj8nz4\u0026feature=youtu.be\n\n## Install\n\n```\n    git clone git@github.com:cpg1111/maestro\n    cd maestro\n    make docker\n```\n\nor\n\n```\n    docker pull cpg1111/maestro:\u003crelease\u003e\n```\n\n## Test\n\n```\n    go test ./...\n```\n\n## Run\n\n```\n    Usage of maestro:\n      --branch string\n            Git branch to checkout for project (default \"master\")\n      --clone-path string\n            Local path to clone repo to defaults to PWD (default \"./\")\n      --config string\n            Path to the config for maestro to use (default \"./conf.toml\")\n      --deploy\n            Whether or not to deploy this build                             # defaults to false\n      --prev-commit string\n            Previous commit to compare to                                   # required\n```\n\n```\n    maestro --branch \u003cgit branch to build\u003e --conf \u003cproject config\u003e --prev-commit \u003ccommit to compare to\u003e --deploy \u003cwhether to deploy build or not\u003e --clone-path \u003ctmp path to clone repo into\u003e\n```\n\nor\n\n```\n    docker run -v \u003cpath of conf\u003e:\u003ctarget\u003e -v \u003cpath to ssh credentials if using ssh for git\u003e:\u003ctarget\u003e maestro --branch \u003cgit branch to build\u003e --conf \u003cproject config\u003e --prev-commit \u003ccommit to compare to\u003e --deploy \u003cwhether to deploy build or not\u003e --clone-path \u003ctmp path to clone repo into\u003e\n```\n\n## Example Config\n\n```\n    [Environment] # Environment will run before anything else, ExecSync will execute commands in the array synchronously, while exec will execute them concurrently\n    Env=[\"node_env:test\", \"docker_tls_verify:1\"] # set environment variables all lowercase keys and keys are separated from values with ':'\n    ExecSync=[\"apt-get install -y docker node go\"]\n    Exec=[\"docker pull someOrg/logger\", \"docker pull someOrg/models\", \"docker pull someOrg/auth\", \"docker pull someOrg/client\"]\n\n    [Project]\n    RepoURL=\"git@github.com:someOrg/someRepo.git\"\n    CloneCMD=\"git clone\"\n    AuthType=\"SSH\"\n    SSHPrivKeyPath=\"~/.ssh/id_rsa\"\n    SSHPubKeyPath=\"~/.ssh/id_rsa.pub\"\n    Username=\"git\" # github's ssh user is git, but this can vary\n    Password=\"\"\n    PromptForPWD=false # when requiring a password, you prompt for a password\n\n    [[Services]] # Services are either actual services or libraries / packages / separately compiled objects\n    Name=\"logger\"\n    Tag=\"0.1.0\"\n    TagType=\"git\"\n    Path=\"./src/logger\"\n    BuildCMD=[\"docker build -t logger .\"] # '.' is relative to the given path field of the service\n    TestCMD=[\"go test ./...\"]\n    CheckCMD=[\"bash -c 'docker images -a | grep logger'\"]\n    CreateCMD=[\n        \"docker tag logger \u003corg\u003e/logger:{{.Curr}}\",\n        \"docker push \u003corg\u003e/logger:{{.Curr}}\"\n    ]\n    UpdateCMD=[\n        \"docker tag logger \u003corg\u003e/logger:{{.Curr}}\",  # {{.Curr}} will template the current commit hash into the command\n        \"docker push \u003corg\u003e/logger:{{.Curr}}\"\n    ]\n    DependsOn=[]\n\n    [[Services]]\n    Name=\"models\"\n    Tag=\"0.1.0\"\n    TagType=\"git\"\n    Path=\"./src/models\"\n    BuildCMD=[\"docker build -t models .\"]\n    TestCMD=[\"go test ./...\"]\n    CheckCMD=[\"bash -c 'docker images -a | grep models'\"]\n    CreateCMD=[\n        \"docker tag models \u003corg\u003e/models:{{.Curr}}\",\n        \"docker push \u003corg\u003e/models:{{.Curr}}\"\n    ]\n    UpdateCMD=[\n        \"docker tag models \u003corg\u003e/models:{{.Curr}}\",\n        \"docker push \u003corg\u003e/models:{{.Curr}}\"\n    ]\n    DependsOn=[\"logger\"] # Assume Dockerfile contains FROM logger\n\n    [[Services]]\n    Name=\"auth\"\n    Tag=\"0.1.0\"\n    TagType=\"git\"\n    Path=\"./src/auth\"\n    BuildCMD=[\"docker build -t auth .\"]\n    TestCMD=[\"go test ./...\"]\n    CheckCMD=[\"bash -c 'docker ps -a | grep auth'\"]\n    CreateCMD=[\n        \"docker tag auth \u003corg\u003e/auth:{{.Curr}}\",\n        \"docker tag auth \u003corg\u003e/auth:{{.Curr}}\",\n        \"docker run --rm -d \u003corg\u003e/auth:{{.Curr}}\"\n    ]\n    UpdateCMD=[\n        \"docker tag auth \u003corg\u003e/auth:{{.Curr}}\",\n        \"docker tag auth \u003corg\u003e/auth:{{.Curr}}\",\n        \"docker run --rm -d \u003corg\u003e/auth:{{.Curr}}\"\n    ]\n    DependsOn=[\"models\"] # Assume Dockerfile contains FROM models\n\n    [[Services]]\n    Name=\"client\"\n    Tag=\"0.1.0\"\n    TagType=\"git\"\n    Path=\"./src/client\"\n    BuildCMD=[\"docker build -t client .\"]\n    TestCMD=[\"npm test\"]\n    CheckCMD=[\"bash -c 'docker ps -a | grep client'\"]\n    CreateCMD=[\n        \"docker tag client \u003corg\u003e/client:{{.Curr}}\",\n        \"docker push \u003corg\u003e/client:{{.Curr}}\",\n        \"docker run --rm -d \u003corg\u003e/client:{{.Curr}}\"\n    ]\n    UpdateCMD=[\n        \"docker tag client \u003corg\u003e/client:{{.Curr}}\",\n        \"docker push \u003corg\u003e/client:{{.Curr}}\",\n        \"docker run --rm -d \u003corg\u003e/client:{{.Curr}}\"\n    ]\n    DependsOn=[]\n\n    [CleanUp]\n    AdditionalCMDs=[\"docker inspect auth\", \"docker export -o ./dist/auth.tgz auth\"] # Will execute synchronously\n    InDaemon=false # COMING SOON for maestrod\n        [[CleanUp.Artifacts]] # Artifacts are saved concurrently\n        RuntimeFilePath=\"./dist/auth.tgz\"\n        SaveFilePath=\"/opt/data/auth.tgz\"\n```\n\n## Roadmap\n\n- Allow larger log buffers\n- More possible dependency structures\n- Encrypted Environment variable values\n- Log Versbosity control\n- Debug with bash session\n\n### Daemon\nSee [this](https://github.com/cpg1111/maestrod) (https://github.com/cpg1111/maestrod) for a manager daemon for handling git push hooks and multiple concurrent builds and repos.\n\n### Warning\n\nSome dependency structures are not supported yet.  Best to refer to immediate dependencies only and avoid circlular references.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcpg1111%2Fmaestro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcpg1111%2Fmaestro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcpg1111%2Fmaestro/lists"}