From fb55c146f4388fe1233174c280ccc16fdd54c056 Mon Sep 17 00:00:00 2001 From: Adam Wiggins Date: Sat, 4 Jun 2011 15:02:49 -0700 Subject: [PATCH] repo -> codebase, rework content, diagram --- content/abstract.md | 6 +++--- content/codebase.md | 18 ++++++++++++++++++ content/repo.md | 11 ----------- content/toc.md | 4 ++-- content/who.md | 2 +- public/images/codebase-deploys.png | Bin 0 -> 24937 bytes public/{ => images}/symbol.png | Bin public/style.css | 10 ++++++++-- views/layout.erb | 2 +- web.rb | 2 +- 10 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 content/codebase.md delete mode 100644 content/repo.md create mode 100644 public/images/codebase-deploys.png rename public/{ => images}/symbol.png (100%) diff --git a/content/abstract.md b/content/abstract.md index 0e6d163..fc8752c 100644 --- a/content/abstract.md +++ b/content/abstract.md @@ -1,12 +1,12 @@ Abtract ======= -Modern software is almost always delivered as a service: called *web apps*, or *software-as-a-service*. The twelve-factor app is a methodology for building software-as-a-service apps that: +Today, software is almost always delivered as a service: called *web apps*, or *software-as-a-service*. The twelve-factor app is a methodology for building software-as-a-service apps that: -* Use **declarative** formats for setup **automation**, to minimize time and cost of a new developer joining the project; +* Use **declarative** formats for setup **automation**, to minimize time and cost for new developers joining the project; * Have a **clean contract** with the underlying operating system, offering **maximum portability** between execution environments; * Are suitable for **deployment** on modern **cloud platforms**, obviating the need for servers and systems administration; -* **Minimize divergence** between development and production, **enabling continuous** deployment for maximum agility; +* **Minimize divergence** between development and production, enabling **continuous deployment** for maximum agility; * And can **scale up** without significant changes to tooling, architecture, or development practices. The twelve-factor methodology can be applied to apps written in any programming language, and which use any combination of backing services (database, queue, memory cache, etc). diff --git a/content/codebase.md b/content/codebase.md new file mode 100644 index 0000000..d68b33a --- /dev/null +++ b/content/codebase.md @@ -0,0 +1,18 @@ +## I. Codebase +### One codebase tracked in revision control, many deploys + +A twelve-factor app is always tracked in a version control system, such as [Git](http://git-scm.com/), [Mercurial](http://mercurial.selenic.com/), or [Subversion](http://subversion.apache.org/). An copy of the revision tracking database is known as a *code repository*, often shortened to *code repo* or just *repo*. + +A *codebase* is any single repo (in a centralized revision control system like Subversion), or any set of repos who share a root commit (in a decentralized revision control system like Git). + +![One codebase maps to many deploys](/images/codebase-deploys.png) + +There is always a one-to-one correlation between the codebase and the app: + +* If there are multiple codebases, it's not an app - it's a distributed system. Each component in a distributed system is an app, and each can individually comply with twelve-factor. +* Multiple apps sharing the same code is a violation of twelve-factor. The solution for that case is to factor shared code into libraries which can be included through the [dependency manager](/dependencies). + +There is only one codebase per app, but there will be many deploys of the app. A *deploy* is a running instance of the app. This is typically a production site, and one or more staging sites. Additionally, every developer has a copy of the app running in their local development environment, each of which also qualifies as a deploy. + +The codebase is the same across all deploys, although different versions may be active in each deploy. For example, a developer has some commits not yet deployed to staging; staging has some commits not yet deployed to production. But they all share the same codebase, thus making them identifiable as different versions of the same app + diff --git a/content/repo.md b/content/repo.md deleted file mode 100644 index 021ec47..0000000 --- a/content/repo.md +++ /dev/null @@ -1,11 +0,0 @@ -## I. Repo -### One code repo, many deploys - -A twelve-factor app is always tracked in a version control system, with the tracked code history known as a *code reposistory*, often shortened to *code repo* or just *repo*. - -There is always a one-to-one correlation between the repo and the app. If there are multiple code repos, it's not an app - it's a distributed system. Multiple apps sharing the same code is a violation of twelve-factor and generally poor practice. In the latter case, the better approach is to factor shared code libraries which can be included through the [dependency manager](#). - -There is only one repo per app, but there will be many deploys of the app. A *deploy* is a running instance of the app. This is typically one production site, and one or more staging sites. Every developer working on the app has their own local version which also qualifies as a deploy, though one visible only to that developer and only useful for editing the app's code. - -The repo is the same across all deploys, although different versions may be active in each deploy. For example, a developer has some commits not yet deployed to staging; staging has some commits not yet deployed to production. But they all share the same revision history tree. - diff --git a/content/toc.md b/content/toc.md index 172d1cd..f9e4501 100644 --- a/content/toc.md +++ b/content/toc.md @@ -1,8 +1,8 @@ The Twelve Factors ================== -## [I. Repo](/repo) -### One code repo, many deploys +## [I. Codebase](/codebase) +### One codebase tracked in revision control, many deploys ## [II. Dependencies](/dependencies) ### Explicit dependency declaration and isolation diff --git a/content/who.md b/content/who.md index fbaf615..a4c938a 100644 --- a/content/who.md +++ b/content/who.md @@ -1,4 +1,4 @@ Who should read this document? ============================== -Any developer building applications run as a service, and ops engineers who deploy or run such applications. +Any developer building applications run as a service. Ops engineers who deploy or run such applications. diff --git a/public/images/codebase-deploys.png b/public/images/codebase-deploys.png new file mode 100644 index 0000000000000000000000000000000000000000..98e4815724c34fc9ab2d184e1747aaf4ac043856 GIT binary patch literal 24937 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
- +

The Twelve-Factor App

diff --git a/web.rb b/web.rb index 4c13cc2..3111507 100644 --- a/web.rb +++ b/web.rb @@ -5,7 +5,7 @@ get '/' do erb :home end -TOC = %w(repo dependencies config backing-services build-release-run processes port-binding concurrency dev-prod-parity logs admin-processes) +TOC = %w(codebase dependencies config backing-services build-release-run processes port-binding concurrency dev-prod-parity logs admin-processes) get '/:factor' do |factor| @factor = factor