diff --git a/.gitignore b/.gitignore index fef243e72..0c4bda95d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ atlantis .vscode atlantis.db output +website/src/public +.DS_Store diff --git a/README.md b/README.md index b29a5e5be..9adffac98 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ ## Walkthrough Video [![Atlantis Walkthrough](./docs/atlantis-walkthrough-icon.png)](https://www.youtube.com/watch?v=TmIPWda0IKg) +Read about [Why We Built Atlantis](https://www.atlantis.run/blog/atlantis-release/) + [![CircleCI](https://circleci.com/gh/hootsuite/atlantis/tree/master.svg?style=shield&circle-token=08bf5b34233b0e168a9dd73e01cafdcf7dc4bf16)](https://circleci.com/gh/hootsuite/atlantis/tree/master) [![SuperDopeBadge](https://img.shields.io/badge/Hightower-extra%20dope-b9f2ff.svg)](https://twitter.com/kelseyhightower/status/893260922222813184) [![Slack Status](https://thawing-headland-22460.herokuapp.com/badge.svg)](https://thawing-headland-22460.herokuapp.com) diff --git a/website/src/config.toml b/website/src/config.toml index eb48dcf13..ef4eed9a7 100644 --- a/website/src/config.toml +++ b/website/src/config.toml @@ -7,7 +7,7 @@ Paginate = 4 [[menu.main]] name = "Docs" weight = -100 - url = "/docs/" + url = "https://github.com/hootsuite/atlantis#getting-started" [[menu.main]] name = "Blog" weight = -100 @@ -15,7 +15,7 @@ Paginate = 4 [[menu.main]] name = "FAQ" weight = -100 - url = "/faq/" + url = "https://github.com/hootsuite/atlantis#faq" [[menu.main]] name = "Demo" weight = 100 diff --git a/website/src/content/blog/atlantis-release.md b/website/src/content/blog/atlantis-release.md new file mode 100644 index 000000000..40b7c8aeb --- /dev/null +++ b/website/src/content/blog/atlantis-release.md @@ -0,0 +1,100 @@ ++++ +title = "Atlantis: A Unified Workflow For Collaborating On Terraform" +description = "Why we built Atlantis and how it's enabled us to more effectively collaborate on Terraform" +weight = 20 +date = "2017-09-11T21:56:55-07:00" +draft = false +toc = true ++++ + +We're very excited to announce the [open source](https://github.com/hootsuite/atlantis) release of Atlantis! Atlantis is a tool for collaborating on Terraform that's been in use at [Hootsuite](https://hootsuite.com) for over a year. The core functionality of Atlantis enables developers and operators to run `terraform plan` and `apply` directly from Terraform pull requests. Atlantis then comments back on the pull request with the output of the commands: + + + +This is a simple feature, however it has had a massive effect on how our team writes Terraform. By bringing a Terraform workflow to pull requests, Atlantis helped our Ops team collaborate better on Terraform and also enabled our entire development team to write and execute Terraform safely. + +Atlantis was built to solve two problems that arose at Hootsuite as we adopted Terraform: + +
+
+ Collaborate +

1. Effective Collaboration

+

What's the best way to collaborate on Terraform in a team setting?

+
+
+ No need to distribute credentials +

2. Developers Writing Terraform

+

How can we enable our developers to write and apply Terraform safely?

+
+
+ +## Effective Collaboration + +When writing Terraform, there are a number of workflows you can follow. The simplest workflow is just using `master`: + +

+ +

+ +In this workflow, you work on `master` and run `terraform` locally. The problem with this workflow is that there is no collaboration or code review. So we start to use pull requests: + + + +We still run `terraform plan` locally, but once we're satisfied with the changes we create a pull request for review. When the pull request is approved, we run `apply` locally. + +This workflow is an improvement, but there are still problems. The first problem is that it's hard to review just the diff on the pull request. To properly review a change, you really need to see the output from `terraform plan`. + +{{< figure src="/img/diff.png" caption="What looks like a small change..." >}} + +{{< figure src="/img/diff-output.png" caption="...can have a big plan" >}} + +The second problem is that now it's easy for `master` to get out of sync with what's actually been applied. This can happen if you merge a pull request without running `apply` or if the `apply` has an error halfway through, you forget to fix it and then you merge to master. Now what's in `master` isn't actually what's running on production. At best, this causes confusion the next time someone runs `terraform plan`. At worst, it causes an outage when someone assumes that what's in master is actually running, and depends on it. + +With the Atlantis workflow, these problems are solved: + + + +Now it's easy to review changes because you see the `terraform plan` output on the pull request. + +{{< figure src="/img/comment.png" caption="Pull requests are easy to review since you can see the plan" >}} + +It's also easy to ensure that the pull request is `terraform apply`'d before merging to master because you can see the actual `apply` output on the pull request. + +{{< figure src="/img/apply-comment.png">}} + +So, Atlantis makes working on Terraform within an operations team much easier, but how does it help with getting your whole team to write Terraform? + +## Developers Writing Terraform + +Terraform usually starts out being used by the Ops team. As a result of using Terraform, the Ops team becomes much faster at making infrastructure changes, but the way developers request those changes remains the same: they use a ticketing system or chat to ask operations for help, the request goes into a queue and later Ops responds that the task is complete. + +Soon however, the Ops team starts to realize that it's possible for developers to make some of these Terraform changes themselves! There are some problems that arise though: + +* Developers don't have the credentials to actually run Terraform commands +* If you give them credentials, it's hard to review what is actually being applied + +With Atlantis, these problems are solved. All `terraform plan` and `apply` commands are run from the pull request. This means developers don't need to have any credentials to run Terraform locally. Of course, this can be dangerous: how can you ensure developers (who might be new to Terraform) aren't applying things they shouldn't? The answer is code reviews and approvals. + +Since Atlantis comments back with the `plan` output directly on the pull request, it's easy for an operations engineer to review exactly what changes will be applied. And Atlantis can run in `require-approval` mode, that will require a GitHub pull request approval before allowing `apply` to be run: + + + +With Atlantis, developers are able to write and apply Terraform safely. They submit pull requests, can run `atlantis plan` until their change looks good and then get approval from Ops to `apply`. + +Since the introduction of Atlantis at Hootsuite, we've had **78** contributors to our Terraform repositories, **58** of whom are developers (**75%**). + +## Where we are now + +Since the introduction of Atlantis at Hootsuite we've grown to 144 Terraform repositories[^1] that manage thousands of Amazon resources. Atlantis is used for every single Terraform change throughout our organization. + +## Getting started with Atlantis +If you'd like to try out Atlantis for your team you can download the latest release from https://github.com/hootsuite/atlantis/releases. If you run `atlantis bootstrap` you can get started in less than 5 minutes. +To read more about Atlantis go to https://github.com/hootsuite/atlantis. + +Check out our video for more information: +{{< youtube TmIPWda0IKg >}} + +[^1]: We split our Terraform up into multiple states, each with its own repository (see [1](https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa), [2](https://charity.wtf/2016/03/30/terraform-vpc-and-why-you-want-a-tfstate-file-per-env/), [3](https://www.nclouds.com/blog/terraform-multi-state-management/)). + +Icons made by Prosymbols and Freepik from www.flaticon.com are licensed by CC 3.0 BY + diff --git a/website/src/content/blog/welcome.md b/website/src/content/blog/welcome.md deleted file mode 100644 index 79d64bbff..000000000 --- a/website/src/content/blog/welcome.md +++ /dev/null @@ -1,14 +0,0 @@ -+++ -date = "2017-03-02T21:56:55+01:00" -title = "Welcome to Atlantis" -tags = ["markdown","example"] -categories = ["general"] -draft = false -description = "First blog post!" -weight = 10 -+++ - -# Welcome to Atlantis - This is the first post from us! - - - diff --git a/website/src/static/img/apply-comment.png b/website/src/static/img/apply-comment.png new file mode 100644 index 000000000..b4c030ae7 Binary files /dev/null and b/website/src/static/img/apply-comment.png differ diff --git a/website/src/static/img/approval-needed.png b/website/src/static/img/approval-needed.png new file mode 100644 index 000000000..aa08275c2 Binary files /dev/null and b/website/src/static/img/approval-needed.png differ diff --git a/website/src/static/img/atlantis-flow.png b/website/src/static/img/atlantis-flow.png new file mode 100644 index 000000000..e163e421e Binary files /dev/null and b/website/src/static/img/atlantis-flow.png differ diff --git a/website/src/static/img/atlantis-highquality.png b/website/src/static/img/atlantis-highquality.png new file mode 100644 index 000000000..4fab9dd96 Binary files /dev/null and b/website/src/static/img/atlantis-highquality.png differ diff --git a/website/src/static/img/comment.png b/website/src/static/img/comment.png new file mode 100644 index 000000000..f2d4af3a5 Binary files /dev/null and b/website/src/static/img/comment.png differ diff --git a/website/src/static/img/demo-large.gif b/website/src/static/img/demo-large.gif new file mode 100644 index 000000000..9e6bedb23 Binary files /dev/null and b/website/src/static/img/demo-large.gif differ diff --git a/website/src/static/img/demo.gif b/website/src/static/img/demo.gif new file mode 100644 index 000000000..8f8f2a4d4 Binary files /dev/null and b/website/src/static/img/demo.gif differ diff --git a/website/src/static/img/diff-output.png b/website/src/static/img/diff-output.png new file mode 100644 index 000000000..85c134747 Binary files /dev/null and b/website/src/static/img/diff-output.png differ diff --git a/website/src/static/img/diff.png b/website/src/static/img/diff.png new file mode 100644 index 000000000..3d1a70fcf Binary files /dev/null and b/website/src/static/img/diff.png differ diff --git a/website/src/static/img/master-flow.png b/website/src/static/img/master-flow.png new file mode 100644 index 000000000..235af6c07 Binary files /dev/null and b/website/src/static/img/master-flow.png differ diff --git a/website/src/static/img/pull-request-flow.png b/website/src/static/img/pull-request-flow.png new file mode 100644 index 000000000..25d90ff41 Binary files /dev/null and b/website/src/static/img/pull-request-flow.png differ diff --git a/website/src/themes/kube/layouts/_default/list.html b/website/src/themes/kube/layouts/_default/list.html index 3adede7fb..f15478198 100644 --- a/website/src/themes/kube/layouts/_default/list.html +++ b/website/src/themes/kube/layouts/_default/list.html @@ -5,7 +5,6 @@

Blog

-

Coming soon....