{"id":13463713,"url":"https://github.com/redspread/spread","last_synced_at":"2025-03-25T09:31:03.720Z","repository":{"id":49156736,"uuid":"49686795","full_name":"redspread/spread","owner":"redspread","description":"Docker to Kubernetes in one command","archived":false,"fork":false,"pushed_at":"2017-12-23T16:48:03.000Z","size":3921,"stargazers_count":1836,"open_issues_count":46,"forks_count":83,"subscribers_count":50,"default_branch":"master","last_synced_at":"2024-11-15T11:01:58.870Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://coreos.com","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/redspread.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-01-15T01:25:04.000Z","updated_at":"2024-11-04T13:35:31.000Z","dependencies_parsed_at":"2022-09-16T13:52:28.683Z","dependency_job_id":null,"html_url":"https://github.com/redspread/spread","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redspread%2Fspread","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redspread%2Fspread/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redspread%2Fspread/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redspread%2Fspread/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redspread","download_url":"https://codeload.github.com/redspread/spread/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245435075,"owners_count":20614823,"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":[],"created_at":"2024-07-31T14:00:27.145Z","updated_at":"2025-03-25T09:31:00.296Z","avatar_url":"https://github.com/redspread.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"https://redspread.com/images/logo.svg\" alt=\"logo\" width= \"400\"/\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://travis-ci.org/redspread/spread\"\u003e\u003cimg alt=\"Build Status\" src=\"https://travis-ci.org/redspread/spread.svg?branch=master\" /\u003e\u003c/a\u003e \u003ca href=\"https://github.com/redspread/spread\"\u003e\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/release/redspread/spread.svg\" /\u003e\u003c/a\u003e \u003ca href=\"https://github.com/redspread/spread/blob/master/LICENSE\"\u003e\u003cimg alt=\"Hex.pm\" src=\"https://img.shields.io/hexpm/l/plug.svg\" /\u003e\u003c/a\u003e \u003ca href=\"http://godoc.org/rsprd.com/spread\"\u003e\u003cimg alt=\"GoDoc Status\" src=\"https://godoc.org/rsprd.com/spread?status.svg\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://redspread.com\"\u003eWebsite\u003c/a\u003e | \u003ca href=\"http://redspread.readme.io\"\u003eDocs\u003c/a\u003e | \u003ca href=\"http://slackin.redspread.com/\"\u003eSlack\u003c/a\u003e | \u003ca href=\"mailto:founders@redspread.com\"\u003eEmail\u003c/a\u003e | \u003ca href=\"http://twitter.com/redspread\"\u003eTwitter\u003c/a\u003e | \u003ca href=\"http://facebook.com/GetRedspread\"\u003eFacebook\u003c/a\u003e\u003c/p\u003e\n\n#Spread: Git for Kubernetes\n\n`spread` is a command line tool that makes it easy to version Kubernetes clusters, deploy to Kubernetes clusters in one command, and set up a local Kubernetes cluster (see: [localkube](https://github.com/redspread/localkube)). The project's goals are to:\n\n* Guarantee reproducible Kubernetes deployments\n* Be the fastest, simplest way to deploy Docker to production\n* Enable collaborative deployment workflows that work well for one person or an entire team\n\nSee how we versioned the cluster running our (\u003ca href=\"https://redspread.com\"\u003ewebsite\u003c/a\u003e) (and you can too!):\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://redspread.com/img/terminal.gif\" alt=\"logo\" width= \"800\"/\u003e\u003c/p\u003e\n\nSpread is under open, active development. New features will be added regularly over the next few months - explore our [roadmap](./roadmap.md) to see what will be built next and send us pull requests for any features you’d like to see added.\n\nSee our [philosophy](./philosophy.md) for more on our mission and values. \n\n##Requirements\n* Running Kubernetes cluster (\u003ca href=\"https://blog.redspread.com/2016/02/04/google-container-engine-quickstart/\"\u003eremote\u003c/a\u003e or \u003ca href=\"https://github.com/redspread/localkube\"\u003elocal\u003c/a\u003e)\n* [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)\n* [Go](https://golang.org/doc/install) (v 1.6)\n\n##Installation\n\nInstall with `go get` (-d is for download only):\n\n`go get -d rsprd.com/spread/cmd/spread`\n\nGo into the correct directory:\n\n`cd $GOPATH/src/rsprd.com/spread`\n\nIf libgit2 is not installed:\n\n`make install-libgit2`\n\nThen:\n\n`make build/spread`\n\nIf an error about libraries missing comes up, set up your library path like:\n\n`export LD_LIBRARY_PATH=/usr/local/lib:$ LD_LIBRARY_PATH`\n\nOr, if you prefer using Homebrew (OS X only): \n\n`$ brew tap redspread/spread`  \n`$ brew install spread-versioning`\n\n##Git for Kubernetes\n\nSpread versions your software environment (i.e. a Kubernetes cluster) like Git versions source code. Because Spread is built on top of libgit2, it takes advantage of Git's interface and functionality. This means after you deploy a Kubernetes object to a cluster, you can version the object by staging, commiting, and pushing it to a Spread repository. \n\nTo get started, initialize Spread and set up a local Spread repository:\n\n`spread init`\n\nHere is our suggested workflow for versioning with Spread:\n\n1. Create or edit your Kubernetes objects\n2. Deploy your objects to a local or remote Kubernetes cluster (make sure you've [set up your directory](https://github.com/redspread/spread/tree/versioning#faq) correctly): `spread deploy .`\n3. Stage an object: `spread add \u003cobjectType\u003e/\u003cobjectName\u003e`\n4. Repeat until all objects have been staged\n5. Commit your objects with a message: `spread commit -m \"commit message\"`\n6. Set up your remote repository: `spread remote (add \u003cname\u003e \u003curl\u003e | remove \u003cname\u003e | set-url \u003cname\u003e \u003curl\u003e)`\n7. Push your objects to your remote repository: `spread push \u003cremote\u003e \u003crefSpec\u003e`\n8. Go ahead and try out the other commands - anything not documented can be accessed using `spread git ...`\n\nIf you find any bugs or have any feature requests for Spread versioning, please file an issue!\n\nFor more details on Spread commands, [see our docs](https://redspread.readme.io/docs/spread-commands).\n\n##Spread Deploy Quickstart\n\nCheck out our \u003ca href=\"https://redspread.readme.io/docs/getting-started\"\u003eGetting Started Guide\u003c/a\u003e.\n\n##Localkube --\u003e Minikube\n\nSpread made it easy to set up and iterate with [Localkube](https://github.com/redspread/localkube), a local Kubernetes cluster streamlined for rapid development. We have donated Localkube code to [Minikube](https://github.com/kubernetes/minikube), the official Kubernetes local development solution. It's easy to set up a local cluster with Minikube: https://github.com/kubernetes/minikube.\n\n##What's been done so far\n \n* Spread versioning\n* `spread deploy [-s] PATH [kubectl context]`: Deploys a Docker project to a Kubernetes cluster. It completes the following order of operations:\n\t* Reads context of directory and builds Kubernetes deployment hierarchy.\n\t* Updates all Kubernetes objects on a Kubernetes cluster.\n\t* Returns a public IP address, if type Load Balancer is specified. \n* [localkube](https://github.com/redspread/localkube): easy-to-setup local Kubernetes cluster for rapid development\n* [Initial tutorial](https://redspread.readme.io/v0.1.6/docs/spread-templating-and-tutorials) for templating and parameterization\n\n##What's being worked on now\n\n* Template authoring\n* Secret management with Spread versioning\n* Inner-app linking\n* [Redspread](redspread.com) (hosted Spread repository)\n\nSee more of our \u003ca href=\"https://github.com/redspread/spread/blob/master/roadmap.md\"\u003eroadmap\u003c/a\u003e here!\n\n##Future Goals\n* Peer-to-peer syncing between local and remote Kubernetes clusters\n* Automatically spin up local and remote Kubernetes clusters with minimal user input\n\n##FAQ\n\n**How are clusters selected?** Remote clusters are selected from the current kubectl context. Later, we will add functionality to explicitly state kubectl arguments. \n\n**How should I set up my directory?** In order to take advantage of Spread's one-command deploy feature, `spread deploy`, you'll need to set up your directory with a few specific naming conventions:\n\n* All `ReplicationController` and `Pod` files should go in the root directory\n* Any `ReplicationController` files should end in `.rc.yaml` or `.rc.json`, depending on the respective file extension\n* Any `Pod` files should end in `.pod.yaml` or `.pod.json`, depending on the respective file extension\n* All other Kubernetes object files should go in a directory named `rs`\n\nThere is no limit to the number of `ReplicationController`s or `Pod`s in the root directory.\n\nHere is an example directory with Spread's naming conventions:\n\n```Dockerfile\napp.rc.yaml\ndatabase.rc.yaml\nrs\n |_\n    service.yaml\n    secret.yaml\n ```\n \n **Why version objects instead of just files?** The object is the deterministic representation of state in Kubernetes. A useful analogy is \"Kubernetes objects\" are to \"Docker images\" like \"Kubernetes object files\" are to \"Dockerfiles\". By versioning the object itself, we can guarantee a 1:1 mapping with the Kubernetes cluster. This allows us to do things like diff two clusters and introduces future potential for linking between objects and repositories. \n\n##Contributing\n\nWe'd love to see your contributions - please see the CONTRIBUTING file for guidelines on how to contribute.\n\n##Reporting bugs\nIf you haven't already, it's worth going through \u003ca href=\"http://fantasai.inkedblade.net/style/talks/filing-good-bugs/\"\u003eElika Etemad's guide\u003c/a\u003e for good bug reporting. In one sentence, good bug reports should be both *reproducible* and *specific*.\n\n##Contact\nTeam: \u003ca href=\"mailto:hello@redspread.com\"\u003ehello@redspread.com\u003c/a\u003e   \nSlack: \u003ca href=\"http://slackin.redspread.com\"\u003eslackin.redspread.com\u003c/a\u003e  \nPlanning: \u003ca href=\"https://github.com/redspread/spread/blob/master/roadmap.md\"\u003eRoadmap\u003c/a\u003e  \nBugs: \u003ca href=\"https://github.com/redspread/spread/issues\"\u003eIssues\u003c/a\u003e\n\n##License\nSpread is under the [Apache 2.0 license](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)). See the LICENSE file for details.\n","funding_links":[],"categories":["Tools","Go","Configuration Management"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredspread%2Fspread","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredspread%2Fspread","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredspread%2Fspread/lists"}