diff --git a/actions/ansible/ansibledeploy/ansible-deploy.go b/actions/ansible/ansibledeploy/ansible-deploy.go new file mode 100644 index 0000000..d306573 --- /dev/null +++ b/actions/ansible/ansibledeploy/ansible-deploy.go @@ -0,0 +1,57 @@ +package ansibledeploy + +import ( + "fmt" + "path" + + cidsdk "github.com/cidverse/cid-sdk-go" +) + +type Action struct { + Sdk cidsdk.SDKClient +} + +type Config struct { + PlaybookFile string `json:"ansible_playbook" env:"ANSIBLE_PLAYBOOK"` + InventoryFile string `json:"ansible_inventory" env:"ANSIBLE_INVENTORY"` +} + +func (a Action) Execute() (err error) { + cfg := Config{} + ctx, err := a.Sdk.ModuleAction(&cfg) + if err != nil { + return err + } + + // config + playbookFile := cfg.PlaybookFile + inventoryFile := cfg.InventoryFile + if playbookFile == "" { + playbookFile = ctx.Module.Discovery[0].File + } + if inventoryFile == "" { + inventoryFile = path.Join(path.Dir(playbookFile), "inventory") + } + + // role and collection requirements + if a.Sdk.FileExists(path.Join(ctx.Module.ModuleDir, "requirements.yml")) { + _, err = a.Sdk.ExecuteCommand(cidsdk.ExecuteCommandRequest{ + Command: `ansible-galaxy collection install -r requirements.yml`, + WorkDir: ctx.Module.ModuleDir, + }) + if err != nil { + return err + } + } + + // deploy + _, err = a.Sdk.ExecuteCommand(cidsdk.ExecuteCommandRequest{ + Command: fmt.Sprintf(`ansible-playbook %q -i %q`, playbookFile, inventoryFile), + WorkDir: ctx.Module.ModuleDir, + }) + if err != nil { + return err + } + + return nil +} diff --git a/actions/ansible/ansibledeploy/ansible-deploy_test.go b/actions/ansible/ansibledeploy/ansible-deploy_test.go new file mode 100644 index 0000000..e1517e5 --- /dev/null +++ b/actions/ansible/ansibledeploy/ansible-deploy_test.go @@ -0,0 +1,25 @@ +package ansibledeploy + +import ( + "testing" + + "github.com/cidverse/cid-actions-go/actions/api" + "github.com/cidverse/cid-actions-go/pkg/core/test" + cidsdk "github.com/cidverse/cid-sdk-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestAnsibleDeploy(t *testing.T) { + sdk := test.Setup(t) + sdk.On("ModuleAction", mock.Anything).Return(api.GetAnsibleTestData(false), nil) + sdk.On("FileExists", "/my-project/playbook-a/requirements.yml").Return(false) + sdk.On("ExecuteCommand", cidsdk.ExecuteCommandRequest{ + Command: `ansible-playbook "/my-project/playbook-a/playbook.yml" -i "/my-project/playbook-a/inventory"`, + WorkDir: "/my-project/playbook-a", + }).Return(nil, nil) + + action := Action{Sdk: sdk} + err := action.Execute() + assert.NoError(t, err) +} diff --git a/actions/ansible/ansiblelint/ansible-lint.go b/actions/ansible/ansiblelint/ansible-lint.go index 9ca8b99..e418206 100644 --- a/actions/ansible/ansiblelint/ansible-lint.go +++ b/actions/ansible/ansiblelint/ansible-lint.go @@ -13,6 +13,7 @@ type Action struct { } type ScanConfig struct { + LintProfile string `json:"ansible_lint_profile" env:"ANSIBLE_LINT_PROFILE"` } func (a Action) Execute() (err error) { @@ -22,6 +23,12 @@ func (a Action) Execute() (err error) { return err } + // config + lintProfile := cfg.LintProfile + if lintProfile == "" { + lintProfile = "production" + } + // files reportFile := cidsdk.JoinPath(ctx.Config.TempDir, "ansiblelint.sarif.json") @@ -39,7 +46,7 @@ func (a Action) Execute() (err error) { // lint // config lookup: https://ansible.readthedocs.io/projects/lint/configuring/#using-local-configuration-files _, err = a.Sdk.ExecuteCommand(cidsdk.ExecuteCommandRequest{ - Command: fmt.Sprintf(`ansible-lint --project . --sarif-file %s`, reportFile), + Command: fmt.Sprintf(`ansible-lint --project . --profile %q --sarif-file %q`, lintProfile, reportFile), WorkDir: ctx.Module.ModuleDir, }) if err != nil { diff --git a/actions/ansible/ansiblelint/ansible-lint_test.go b/actions/ansible/ansiblelint/ansible-lint_test.go index c2e66a8..3a58a43 100644 --- a/actions/ansible/ansiblelint/ansible-lint_test.go +++ b/actions/ansible/ansiblelint/ansible-lint_test.go @@ -19,7 +19,7 @@ func TestAnsibleLint(t *testing.T) { sdk.On("ModuleAction", mock.Anything).Return(api.GetAnsibleTestData(false), nil) sdk.On("FileExists", "/my-project/playbook-a/requirements.yml").Return(false) sdk.On("ExecuteCommand", cidsdk.ExecuteCommandRequest{ - Command: "ansible-lint --project . --sarif-file /my-project/.tmp/ansiblelint.sarif.json", + Command: `ansible-lint --project . --profile "production" --sarif-file "/my-project/.tmp/ansiblelint.sarif.json"`, WorkDir: "/my-project/playbook-a", }).Return(nil, nil) sdk.On("FileRead", "/my-project/.tmp/ansiblelint.sarif.json").Return(reportJson, nil) @@ -44,7 +44,7 @@ func TestAnsibleLintWithDependencies(t *testing.T) { WorkDir: "/my-project/playbook-a", }).Return(nil, nil) sdk.On("ExecuteCommand", cidsdk.ExecuteCommandRequest{ - Command: "ansible-lint --project . --sarif-file /my-project/.tmp/ansiblelint.sarif.json", + Command: `ansible-lint --project . --profile "production" --sarif-file "/my-project/.tmp/ansiblelint.sarif.json"`, WorkDir: "/my-project/playbook-a", }).Return(nil, nil) sdk.On("FileRead", "/my-project/.tmp/ansiblelint.sarif.json").Return(reportJson, nil) diff --git a/cmd/run.go b/cmd/run.go index f77bd40..898c802 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "github.com/cidverse/cid-actions-go/actions/ansible/ansibledeploy" "github.com/cidverse/cid-actions-go/actions/ansible/ansiblelint" "github.com/cidverse/cid-actions-go/actions/api" "github.com/cidverse/cid-actions-go/actions/applicationinspector" @@ -74,7 +75,8 @@ var runCmd = &cobra.Command{ // actions actions := map[string]api.Action{ // ansible - "ansible-lint": ansiblelint.Action{Sdk: *sdk}, + "ansible-lint": ansiblelint.Action{Sdk: *sdk}, + "ansible-deploy": ansibledeploy.Action{Sdk: *sdk}, // changeloggenerate "changelog-generate": changeloggenerate.Action{Sdk: *sdk}, // container