Skip to content

Commit

Permalink
Merge pull request #302 from bondezbond/master
Browse files Browse the repository at this point in the history
AWSParameterStore - Support Global Parameters
  • Loading branch information
codezninja committed Sep 24, 2020
2 parents 1958836 + 84d5cfc commit f80fbe1
Show file tree
Hide file tree
Showing 4 changed files with 333 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

* [Issue #303](https://github.com/manheim/terraform-pipeline/issues/303) Update ValidateFormatPlugin Documentation - additional options command
* [Issue #300](https://github.com/manheim/terraform-pipeline/issues/300) Trim whitespace when detecting terraform version from file.
* [Issue #299](https://github.com/manheim/terraform-pipeline/issues/299) Support for Global AWS Parameter Store

# v5.11

Expand Down
31 changes: 31 additions & 0 deletions docs/ParameterStoreBuildWrapperPlugin.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,34 @@ validate.then(deployQA)
.then(deployProd)
.build()
```


You can also optionally support Global Parameters applied to the following stages `VALIDATE`, `PLAN`, `APPLY`


```
// Jenkinsfile
@Library(['terraform-pipeline@v5.0']) _
Jenkinsfile.init(this)
ParameterStoreBuildWrapperPlugin.withGlobalParameter('/somePath/') // get all keys under `/somePath/`
.withGlobalParameter('/someOtherPath/', [naming: 'relative', recursive: true]) // get all keys recursively under `/someOtherPath/`
.init() // Enable ParameterStoreBuildWrapperPlugin
def validate = new TerraformValidateStage()
// Inject all parameters in /<GitOrg>/<GitRepo>/qa
def deployQA = new TerraformEnvironmentStage('qa')
// Inject all parameters in /<GitOrg>/<GitRepo>/uat
def deployUat = new TerraformEnvironmentStage('uat')
// Inject all parameters in /<GitOrg>/<GitRepo>/prod
def deployProd = new TerraformEnvironmentStage('prod')
validate.then(deployQA)
.then(deployUat)
.then(deployProd)
.build()
```
56 changes: 44 additions & 12 deletions src/ParameterStoreBuildWrapperPlugin.groovy
Original file line number Diff line number Diff line change
@@ -1,46 +1,77 @@
import static TerraformValidateStage.ALL
import static TerraformEnvironmentStage.PLAN
import static TerraformEnvironmentStage.APPLY

class ParameterStoreBuildWrapperPlugin implements TerraformEnvironmentStagePlugin {
class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin, TerraformEnvironmentStagePlugin {
private static globalPathPattern
private static List globalParameterOptions = []
private static defaultPathPattern = { options -> "/${options['organization']}/${options['repoName']}/${options['environment']}/" }

public static void init() {
TerraformEnvironmentStage.addPlugin(new ParameterStoreBuildWrapperPlugin())
TerraformValidateStage.addPlugin(new ParameterStoreBuildWrapperPlugin())
}

public static withPathPattern(Closure newPathPattern) {
globalPathPattern = newPathPattern
return this
}

public static withGlobalParameter(String path, Map options = [:]) {
globalParameterOptions << [path: path] + options
return this
}

@Override
public void apply(TerraformValidateStage stage) {
globalParameterOptions.each { gp ->
stage.decorate(ALL, addParameterStoreBuildWrapper(gp))
}
}

@Override
public void apply(TerraformEnvironmentStage stage) {
def environment = stage.getEnvironment()
def parameterStorePath = pathForEnvironment(environment)
List options = getParameterOptions(environment)

options.each { option ->
stage.decorate(PLAN, addParameterStoreBuildWrapper(option))
stage.decorate(APPLY, addParameterStoreBuildWrapper(option))
}
}

List getParameterOptions(String environment) {
List options = []
options.add(getEnvironmentParameterOptions(environment))
options.addAll(getGlobalParameterOptions())

return options
}

List getGlobalParameterOptions() {
return globalParameterOptions
}

def options = [
path: parameterStorePath,
Map getEnvironmentParameterOptions(String environment) {
return [
path: pathForEnvironment(environment),
credentialsId: "${environment.toUpperCase()}_PARAMETER_STORE_ACCESS"
]

stage.decorate(PLAN, addParameterStoreBuildWrapper(options))
stage.decorate(APPLY, addParameterStoreBuildWrapper(options))
}

String pathForEnvironment(String environment) {
String organization = Jenkinsfile.instance.getOrganization()
String repoName = Jenkinsfile.instance.getRepoName()
def patternOptions = [ environment: environment,
repoName: repoName,
organization: organization ]
String repoName = Jenkinsfile.instance.getRepoName()
def patternOptions = [ environment: environment,
repoName: repoName,
organization: organization ]

def pathPattern = globalPathPattern ?: defaultPathPattern

return pathPattern(patternOptions)
}

public static Closure addParameterStoreBuildWrapper(Map options = []) {
public Closure addParameterStoreBuildWrapper(Map options = [:]) {
def Map defaultOptions = [
naming: 'basename'
]
Expand All @@ -56,5 +87,6 @@ class ParameterStoreBuildWrapperPlugin implements TerraformEnvironmentStagePlugi

public static reset() {
globalPathPattern = null
globalParameterOptions = []
}
}
Loading

0 comments on commit f80fbe1

Please sign in to comment.