From 9df49284726f9b1a41b8c181e9675f01a1df1c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Ma=C5=82ota-W=C3=B3jcik?= Date: Mon, 9 Sep 2024 07:28:20 +0200 Subject: [PATCH] Install terraform and provide functions to apply and destroy deployments (#47) --- build/cmd/builder/main.go | 1 + go.mod | 5 +-- go.sum | 9 ++--- pkg/tools/evm/tools.go | 6 +-- pkg/tools/ops/tools.go | 78 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 pkg/tools/ops/tools.go diff --git a/build/cmd/builder/main.go b/build/cmd/builder/main.go index 76d54f8..1c3abca 100644 --- a/build/cmd/builder/main.go +++ b/build/cmd/builder/main.go @@ -7,6 +7,7 @@ import ( _ "github.com/sei-protocol/build/pkg/tools/evm" "github.com/sei-protocol/build/pkg/tools/git" "github.com/sei-protocol/build/pkg/tools/golang" + _ "github.com/sei-protocol/build/pkg/tools/ops" _ "github.com/sei-protocol/build/pkg/tools/protobuf" "github.com/sei-protocol/build/pkg/tools/rust" ) diff --git a/go.mod b/go.mod index 94f6521..27daf9a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22 require ( github.com/outofforest/build v1.16.5 github.com/outofforest/libexec v0.3.9 - github.com/outofforest/logger v0.5.4 + github.com/outofforest/logger v0.5.5 github.com/outofforest/parallel v0.2.3 github.com/outofforest/run v0.6.0 github.com/pkg/errors v0.9.1 @@ -17,11 +17,10 @@ require ( require ( github.com/outofforest/ioc/v2 v2.5.2 // indirect - github.com/ridge/must v0.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/text v0.18.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect ) diff --git a/go.sum b/go.sum index c007bdb..bb508ce 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,8 @@ github.com/outofforest/libexec v0.3.9 h1:KvVLuKDHqpydwNoKm+j36hi9DVPU61X4oHonlZ5 github.com/outofforest/libexec v0.3.9/go.mod h1:J2rUB/m0ER8UNOHd3/UQM55bvh1cbMwhb8gibeF/zyo= github.com/outofforest/logger v0.3.3/go.mod h1:+M5sO17Va9V33t28Qs9VqRQ8bFV501Uhq2PtQY+R3Ms= github.com/outofforest/logger v0.3.4/go.mod h1:wOsyVEu2nnueGK+IZuD1tOWYx6tXGV48earpJsDPT3Y= -github.com/outofforest/logger v0.5.4 h1:mRxOxRrm1ppUueQiv+ektljGAGhUM9wOLmkmVpQuMqo= -github.com/outofforest/logger v0.5.4/go.mod h1:czsrxU2w6KlZ31gbJt164H2k0ckoygXbYqCx7V2DAHM= +github.com/outofforest/logger v0.5.5 h1:ndsFPPojrRMH2BZzk1MOmf+imooVqrzOG78NSqGfx/Q= +github.com/outofforest/logger v0.5.5/go.mod h1:+h+DeEKd7Q2kYrRy8qME0cTgl8+7SqeFDWCti9cIgVk= github.com/outofforest/parallel v0.2.3 h1:DRIgHr7XTL4LLgsTqrj041kulv4ajtbCkRbkOG5psWY= github.com/outofforest/parallel v0.2.3/go.mod h1:cu210xIjJtOMXR2ERzEcNA2kr0Z0xfZjSKw2jTxAQ2E= github.com/outofforest/run v0.6.0 h1:t/3vAodvU5L5vJ3BB0qRgfviX+T3JJmLgPN6G2WQs3U= @@ -26,7 +26,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/ridge/must v0.6.0 h1:INravc0/PCJjZgfNADzGOS8/ubNykJYmyJshuz6uiCg= github.com/ridge/must v0.6.0/go.mod h1:dm1IMngycGzvmpsFY1A5TU18Y5Yg6MgtkJ0iJbca0VA= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= @@ -77,8 +76,8 @@ golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= diff --git a/pkg/tools/evm/tools.go b/pkg/tools/evm/tools.go index 9610a34..62dbfc6 100644 --- a/pkg/tools/evm/tools.go +++ b/pkg/tools/evm/tools.go @@ -21,7 +21,7 @@ var t = []tools.Tool{ Sources: tools.Sources{ tools.PlatformLinuxAMD64: { URL: "https://github.com/foundry-rs/foundry/releases/download/nightly-2b1f8d6dd90f9790faf0528e05e60e573a7569ce/foundry_nightly_linux_amd64.tar.gz", //nolint:lll - Hash: "sha256:2c75c62fab2a521938fd2a5eec6e97f9718eb0b6802852f54f1d886100fe8eb0", //nolint:lll + Hash: "sha256:2c75c62fab2a521938fd2a5eec6e97f9718eb0b6802852f54f1d886100fe8eb0", Links: map[string]string{ "bin/anvil": "anvil", "bin/forge": "forge", @@ -30,7 +30,7 @@ var t = []tools.Tool{ }, tools.PlatformDarwinAMD64: { URL: "https://github.com/foundry-rs/foundry/releases/download/nightly-2b1f8d6dd90f9790faf0528e05e60e573a7569ce/foundry_nightly_darwin_amd64.tar.gz", //nolint:lll - Hash: "sha256:cf853e416cf9358174bf4fcf603b5c263aed456842b9c78661c4d77654133b7a", //nolint:lll + Hash: "sha256:cf853e416cf9358174bf4fcf603b5c263aed456842b9c78661c4d77654133b7a", Links: map[string]string{ "bin/anvil": "anvil", "bin/forge": "forge", @@ -39,7 +39,7 @@ var t = []tools.Tool{ }, tools.PlatformDarwinARM64: { URL: "https://github.com/foundry-rs/foundry/releases/download/nightly-2b1f8d6dd90f9790faf0528e05e60e573a7569ce/foundry_nightly_darwin_arm64.tar.gz", //nolint:lll - Hash: "sha256:af157f6daac33bb4b955875e777c52d7d022e6471ed2bf1cddba9869ed5707f0", //nolint:lll + Hash: "sha256:af157f6daac33bb4b955875e777c52d7d022e6471ed2bf1cddba9869ed5707f0", Links: map[string]string{ "bin/anvil": "anvil", "bin/forge": "forge", diff --git a/pkg/tools/ops/tools.go b/pkg/tools/ops/tools.go new file mode 100644 index 0000000..eeefced --- /dev/null +++ b/pkg/tools/ops/tools.go @@ -0,0 +1,78 @@ +package ops + +import ( + "context" + "os/exec" + + "github.com/outofforest/build" + "github.com/outofforest/libexec" + + "github.com/sei-protocol/build/pkg/tools" +) + +// Tool names. +const ( + Terraform tools.Name = "terraform" +) + +var t = []tools.Tool{ + // https://developer.hashicorp.com/terraform/install + tools.BinaryTool{ + Name: Terraform, + Version: "1.9.5", + Sources: tools.Sources{ + tools.PlatformLinuxAMD64: { + URL: "https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_linux_amd64.zip", + Hash: "sha256:9cf727b4d6bd2d4d2908f08bd282f9e4809d6c3071c3b8ebe53558bee6dc913b", + Links: map[string]string{ + "bin/terraform": "terraform", + }, + }, + tools.PlatformDarwinAMD64: { + URL: "https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_darwin_amd64.zip", + Hash: "sha256:c28945c377d04b1d237f704729258234c471c8c4f617a1303042862f708ebbc6", + Links: map[string]string{ + "bin/terraform": "terraform", + }, + }, + tools.PlatformDarwinARM64: { + URL: "https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_darwin_arm64.zip", + Hash: "sha256:b7eca5cd6f0f6644d45d8708c1b864e64a9e26c355d2c9b585faa049f640fe71", + Links: map[string]string{ + "bin/terraform": "terraform", + }, + }, + }, + }, +} + +// EnsureTerraform ensures that terraform is available. +func EnsureTerraform(ctx context.Context, _ build.DepsFunc) error { + return tools.Ensure(ctx, Terraform, tools.PlatformLocal) +} + +// TerraformApply applies changes to the deployment. +func TerraformApply(ctx context.Context, deps build.DepsFunc, path string) error { + return runTerraform(ctx, deps, path, "apply") +} + +// TerraformDestroy destroys deployment. +func TerraformDestroy(ctx context.Context, deps build.DepsFunc, path string) error { + return runTerraform(ctx, deps, path, "destroy") +} + +func runTerraform(ctx context.Context, deps build.DepsFunc, path, action string) error { + deps(EnsureTerraform) + + cmd := exec.Command(tools.Bin(ctx, "bin/terraform", tools.PlatformLocal), action, + "-parallelism", "100", + "-auto-approve", + ) + cmd.Dir = path + + return libexec.Exec(ctx, cmd) +} + +func init() { + tools.Add(t...) +}