diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..01d34b4 --- /dev/null +++ b/build.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +########################################################################## +# This is the Cake bootstrapper script for Linux and OS X. +# This file was downloaded from https://github.com/cake-build/resources +# Feel free to change this file to fit your needs. +########################################################################## + +# Define directories. +SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +TOOLS_DIR=$SCRIPT_DIR/tools +ADDINS_DIR=$TOOLS_DIR/Addins +MODULES_DIR=$TOOLS_DIR/Modules +NUGET_EXE=$TOOLS_DIR/nuget.exe +CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe +PACKAGES_CONFIG=$TOOLS_DIR/packages.config +PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum +ADDINS_PACKAGES_CONFIG=$ADDINS_DIR/packages.config +MODULES_PACKAGES_CONFIG=$MODULES_DIR/packages.config + +# Define md5sum or md5 depending on Linux/OSX +MD5_EXE= +if [[ "$(uname -s)" == "Darwin" ]]; then + MD5_EXE="md5 -r" +else + MD5_EXE="md5sum" +fi + +# Define default arguments. +SCRIPT="setup.cake" +CAKE_ARGUMENTS=() + +# Parse arguments. +for i in "$@"; do + case $1 in + -s|--script) SCRIPT="$2"; shift ;; + --) shift; CAKE_ARGUMENTS+=("$@"); break ;; + *) CAKE_ARGUMENTS+=("$1") ;; + esac + shift +done + +# Make sure the tools folder exist. +if [ ! -d "$TOOLS_DIR" ]; then + mkdir "$TOOLS_DIR" +fi + +# Make sure that packages.config exist. +if [ ! -f "$TOOLS_DIR/packages.config" ]; then + echo "Downloading packages.config..." + curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages + if [ $? -ne 0 ]; then + echo "An error occurred while downloading packages.config." + exit 1 + fi +fi + +# Download NuGet if it does not exist. +if [ ! -f "$NUGET_EXE" ]; then + echo "Downloading NuGet..." + curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe + if [ $? -ne 0 ]; then + echo "An error occurred while downloading nuget.exe." + exit 1 + fi +fi + +# Restore tools from NuGet. +pushd "$TOOLS_DIR" >/dev/null +if [ ! -f "$PACKAGES_CONFIG_MD5" ] || [ "$( cat "$PACKAGES_CONFIG_MD5" | sed 's/\r$//' )" != "$( $MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' )" ]; then + find . -type d ! -name . ! -name 'Cake.Bakery' | xargs rm -rf +fi + +mono "$NUGET_EXE" install -ExcludeVersion +if [ $? -ne 0 ]; then + echo "Could not restore NuGet tools." + exit 1 +fi + +$MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' >| "$PACKAGES_CONFIG_MD5" + +popd >/dev/null + +# Restore addins from NuGet. +if [ -f "$ADDINS_PACKAGES_CONFIG" ]; then + pushd "$ADDINS_DIR" >/dev/null + + mono "$NUGET_EXE" install -ExcludeVersion + if [ $? -ne 0 ]; then + echo "Could not restore NuGet addins." + exit 1 + fi + + popd >/dev/null +fi + +# Restore modules from NuGet. +if [ -f "$MODULES_PACKAGES_CONFIG" ]; then + pushd "$MODULES_DIR" >/dev/null + + mono "$NUGET_EXE" install -ExcludeVersion + if [ $? -ne 0 ]; then + echo "Could not restore NuGet modules." + exit 1 + fi + + popd >/dev/null +fi + +# Make sure that Cake has been installed. +if [ ! -f "$CAKE_EXE" ]; then + echo "Could not find Cake.exe at '$CAKE_EXE'." + exit 1 +fi + +# Start Cake +exec mono "$CAKE_EXE" $SCRIPT "${CAKE_ARGUMENTS[@]}" diff --git a/nuspec/nuget/Cake.Terraform.nuspec b/nuspec/nuget/Cake.Terraform.nuspec index 6105503..19ef5b2 100644 --- a/nuspec/nuget/Cake.Terraform.nuspec +++ b/nuspec/nuget/Cake.Terraform.nuspec @@ -15,8 +15,8 @@ Cake, Script, Build, Terraform, Hashicorp - - + + diff --git a/setup.cake b/setup.cake index 7180adf..ed85166 100644 --- a/setup.cake +++ b/setup.cake @@ -1,4 +1,4 @@ -#load nuget:https://www.myget.org/F/cake-contrib/api/v2?package=Cake.Recipe&prerelease +#load nuget:https://www.myget.org/F/cake-contrib/api/v2?package=Cake.Recipe&version=0.3.0-unstable0371 Environment.SetVariableNames(); diff --git a/src/Cake.Terraform.Tests/Cake.Terraform.Tests.csproj b/src/Cake.Terraform.Tests/Cake.Terraform.Tests.csproj index 64998c9..0062f3b 100644 --- a/src/Cake.Terraform.Tests/Cake.Terraform.Tests.csproj +++ b/src/Cake.Terraform.Tests/Cake.Terraform.Tests.csproj @@ -1,12 +1,12 @@  - net45 + net461 - - + + diff --git a/src/Cake.Terraform.Tests/TerraformApplyTests.cs b/src/Cake.Terraform.Tests/TerraformApplyTests.cs index 18ee72b..94d4415 100644 --- a/src/Cake.Terraform.Tests/TerraformApplyTests.cs +++ b/src/Cake.Terraform.Tests/TerraformApplyTests.cs @@ -60,7 +60,7 @@ public void Should_throw_if_process_has_a_non_zero_exit_code() [Fact] public void Should_find_linux_executable() { - var fixture = new TerraformPlanFixture(PlatformFamily.Linux); + var fixture = new TerraformApplyFixture(PlatformFamily.Linux); fixture.Environment.Platform.Family = PlatformFamily.Linux; @@ -115,6 +115,20 @@ public void Should_set_input_variables_file() Assert.Contains("-var-file \"./aws-creds.json\" -var \"access_key=foo\" -var \"secret_key=bar\"", result.Args); } + + [Fact] + public void Should_Append_Auto_Approve_When_AutoApprove_Is_True() + { + var fixture = new TerraformApplyFixture { + Settings = new TerraformApplySettings { + AutoApprove = true + } + }; + + var result = fixture.Run(); + + Assert.Contains("-auto-approve", result.Args); + } } } } \ No newline at end of file diff --git a/src/Cake.Terraform/Cake.Terraform.csproj b/src/Cake.Terraform/Cake.Terraform.csproj index d7116e1..bf3bbd4 100644 --- a/src/Cake.Terraform/Cake.Terraform.csproj +++ b/src/Cake.Terraform/Cake.Terraform.csproj @@ -1,12 +1,12 @@  - net45;netstandard1.6 + net461;netstandard1.6 - 0.19.3 + 0.22.0 diff --git a/src/Cake.Terraform/TerraformApplyRunner.cs b/src/Cake.Terraform/TerraformApplyRunner.cs index 29398b7..e1b88be 100644 --- a/src/Cake.Terraform/TerraformApplyRunner.cs +++ b/src/Cake.Terraform/TerraformApplyRunner.cs @@ -13,7 +13,20 @@ public TerraformApplyRunner(IFileSystem fileSystem, ICakeEnvironment environment public void Run(TerraformApplySettings settings) { - var builder = new ProcessArgumentBuilder().Append("apply"); + var builder = new ProcessArgumentBuilder() + .Append("apply"); + + // Order of AutoApprove and Plan are important. + if (settings.AutoApprove) + { + builder.Append("-auto-approve"); + } + + // Use Plan if it exists. + if (settings.Plan != null) + { + builder.Append(settings.Plan.FullPath); + } if (!string.IsNullOrEmpty(settings.InputVariablesFile)) { diff --git a/src/Cake.Terraform/TerraformApplySettings.cs b/src/Cake.Terraform/TerraformApplySettings.cs index 3803d3f..2802089 100644 --- a/src/Cake.Terraform/TerraformApplySettings.cs +++ b/src/Cake.Terraform/TerraformApplySettings.cs @@ -20,5 +20,11 @@ public class TerraformApplySettings : TerraformSettings /// https://www.terraform.io/docs/configuration/variables.html#variable-files /// public string InputVariablesFile { get; set; } + + /// + /// Skip interactive approval of plan before applying. + /// https://www.terraform.io/docs/commands/apply.html#auto-approve + /// + public bool AutoApprove { get; set; } } } \ No newline at end of file diff --git a/src/Cake.Terraform/TerraformRunner.cs b/src/Cake.Terraform/TerraformRunner.cs index e55b978..c16987a 100644 --- a/src/Cake.Terraform/TerraformRunner.cs +++ b/src/Cake.Terraform/TerraformRunner.cs @@ -22,10 +22,7 @@ protected override string GetToolName() protected override IEnumerable GetToolExecutableNames() { - - return new [] { _platform.IsUnix() ? "terraform" : "terraform.exe" }; + return new[] { _platform.IsUnix() ? "terraform" : "terraform.exe" }; } - - } } \ No newline at end of file diff --git a/tools/packages.config b/tools/packages.config index 5657d95..747e13e 100644 --- a/tools/packages.config +++ b/tools/packages.config @@ -1,4 +1,4 @@ - +