Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Atlantis support. Add atmos terraform generate varfiles and atmos atlantis generate repo-config CLI commands #189

Merged
merged 63 commits into from
Sep 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
bc4a527
Add custom integrations
aknysh Sep 3, 2022
e84a433
Add custom integrations
aknysh Sep 3, 2022
288355a
Add custom integrations
aknysh Sep 3, 2022
c357865
Add custom integrations
aknysh Sep 3, 2022
37f4754
Add `terraform generate varfiles` command
aknysh Sep 3, 2022
9041ff2
Add `terraform generate varfiles` command
aknysh Sep 3, 2022
ed863ab
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
2f8001c
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
0631848
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
db7327f
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
bdfdcb0
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
62d65d7
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
b486d0c
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
fe055d8
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
4b129b5
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
d2ec625
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
68aae0a
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
2388b20
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
b772ae9
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
95a91d5
Add `terraform generate varfiles` command
aknysh Sep 4, 2022
a2e106b
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
1ca13f1
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
b4554e7
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
36fe09b
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
a2c96fa
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
9627660
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
79afe08
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
39c4f5c
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
de84b98
Add `terraform generate varfiles` command
aknysh Sep 5, 2022
9d3e6f2
Add `atlantis` commands
aknysh Sep 5, 2022
bf49668
Add `atlantis generate repo-config` command
aknysh Sep 5, 2022
8b25690
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
31131a2
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
8c211d4
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
46d803d
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
03b8cae
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
8367246
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
e53f310
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
787085c
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
07a3d86
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
6596bec
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
6fb6293
Add `atlantis generate repo-config` command
aknysh Sep 6, 2022
6818e35
Update README
aknysh Sep 6, 2022
06bd935
Cleanup code
aknysh Sep 6, 2022
77956f7
Cleanup code
aknysh Sep 6, 2022
47dffc5
Updates
aknysh Sep 6, 2022
05b535f
Updates
aknysh Sep 6, 2022
746c630
Updates
aknysh Sep 6, 2022
c74b402
Updates
aknysh Sep 6, 2022
2a86800
Updates
aknysh Sep 6, 2022
a2e4c84
Updates
aknysh Sep 6, 2022
24273d5
Updates
aknysh Sep 6, 2022
917436e
Updates
aknysh Sep 6, 2022
b6ed4aa
Updates
aknysh Sep 6, 2022
067e329
Updates
aknysh Sep 6, 2022
e9d9e92
Updates
aknysh Sep 7, 2022
64f43fa
Updates
aknysh Sep 7, 2022
f7e78c8
Updates
aknysh Sep 7, 2022
8865817
Updates
aknysh Sep 7, 2022
7d2b680
Updates
aknysh Sep 7, 2022
bce0465
Updates
aknysh Sep 7, 2022
beffec9
Updates
aknysh Sep 7, 2022
6a603f4
Updates
aknysh Sep 7, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions atmos.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,66 @@ commands:
steps:
- echo Playing ping-pong...
- echo pong

# Integrations
integrations:

# Atlantis integration
# https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html
atlantis:
# Path and name of the Atlantis config file `atlantis.yaml`
# Supports absolute and relative paths
# All the intermediate folders will be created automatically (e.g. `path: /config/atlantis/atlantis.yaml`)
# Can be overridden on the command line by using `--output-path` command-line argument in `atmos atlantis generate repo-config` command
# If not specified (set to an empty string/omitted here, and set to an empty string on the command line), the content of the file will be dumped to `stdout`
# On Linux/macOS, you can also use `--output-path=/dev/stdout` to dump the content to `stdout` without setting it to an empty string in `atlantis.path`
path: "atlantis.yaml"
aknysh marked this conversation as resolved.
Show resolved Hide resolved

# Config templates
# Select a template by using the `--config-template <config_template>` command-line argument in `atmos atlantis generate repo-config` command
config_templates:
config-1:
version: 3
automerge: true
delete_source_branch_on_merge: true
parallel_plan: true
parallel_apply: true
allowed_regexp_prefixes:
- dev/
- staging/
- prod/

# Project templates
# Select a template by using the `--project-template <project_template>` command-line argument in `atmos atlantis generate repo-config` command
project_templates:
project-1:
# generate a project entry for each component in every stack
name: "{tenant}-{environment}-{stage}-{component}"
workspace: "{workspace}"
dir: "{component-path}"
terraform_version: v1.2
delete_source_branch_on_merge: true
autoplan:
enabled: true
when_modified:
- "**/*.tf"
- "varfiles/$PROJECT_NAME.tfvars.json"
apply_requirements:
- "approved"

# Workflow templates
# https://www.runatlantis.io/docs/custom-workflows.html#custom-init-plan-apply-commands
# https://www.runatlantis.io/docs/custom-workflows.html#custom-run-command
# Select a template by using the `--workflow-template <workflow_template>` command-line argument in `atmos atlantis generate repo-config` command
workflow_templates:
workflow-1:
plan:
steps:
- run: terraform init -input=false
# When using workspaces, you need to select the workspace using the $WORKSPACE environment variable
- run: terraform workspace select $WORKSPACE
# You must output the plan using `-out $PLANFILE` because Atlantis expects plans to be in a specific location
- run: terraform plan -input=false -refresh -out $PLANFILE -var-file varfiles/$PROJECT_NAME.tfvars.json
apply:
steps:
- run: terraform apply $PLANFILE
17 changes: 17 additions & 0 deletions cmd/atlantis.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package cmd

import (
"github.com/spf13/cobra"
)

// atlantisCmd executes Atlantis commands
var atlantisCmd = &cobra.Command{
Use: "atlantis",
Short: "Execute 'atlantis' commands",
Long: `This command executes Atlantis integration commands`,
FParseErrWhitelist: struct{ UnknownFlags bool }{UnknownFlags: false},
}

func init() {
RootCmd.AddCommand(atlantisCmd)
}
17 changes: 17 additions & 0 deletions cmd/atlantis_generate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package cmd

import (
"github.com/spf13/cobra"
)

// atlantisGenerateCmd generates various Atlantis configurations
var atlantisGenerateCmd = &cobra.Command{
Use: "generate",
Short: "Execute 'atlantis generate' commands",
Long: "This command generates various Atlantis configurations",
FParseErrWhitelist: struct{ UnknownFlags bool }{UnknownFlags: true},
}

func init() {
atlantisCmd.AddCommand(atlantisGenerateCmd)
}
61 changes: 61 additions & 0 deletions cmd/atlantis_generate_repo_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package cmd

import (
e "github.com/cloudposse/atmos/internal/exec"
u "github.com/cloudposse/atmos/pkg/utils"
"github.com/spf13/cobra"
)

// atlantisGenerateRepoConfigCmd generates repository configuration for Atlantis
var atlantisGenerateRepoConfigCmd = &cobra.Command{
Use: "repo-config",
Short: "Execute 'atlantis generate repo-config`",
Long: "This command generates repository configuration for Atlantis",
FParseErrWhitelist: struct{ UnknownFlags bool }{UnknownFlags: true},
Run: func(cmd *cobra.Command, args []string) {
err := e.ExecuteAtlantisGenerateRepoConfigCmd(cmd, args)
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}
},
}

func init() {
atlantisGenerateRepoConfigCmd.DisableFlagParsing = false

atlantisGenerateRepoConfigCmd.PersistentFlags().String("output-path", "", "atmos atlantis generate repo-config --output-path ./atmos.yaml --config-template config-1 --project-template project-1 --workflow-template workflow-1")
atlantisGenerateRepoConfigCmd.PersistentFlags().String("config-template", "", "atmos atlantis generate repo-config --config-template config-1 --project-template project-1 --workflow-template workflow-1")
atlantisGenerateRepoConfigCmd.PersistentFlags().String("project-template", "", "atmos atlantis generate repo-config --config-template config-1 --project-template project-1 --workflow-template workflow-1")
atlantisGenerateRepoConfigCmd.PersistentFlags().String("workflow-template", "", "atmos atlantis generate repo-config --config-template config-1 --project-template project-1 --workflow-template workflow-1")

atlantisGenerateRepoConfigCmd.PersistentFlags().String("stacks", "",
"Only generate config for the specified stacks (comma-separated values).\n"+
"atmos atlantis generate repo-config --config-template <config_template> --project-template <project_template> --stacks <stack1>,<stack2>\n"+
"The filter can contain the names of the top-level stack config files and the logical stack names (derived from the context vars)\n"+
"atmos atlantis generate repo-config --config-template <config_template> --project-template <project_template> --workflow-template <workflow_template> --stacks orgs/cp/tenant1/staging/us-east-2,orgs/cp/tenant2/dev/us-east-2\n"+
"atmos atlantis generate repo-config --config-template <config_template> --project-template <project_template> --workflow-template <workflow_template> --stacks tenant1-ue2-staging,tenant1-ue2-prod\n"+
"atmos atlantis generate repo-config --config-template <config_template> --project-template <project_template> --workflow-template <workflow_template> --stacks orgs/cp/tenant1/staging/us-east-2,tenant1-ue2-prod",
nitrocode marked this conversation as resolved.
Show resolved Hide resolved
)

atlantisGenerateRepoConfigCmd.PersistentFlags().String("components", "",
"Only generate config for the specified components (comma-separated values).\n"+
"atmos atlantis generate repo-config --config-template <config_template> --project-template <project_template> --workflow-template <workflow_template> --components <component1>,<component2>",
)

err := atlantisGenerateRepoConfigCmd.MarkPersistentFlagRequired("config-template")
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}

err = atlantisGenerateRepoConfigCmd.MarkPersistentFlagRequired("project-template")
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}

err = atlantisGenerateRepoConfigCmd.MarkPersistentFlagRequired("workflow-template")
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}

atlantisGenerateCmd.AddCommand(atlantisGenerateRepoConfigCmd)
}
59 changes: 59 additions & 0 deletions cmd/terraform_generate_varfiles.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package cmd

import (
e "github.com/cloudposse/atmos/internal/exec"
u "github.com/cloudposse/atmos/pkg/utils"
"github.com/spf13/cobra"
)

// terraformGenerateVarfilesCmd generates varfiles for all terraform components in all stacks
var terraformGenerateVarfilesCmd = &cobra.Command{
Use: "varfiles",
Short: "Execute 'terraform generate varfiles' command",
Long: `This command generates varfiles for all terraform components in all stacks`,
FParseErrWhitelist: struct{ UnknownFlags bool }{UnknownFlags: false},
Run: func(cmd *cobra.Command, args []string) {
err := e.ExecuteTerraformGenerateVarfilesCmd(cmd, args)
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}
},
}

func init() {
terraformGenerateVarfilesCmd.DisableFlagParsing = false

terraformGenerateVarfilesCmd.PersistentFlags().String("file-template", "",
"Varfile template (the file path, file name, and file extension).\n"+
"Supports absolute and relative paths.\n"+
nitrocode marked this conversation as resolved.
Show resolved Hide resolved
"Supports context tokens: {namespace}, {tenant}, {environment}, {region}, {stage}, {component}, {component-path}.\n"+
"atmos terraform generate varfiles --file-template {component-path}/{environment}-{stage}.tfvars.json\n"+
"atmos terraform generate varfiles --file-template /configs/{tenant}/{environment}/{stage}/{component}.json\n"+
"atmos terraform generate varfiles --file-template /{tenant}/{stage}/{region}/{component}.yaml\n"+
"All subfolders in the path will be created automatically.",
)

terraformGenerateVarfilesCmd.PersistentFlags().String("stacks", "",
"Only process the specified stacks (comma-separated values).\n"+
"atmos terraform generate varfiles --file-template <file_template> --stacks <stack1>,<stack2>\n"+
"The filter can contain the names of the top-level stack config files and the logical stack names (derived from the context vars)\n"+
"atmos terraform generate varfiles --stacks orgs/cp/tenant1/staging/us-east-2,orgs/cp/tenant2/dev/us-east-2\n"+
"atmos terraform generate varfiles --stacks tenant1-ue2-staging,tenant1-ue2-prod\n"+
"atmos terraform generate varfiles --stacks orgs/cp/tenant1/staging/us-east-2,tenant1-ue2-prod",
)

terraformGenerateVarfilesCmd.PersistentFlags().String("components", "",
"Only process the specified components (comma-separated values).\n"+
"atmos terraform generate varfiles --file-template <file_template> --components <component1>,<component2>",
)

terraformGenerateVarfilesCmd.PersistentFlags().String("format", "json", "Output format.\n"+
"atmos terraform generate varfiles --file-template <file_template> --format=json/yaml ('json' is default)")

err := terraformGenerateVarfilesCmd.MarkPersistentFlagRequired("file-template")
if err != nil {
u.PrintErrorToStdErrorAndExit(err)
}

terraformGenerateCmd.AddCommand(terraformGenerateVarfilesCmd)
}
2 changes: 1 addition & 1 deletion examples/complete/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
ARG GEODESIC_VERSION=1.2.3
aknysh marked this conversation as resolved.
Show resolved Hide resolved
aknysh marked this conversation as resolved.
Show resolved Hide resolved
ARG GEODESIC_OS=debian
# atmos: https://github.com/cloudposse/atmos
ARG ATMOS_VERSION=1.4.28
ARG ATMOS_VERSION=1.5.0
# Terraform: https://github.com/hashicorp/terraform/releases
ARG TF_VERSION=1.2.8

Expand Down
63 changes: 63 additions & 0 deletions examples/complete/atmos.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,66 @@ commands:
steps:
- echo Playing ping-pong...
- echo pong

# Integrations
integrations:

# Atlantis integration
# https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html
atlantis:
# Path and name of the Atlantis config file `atlantis.yaml`
# Supports absolute and relative paths
# All the intermediate folders will be created automatically (e.g. `path: /config/atlantis/atlantis.yaml`)
# Can be overridden on the command line by using `--output-path` command-line argument in `atmos atlantis generate repo-config` command
# If not specified (set to an empty string/omitted here, and set to an empty string on the command line), the content of the file will be dumped to `stdout`
# On Linux/macOS, you can also use `--output-path=/dev/stdout` to dump the content to `stdout` without setting it to an empty string in `atlantis.path`
path: "atlantis.yaml"

# Config templates
# Select a template by using the `--config-template <config_template>` command-line argument in `atmos atlantis generate repo-config` command
config_templates:
config-1:
version: 3
automerge: true
delete_source_branch_on_merge: true
parallel_plan: true
parallel_apply: true
aknysh marked this conversation as resolved.
Show resolved Hide resolved
allowed_regexp_prefixes:
nitrocode marked this conversation as resolved.
Show resolved Hide resolved
- dev/
- staging/
- prod/

# Project templates
# Select a template by using the `--project-template <project_template>` command-line argument in `atmos atlantis generate repo-config` command
project_templates:
project-1:
# generate a project entry for each component in every stack
name: "{tenant}-{environment}-{stage}-{component}"
workspace: "{workspace}"
dir: "{component-path}"
terraform_version: v1.2
delete_source_branch_on_merge: true
autoplan:
enabled: true
when_modified:
- "**/*.tf"
- "varfiles/$PROJECT_NAME.tfvars.json"
apply_requirements:
- "approved"

# Workflow templates
# https://www.runatlantis.io/docs/custom-workflows.html#custom-init-plan-apply-commands
# https://www.runatlantis.io/docs/custom-workflows.html#custom-run-command
# Select a template by using the `--workflow-template <workflow_template>` command-line argument in `atmos atlantis generate repo-config` command
workflow_templates:
workflow-1:
plan:
steps:
- run: terraform init -input=false
# When using workspaces, you need to select the workspace using the $WORKSPACE environment variable
- run: terraform workspace select $WORKSPACE
# You must output the plan using `-out $PLANFILE` because Atlantis expects plans to be in a specific location
- run: terraform plan -input=false -refresh -out $PLANFILE -var-file varfiles/$PROJECT_NAME.tfvars.json
apply:
steps:
- run: terraform apply $PLANFILE
2 changes: 1 addition & 1 deletion examples/complete/stacks/mixins/region/us-east-1.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ vars:

components:
terraform:
vpc:
infra/vpc:
aknysh marked this conversation as resolved.
Show resolved Hide resolved
vars:
availability_zones:
- us-east-1a
Expand Down
2 changes: 1 addition & 1 deletion examples/complete/stacks/mixins/region/us-east-2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ vars:

components:
terraform:
vpc:
infra/vpc:
vars:
availability_zones:
- us-east-2a
Expand Down
36 changes: 20 additions & 16 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,27 @@ require (
github.com/otiai10/copy v1.7.0
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.5.0
github.com/spf13/viper v1.12.0
github.com/spf13/viper v1.13.0
github.com/stretchr/testify v1.8.0
gopkg.in/yaml.v2 v2.4.0
)

require (
cloud.google.com/go v0.100.2 // indirect
cloud.google.com/go/compute v1.6.1 // indirect
cloud.google.com/go/iam v0.3.0 // indirect
cloud.google.com/go/storage v1.14.0 // indirect
cloud.google.com/go v0.102.1 // indirect
cloud.google.com/go/compute v1.7.0 // indirect
cloud.google.com/go/iam v0.4.0 // indirect
cloud.google.com/go/storage v1.22.1 // indirect
github.com/aws/aws-sdk-go v1.15.78 // indirect
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.8 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect
github.com/googleapis/gax-go/v2 v2.4.0 // indirect
github.com/googleapis/go-type-adapters v1.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-safetemp v1.0.0 // indirect
github.com/hashicorp/go-version v1.1.0 // indirect
Expand All @@ -44,25 +48,25 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.3.0 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/ulikunitz/xz v0.5.8 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect
golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
google.golang.org/api v0.81.0 // indirect
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
google.golang.org/api v0.93.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
google.golang.org/grpc v1.46.2 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect
google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959 // indirect
google.golang.org/grpc v1.48.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading