Skip to content

Add possibility dedicated folder for installed roles #2785

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

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 2 additions & 4 deletions db/Task.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import (
"github.com/semaphoreui/semaphore/util"
)

type DefaultTaskParams struct {
}
type DefaultTaskParams struct{}

type TerraformTaskParams struct {
Plan bool `json:"plan"`
Expand All @@ -27,6 +26,7 @@ type AnsibleTaskParams struct {
Debug bool `json:"debug"`
DryRun bool `json:"dry_run"`
Diff bool `json:"diff"`
TaskID int
}

// Task is a model of a task which will be executed by the runner
Expand Down Expand Up @@ -123,7 +123,6 @@ func (task *Task) GetIncomingVersion(d Store) *string {
}

buildTask, err := d.GetTask(task.ProjectID, *task.BuildTaskID)

if err != nil {
return nil
}
Expand All @@ -150,7 +149,6 @@ func (task *Task) GetUrl() *string {
}

func (task *Task) ValidateNewTask(template Template) error {

var params interface{}
switch template.App {
case AppAnsible:
Expand Down
69 changes: 59 additions & 10 deletions db_lib/AnsibleApp.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package db_lib

import (
"crypto/md5"
"errors"
"fmt"
"io"
"os"
"path"

"github.com/semaphoreui/semaphore/db"
"github.com/semaphoreui/semaphore/pkg/task_logger"
"github.com/semaphoreui/semaphore/util"
)

func getMD5Hash(filepath string) (string, error) {
Expand Down Expand Up @@ -45,7 +47,7 @@ func writeMD5Hash(requirementsFile string, requirementsHashFile string) error {
return err
}

return os.WriteFile(requirementsHashFile, []byte(newFileMD5Hash), 0644)
return os.WriteFile(requirementsHashFile, []byte(newFileMD5Hash), 0o644)
}

type AnsibleApp struct {
Expand All @@ -69,29 +71,76 @@ func (t *AnsibleApp) Log(msg string) {
t.Logger.Log(msg)
}

func (t *AnsibleApp) InstallRequirements(environmentVars []string, params interface{}) error {
func (t *AnsibleApp) getRepoPath() string {
repo := GitRepository{
Logger: t.Logger,
TemplateID: t.Template.ID,
Repository: t.Repository,
Client: CreateDefaultGitClient(),
}

return repo.GetFullPath()
}

func (t *AnsibleApp) installRequirementsForPersonalTask(taskID int) error {
if err := t.installGalaxyRequirementsFileForPersonalTask(GalaxyRole, taskID); err != nil {
return err
}
if err := t.installGalaxyRequirementsFileForPersonalTask(GalaxyCollection, taskID); err != nil {
return err
}

return nil
}

func (t *AnsibleApp) installRequirements() error {
if err := t.installCollectionsRequirements(); err != nil {
return err
}
if err := t.installRolesRequirements(); err != nil {
return err
}

return nil
}

func (t *AnsibleApp) getRepoPath() string {
repo := GitRepository{
Logger: t.Logger,
TemplateID: t.Template.ID,
Repository: t.Repository,
Client: CreateDefaultGitClient(),
func (t *AnsibleApp) InstallRequirements(environmentVars []string, params interface{}) error {
if !util.Config.UsePersonalTaskRoles {
return t.installRequirements()
}

return repo.GetFullPath()
ansibleParams, ok := params.(*db.AnsibleTaskParams)
if !ok {
return errors.New("undefined type task parameters")
}

return t.installRequirementsForPersonalTask(ansibleParams.TaskID)
}

func (t *AnsibleApp) installGalaxyRequirementsFile(requirementsType GalaxyRequirementsType, requirementsFilePath string) error {
func (t *AnsibleApp) installGalaxyRequirementsFileForPersonalTask(requirementsType GalaxyRequirementsType, taskID int) error {
requirementsFilePath := path.Join(t.GetPlaybookDir(), string(requirementsType)+"s", "requirements.yml")

if _, err := os.Stat(requirementsFilePath); err != nil {
t.Log("No " + requirementsFilePath + " file found. Skip galaxy install process.\n")
return nil
}

if err := t.runGalaxy([]string{
string(requirementsType),
"install",
"-r",
requirementsFilePath,
"--force",
"-p",
util.Config.FullPathToPersonalTaskRoles(taskID),
}); err != nil {
return err
}

return nil
}

func (t *AnsibleApp) installGalaxyRequirementsFile(requirementsType GalaxyRequirementsType, requirementsFilePath string) error {
requirementsHashFilePath := fmt.Sprintf("%s.md5", requirementsFilePath)

if _, err := os.Stat(requirementsFilePath); err != nil {
Expand Down
29 changes: 14 additions & 15 deletions services/tasks/LocalJob.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ func (t *LocalJob) SetCommit(hash, message string) {
}

func (t *LocalJob) getEnvironmentExtraVars(username string, incomingVersion *string) (extraVars map[string]interface{}, err error) {

extraVars = make(map[string]interface{})

if t.Environment.JSON != "" {
Expand Down Expand Up @@ -179,7 +178,6 @@ func (t *LocalJob) getEnvironmentENV() (res []string, err error) {
// nolint: gocyclo
func (t *LocalJob) getShellArgs(username string, incomingVersion *string) (args []string, err error) {
extraVars, err := t.getEnvironmentExtraVars(username, incomingVersion)

if err != nil {
t.Log(err.Error())
t.Log("Error getting environment extra vars")
Expand Down Expand Up @@ -220,11 +218,9 @@ func (t *LocalJob) getShellArgs(username string, incomingVersion *string) (args

// nolint: gocyclo
func (t *LocalJob) getTerraformArgs(username string, incomingVersion *string) (args []string, err error) {

args = []string{}

extraVars, err := t.getEnvironmentExtraVars(username, incomingVersion)

if err != nil {
t.Log(err.Error())
t.Log("Could not remove command environment, if existent it will be passed to --extra-vars. This is not fatal but be aware of side effects")
Expand Down Expand Up @@ -269,7 +265,6 @@ func (t *LocalJob) getTerraformArgs(username string, incomingVersion *string) (a

// nolint: gocyclo
func (t *LocalJob) getPlaybookArgs(username string, incomingVersion *string) (args []string, inputs map[string]string, err error) {

inputMap := make(map[db.AccessKeyRole]string)
inputs = make(map[string]string)

Expand Down Expand Up @@ -431,7 +426,6 @@ func (t *LocalJob) getPlaybookArgs(username string, incomingVersion *string) (ar
}

func (t *LocalJob) getCLIArgs() (templateArgs []string, taskArgs []string, err error) {

if t.Template.Arguments != nil {
err = json.Unmarshal([]byte(*t.Template.Arguments), &templateArgs)
if err != nil {
Expand All @@ -454,15 +448,16 @@ func (t *LocalJob) getCLIArgs() (templateArgs []string, taskArgs []string, err e
func (t *LocalJob) getParams() (params interface{}, err error) {
switch t.Template.App {
case db.AppAnsible:
params = &db.AnsibleTaskParams{}
params = &db.AnsibleTaskParams{
TaskID: t.Task.ID,
}
case db.AppTerraform, db.AppTofu:
params = &db.TerraformTaskParams{}
default:
params = &db.DefaultTaskParams{}
}

err = t.Task.FillParams(params)

if err != nil {
return
}
Expand All @@ -471,10 +466,13 @@ func (t *LocalJob) getParams() (params interface{}, err error) {
}

func (t *LocalJob) Run(username string, incomingVersion *string, alias string) (err error) {

defer func() {
t.destroyKeys()
t.destroyInventoryFile()

if util.Config.UsePersonalTaskRoles {
t.destroyTaskRoles()
}
}()

t.SetStatus(task_logger.TaskRunningStatus) // It is required for local mode. Don't delete
Expand All @@ -484,6 +482,13 @@ func (t *LocalJob) Run(username string, incomingVersion *string, alias string) (
return
}

if util.Config.UsePersonalTaskRoles {
environmentVariables = append(environmentVariables,
fmt.Sprintf("ANSIBLE_ROLES_PATH=%s", util.Config.FullPathToPersonalTaskRoles(t.Task.ID)),
fmt.Sprintf("ANSIBLE_COLLECTIONS_PATH=%s", util.Config.FullPathToPersonalTaskRoles(t.Task.ID)),
)
}

params, err := t.getParams()
if err != nil {
return
Expand Down Expand Up @@ -544,11 +549,9 @@ func (t *LocalJob) Run(username string, incomingVersion *string, alias string) (
t.Process = p
},
})

}

func (t *LocalJob) prepareRun(environmentVars []string, params interface{}) error {

t.Log("Preparing: " + strconv.Itoa(t.Task.ID))

if err := checkTmpDir(util.Config.TmpPath); err != nil {
Expand Down Expand Up @@ -609,7 +612,6 @@ func (t *LocalJob) updateRepository() error {
}

err := repo.ValidateRepo()

if err != nil {
if !os.IsNotExist(err) {
err = os.RemoveAll(repo.GetFullPath())
Expand All @@ -636,7 +638,6 @@ func (t *LocalJob) updateRepository() error {
}

func (t *LocalJob) checkoutRepository() error {

repo := db_lib.GitRepository{
Logger: t.Logger,
TemplateID: t.Template.ID,
Expand All @@ -645,7 +646,6 @@ func (t *LocalJob) checkoutRepository() error {
}

err := repo.ValidateRepo()

if err != nil {
return err
}
Expand All @@ -658,7 +658,6 @@ func (t *LocalJob) checkoutRepository() error {
// store commit to TaskRunner table

commitHash, err := repo.GetLastCommitHash()

if err != nil {
return err
}
Expand Down
9 changes: 8 additions & 1 deletion services/tasks/LocalJob_inventory.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (t *LocalJob) installStaticInventory() error {
fullPath := t.tmpInventoryFullPath()

// create inventory file
return os.WriteFile(fullPath, []byte(t.Inventory.Inventory), 0664)
return os.WriteFile(fullPath, []byte(t.Inventory.Inventory), 0o664)
}

func (t *LocalJob) destroyInventoryFile() {
Expand All @@ -94,6 +94,13 @@ func (t *LocalJob) destroyInventoryFile() {
}
}

func (t *LocalJob) destroyTaskRoles() {
fullPath := util.Config.FullPathToPersonalTaskRoles(t.Task.ID)
if err := os.RemoveAll(fullPath); err != nil {
log.Error(err)
}
}

func (t *LocalJob) destroyKeys() {
err := t.sshKeyInstallation.Destroy()
if err != nil {
Expand Down
Loading
Loading