Skip to content

Commit 67ead5e

Browse files
authored
refactor project namespace (#320)
* refactor gitlab path to call shared code
1 parent ee1dcf7 commit 67ead5e

File tree

6 files changed

+111
-118
lines changed

6 files changed

+111
-118
lines changed

cmd/digger/main.go

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,40 @@ import (
2323

2424
func gitHubCI(lock locking.Lock) {
2525
println("Using GitHub.")
26-
githubRepositoryOwner := os.Getenv("GITHUB_REPOSITORY_OWNER")
27-
if githubRepositoryOwner != "" {
28-
usage.SendUsageRecord(githubRepositoryOwner, "log", "initialize")
26+
githubActor := os.Getenv("GITHUB_ACTOR")
27+
if githubActor != "" {
28+
usage.SendUsageRecord(githubActor, "log", "initialize")
2929
} else {
3030
usage.SendUsageRecord("", "log", "non github initialisation")
3131
}
3232

3333
ghToken := os.Getenv("GITHUB_TOKEN")
3434
if ghToken == "" {
35-
reportErrorAndExit(githubRepositoryOwner, "GITHUB_TOKEN is not defined", 1)
35+
reportErrorAndExit(githubActor, "GITHUB_TOKEN is not defined", 1)
3636
}
3737

3838
ghContext := os.Getenv("GITHUB_CONTEXT")
3939
if ghContext == "" {
40-
reportErrorAndExit(githubRepositoryOwner, "GITHUB_CONTEXT is not defined", 2)
40+
reportErrorAndExit(githubActor, "GITHUB_CONTEXT is not defined", 2)
4141
}
4242

4343
parsedGhContext, err := github_models.GetGitHubContext(ghContext)
4444
if err != nil {
45-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to parse GitHub context. %s", err), 3)
45+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to parse GitHub context. %s", err), 3)
4646
}
4747
println("GitHub context parsed successfully")
4848

4949
walker := configuration.FileSystemDirWalker{}
5050

5151
diggerConfig, err := configuration.LoadDiggerConfig("./", &walker)
5252
if err != nil {
53-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to read Digger config. %s", err), 4)
53+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to read Digger config. %s", err), 4)
5454
}
5555
println("Digger config read successfully")
5656

5757
lock, err = locking.GetLock()
5858
if err != nil {
59-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to create lock provider. %s", err), 5)
59+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to create lock provider. %s", err), 5)
6060
}
6161
println("Lock provider has been created successfully")
6262

@@ -68,7 +68,7 @@ func gitHubCI(lock locking.Lock) {
6868

6969
impactedProjects, requestedProject, prNumber, err := dg_github.ProcessGitHubEvent(ghEvent, diggerConfig, githubPrService)
7070
if err != nil {
71-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to process GitHub event. %s", err), 6)
71+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to process GitHub event. %s", err), 6)
7272
}
7373
logImpactedProjects(impactedProjects, prNumber)
7474
println("GitHub event processed successfully")
@@ -77,26 +77,26 @@ func gitHubCI(lock locking.Lock) {
7777
reply := utils.GetCommands()
7878
err := githubPrService.PublishComment(prNumber, reply)
7979
if err != nil {
80-
reportErrorAndExit(githubRepositoryOwner, "Failed to publish help command output", 1)
80+
reportErrorAndExit(githubActor, "Failed to publish help command output", 1)
8181
}
8282
}
8383

8484
if len(impactedProjects) == 0 {
85-
reportErrorAndExit(githubRepositoryOwner, "No projects impacted", 0)
85+
reportErrorAndExit(githubActor, "No projects impacted", 0)
8686
}
8787

8888
commandsToRunPerProject, coversAllImpactedProjects, err := dg_github.ConvertGithubEventToCommands(ghEvent, impactedProjects, requestedProject, diggerConfig.Workflows)
8989
if err != nil {
90-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to convert GitHub event to commands. %s", err), 7)
90+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to convert GitHub event to commands. %s", err), 7)
9191
}
9292
println("GitHub event converted to commands successfully")
9393
logCommands(commandsToRunPerProject)
9494

95-
planStorage := newPlanStorage(ghToken, repoOwner, repositoryName, prNumber)
95+
planStorage := newPlanStorage(ghToken, repoOwner, repositoryName, githubActor, prNumber)
9696

97-
allAppliesSuccessful, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, repoOwner, repositoryName, eventName, prNumber, githubPrService, lock, planStorage, "")
97+
allAppliesSuccessful, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, parsedGhContext.Repository, githubActor, eventName, prNumber, githubPrService, lock, planStorage, "")
9898
if err != nil {
99-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Failed to run commands. %s", err), 8)
99+
reportErrorAndExit(githubActor, fmt.Sprintf("Failed to run commands. %s", err), 8)
100100
}
101101

102102
if diggerConfig.AutoMerge && allAppliesSuccessful && atLeastOneApply && coversAllImpactedProjects {
@@ -106,11 +106,11 @@ func gitHubCI(lock locking.Lock) {
106106

107107
println("Commands executed successfully")
108108

109-
reportErrorAndExit(githubRepositoryOwner, "Digger finished successfully", 0)
109+
reportErrorAndExit(githubActor, "Digger finished successfully", 0)
110110

111111
defer func() {
112112
if r := recover(); r != nil {
113-
reportErrorAndExit(githubRepositoryOwner, fmt.Sprintf("Panic occurred. %s", r), 1)
113+
reportErrorAndExit(githubActor, fmt.Sprintf("Panic occurred. %s", r), 1)
114114
}
115115
}()
116116
}
@@ -177,10 +177,11 @@ func gitLabCI(lock locking.Lock) {
177177
fmt.Printf("command: %s, project: %s\n", strings.Join(v.Commands, ", "), v.ProjectName)
178178
}
179179

180-
//planStorage := newPlanStorage(ghToken, repoOwner, repositoryName, prNumber)
181-
planStorage := newPlanStorage(gitlabToken, projectNamespace, projectName, *gitLabContext.MergeRequestIId)
180+
diggerProjectNamespace := gitLabContext.ProjectNamespace + "/" + gitLabContext.ProjectName
181+
planStorage := newPlanStorage("", "", "", gitLabContext.GitlabUserName, *gitLabContext.MergeRequestIId)
182+
183+
allAppliesSuccess, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, diggerProjectNamespace, gitLabContext.GitlabUserName, gitLabContext.EventType.String(), *gitLabContext.MergeRequestIId, gitlabService, lock, planStorage, currentDir)
182184

183-
allAppliesSuccess, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, gitLabContext.ProjectNamespace, gitLabContext.ProjectName, gitLabContext.EventType.String(), *gitLabContext.MergeRequestIId, gitlabService, lock, planStorage, currentDir)
184185
if err != nil {
185186
fmt.Printf("failed to execute command, %v", err)
186187
os.Exit(8)
@@ -251,8 +252,9 @@ func azureCI(lock locking.Lock) {
251252
}
252253

253254
var planStorage storage.PlanStorage
255+
diggerProjectNamespace := parsedAzureContext.BaseUrl + "/" + parsedAzureContext.ProjectName
254256

255-
allAppliesSuccess, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, parsedAzureContext.ProjectName, parsedAzureContext.ProjectName, parsedAzureContext.EventType, prNumber, azureService, lock, planStorage, currentDir)
257+
allAppliesSuccess, atLeastOneApply, err := digger.RunCommandsPerProject(commandsToRunPerProject, diggerProjectNamespace, parsedAzureContext.BaseUrl, parsedAzureContext.EventType, prNumber, azureService, lock, planStorage, currentDir)
256258
if err != nil {
257259
reportErrorAndExit(parsedAzureContext.BaseUrl, fmt.Sprintf("Failed to run commands. %s", err), 8)
258260
}
@@ -320,24 +322,24 @@ func main() {
320322
}
321323
}
322324

323-
func newPlanStorage(ghToken string, repoOwner string, repositoryName string, prNumber int) storage.PlanStorage {
325+
func newPlanStorage(ghToken string, ghRepoOwner string, ghRepositoryName string, requestedBy string, prNumber int) storage.PlanStorage {
324326
var planStorage storage.PlanStorage
325327

326328
uploadDestination := strings.ToLower(os.Getenv("PLAN_UPLOAD_DESTINATION"))
327329
if uploadDestination == "github" {
328330
zipManager := utils.Zipper{}
329331
planStorage = &storage.GithubPlanStorage{
330332
Client: github.NewTokenClient(context.Background(), ghToken),
331-
Owner: repoOwner,
332-
RepoName: repositoryName,
333+
Owner: ghRepoOwner,
334+
RepoName: ghRepositoryName,
333335
PullRequestNumber: prNumber,
334336
ZipManager: zipManager,
335337
}
336338
} else if uploadDestination == "gcp" {
337339
ctx, client := gcp.GetGoogleStorageClient()
338340
bucketName := strings.ToLower(os.Getenv("GOOGLE_STORAGE_BUCKET"))
339341
if bucketName == "" {
340-
reportErrorAndExit(repoOwner, fmt.Sprintf("GOOGLE_STORAGE_BUCKET is not defined"), 9)
342+
reportErrorAndExit(requestedBy, fmt.Sprintf("GOOGLE_STORAGE_BUCKET is not defined"), 9)
341343
}
342344
bucket := client.Bucket(bucketName)
343345
planStorage = &storage.PlanStorageGcp{

pkg/digger/digger.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@ import (
2222
"time"
2323
)
2424

25-
func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, repoOwner string, repoName string, eventName string, prNumber int, ciService ci.CIService, lock locking.Lock, planStorage storage.PlanStorage, workingDir string) (bool, bool, error) {
25+
func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, projectNamespace string, requestedBy string, eventName string, prNumber int, ciService ci.CIService, lock locking.Lock, planStorage storage.PlanStorage, workingDir string) (bool, bool, error) {
2626
appliesPerProject := make(map[string]bool)
2727
for _, projectCommands := range commandsPerProject {
2828
for _, command := range projectCommands.Commands {
2929
projectLock := &locking.ProjectLockImpl{
30-
InternalLock: lock,
31-
CIService: ciService,
32-
ProjectName: projectCommands.ProjectName,
33-
RepoName: repoName,
34-
RepoOwner: repoOwner,
30+
InternalLock: lock,
31+
CIService: ciService,
32+
ProjectName: projectCommands.ProjectName,
33+
ProjectNamespace: projectNamespace,
3534
}
3635

3736
var terraformExecutor terraform.TerraformExecutor
@@ -44,8 +43,7 @@ func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, repoOwner
4443

4544
commandRunner := CommandRunner{}
4645
diggerExecutor := DiggerExecutor{
47-
repoOwner,
48-
repoName,
46+
projectNamespace,
4947
projectCommands.ProjectName,
5048
projectPath,
5149
projectCommands.StateEnvVars,
@@ -60,7 +58,7 @@ func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, repoOwner
6058
}
6159
switch command {
6260
case "digger plan":
63-
usage.SendUsageRecord(repoOwner, eventName, "plan")
61+
usage.SendUsageRecord(requestedBy, eventName, "plan")
6462
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
6563
planPerformed, err := diggerExecutor.Plan(prNumber)
6664
if err != nil {
@@ -72,7 +70,7 @@ func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, repoOwner
7270
}
7371
case "digger apply":
7472
appliesPerProject[projectCommands.ProjectName] = false
75-
usage.SendUsageRecord(repoName, eventName, "apply")
73+
usage.SendUsageRecord(requestedBy, eventName, "apply")
7674
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
7775
applyPerformed, err := diggerExecutor.Apply(prNumber)
7876
if err != nil {
@@ -84,13 +82,13 @@ func RunCommandsPerProject(commandsPerProject []models.ProjectCommand, repoOwner
8482
appliesPerProject[projectCommands.ProjectName] = true
8583
}
8684
case "digger unlock":
87-
usage.SendUsageRecord(repoOwner, eventName, "unlock")
85+
usage.SendUsageRecord(requestedBy, eventName, "unlock")
8886
err := diggerExecutor.Unlock(prNumber)
8987
if err != nil {
9088
return false, false, fmt.Errorf("failed to unlock project. %v", err)
9189
}
9290
case "digger lock":
93-
usage.SendUsageRecord(repoOwner, eventName, "lock")
91+
usage.SendUsageRecord(requestedBy, eventName, "lock")
9492
err := diggerExecutor.Lock(prNumber)
9593
if err != nil {
9694
return false, false, fmt.Errorf("failed to lock project. %v", err)
@@ -140,8 +138,7 @@ func MergePullRequest(githubPrService ci.CIService, prNumber int) {
140138
}
141139

142140
type DiggerExecutor struct {
143-
RepoOwner string
144-
RepoName string
141+
ProjectNamespace string
145142
ProjectName string
146143
ProjectPath string
147144
StateEnvVars map[string]string
@@ -201,15 +198,15 @@ func (c CommandRunner) Run(workingDir string, shell string, commands []string) (
201198
}
202199

203200
func (d DiggerExecutor) planFileName() string {
204-
return d.RepoName + "#" + d.ProjectName + ".tfplan"
201+
return d.ProjectNamespace + "#" + d.ProjectName + ".tfplan"
205202
}
206203

207204
func (d DiggerExecutor) localPlanFilePath() string {
208205
return path.Join(d.ProjectPath, d.planFileName())
209206
}
210207

211208
func (d DiggerExecutor) storedPlanFilePath() string {
212-
return path.Join(d.RepoOwner, d.planFileName())
209+
return path.Join(d.ProjectNamespace, d.planFileName())
213210
}
214211

215212
func (d DiggerExecutor) Plan(prNumber int) (bool, error) {

pkg/gitlab/gitlab.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type GitLabContext struct {
2828
ProjectNamespaceId *int `env:"CI_PROJECT_NAMESPACE_ID"`
2929
OpenMergeRequests []string `env:"CI_OPEN_MERGE_REQUESTS"`
3030
Token string `env:"GITLAB_TOKEN"`
31+
GitlabUserName string `env:"GITLAB_USER_NAME"`
3132
DiggerCommand string `env:"DIGGER_COMMAND"`
3233
DiscussionID string `env:"DISCUSSION_ID"`
3334
IsMeargeable bool `env:"IS_MERGEABLE"`
@@ -257,7 +258,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
257258
for _, project := range impactedProjects {
258259
workflow, ok := workflows[project.Workflow]
259260
if !ok {
260-
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
261+
return nil, true, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
261262
}
262263

263264
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
@@ -278,7 +279,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
278279
for _, project := range impactedProjects {
279280
workflow, ok := workflows[project.Workflow]
280281
if !ok {
281-
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
282+
return nil, true, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
282283
}
283284
stateEnvVars, commandEnvVars := configuration.CollectEnvVars(workflow.EnvVars)
284285
commandsPerProject = append(commandsPerProject, models.ProjectCommand{

0 commit comments

Comments
 (0)