@@ -2,12 +2,16 @@ package main
22
33import (
44 "context"
5+ "digger/pkg/azure"
56 "digger/pkg/configuration"
67 "digger/pkg/digger"
78 "digger/pkg/gcp"
89 dg_github "digger/pkg/github"
10+ github_models "digger/pkg/github/models"
911 "digger/pkg/gitlab"
12+ "digger/pkg/locking"
1013 "digger/pkg/models"
14+ "digger/pkg/storage"
1115 "digger/pkg/usage"
1216 "digger/pkg/utils"
1317 "fmt"
@@ -17,7 +21,7 @@ import (
1721 "strings"
1822)
1923
20- func gitHubCI (lock utils .Lock ) {
24+ func gitHubCI (lock locking .Lock ) {
2125 println ("Using GitHub." )
2226 githubRepositoryOwner := os .Getenv ("GITHUB_REPOSITORY_OWNER" )
2327 if githubRepositoryOwner != "" {
@@ -36,7 +40,7 @@ func gitHubCI(lock utils.Lock) {
3640 reportErrorAndExit (githubRepositoryOwner , "GITHUB_CONTEXT is not defined" , 2 )
3741 }
3842
39- parsedGhContext , err := models .GetGitHubContext (ghContext )
43+ parsedGhContext , err := github_models .GetGitHubContext (ghContext )
4044 if err != nil {
4145 reportErrorAndExit (githubRepositoryOwner , fmt .Sprintf ("Failed to parse GitHub context. %s" , err ), 3 )
4246 }
@@ -50,7 +54,7 @@ func gitHubCI(lock utils.Lock) {
5054 }
5155 println ("Digger config read successfully" )
5256
53- lock , err = utils .GetLock ()
57+ lock , err = locking .GetLock ()
5458 if err != nil {
5559 reportErrorAndExit (githubRepositoryOwner , fmt .Sprintf ("Failed to create lock provider. %s" , err ), 5 )
5660 }
@@ -62,23 +66,26 @@ func gitHubCI(lock utils.Lock) {
6266 repoOwner , repositoryName := splitRepositoryName [0 ], splitRepositoryName [1 ]
6367 githubPrService := dg_github .NewGitHubService (ghToken , repositoryName , repoOwner )
6468
65- impactedProjects , requestedProject , prNumber , err := digger .ProcessGitHubEvent (ghEvent , diggerConfig , githubPrService )
69+ impactedProjects , requestedProject , prNumber , err := dg_github .ProcessGitHubEvent (ghEvent , diggerConfig , githubPrService )
6670 if err != nil {
6771 reportErrorAndExit (githubRepositoryOwner , fmt .Sprintf ("Failed to process GitHub event. %s" , err ), 6 )
6872 }
6973 logImpactedProjects (impactedProjects , prNumber )
7074 println ("GitHub event processed successfully" )
7175
72- if digger .CheckIfHelpComment (ghEvent ) {
76+ if dg_github .CheckIfHelpComment (ghEvent ) {
7377 reply := utils .GetCommands ()
74- githubPrService .PublishComment (prNumber , reply )
78+ err := githubPrService .PublishComment (prNumber , reply )
79+ if err != nil {
80+ reportErrorAndExit (githubRepositoryOwner , "Failed to publish help command output" , 1 )
81+ }
7582 }
7683
7784 if len (impactedProjects ) == 0 {
7885 reportErrorAndExit (githubRepositoryOwner , "No projects impacted" , 0 )
7986 }
8087
81- commandsToRunPerProject , coversAllImpactedProjects , err := digger .ConvertGithubEventToCommands (ghEvent , impactedProjects , requestedProject , diggerConfig .Workflows )
88+ commandsToRunPerProject , coversAllImpactedProjects , err := dg_github .ConvertGithubEventToCommands (ghEvent , impactedProjects , requestedProject , diggerConfig .Workflows )
8289 if err != nil {
8390 reportErrorAndExit (githubRepositoryOwner , fmt .Sprintf ("Failed to convert GitHub event to commands. %s" , err ), 7 )
8491 }
@@ -108,7 +115,7 @@ func gitHubCI(lock utils.Lock) {
108115 }()
109116}
110117
111- func gitLabCI (lock utils .Lock ) {
118+ func gitLabCI (lock locking .Lock ) {
112119 println ("Using GitLab." )
113120
114121 projectNamespace := os .Getenv ("CI_PROJECT_NAMESPACE" )
@@ -170,6 +177,7 @@ func gitLabCI(lock utils.Lock) {
170177 fmt .Printf ("command: %s, project: %s\n " , strings .Join (v .Commands , ", " ), v .ProjectName )
171178 }
172179
180+ //planStorage := newPlanStorage(ghToken, repoOwner, repositoryName, prNumber)
173181 planStorage := newPlanStorage (gitlabToken , projectNamespace , projectName , * gitLabContext .MergeRequestIId )
174182
175183 allAppliesSuccess , err := gitlab .RunCommandsPerProject (commandsToRunPerProject , * gitLabContext , diggerConfig , gitlabService , lock , planStorage , currentDir )
@@ -194,6 +202,77 @@ func gitLabCI(lock utils.Lock) {
194202 }()
195203}
196204
205+ func azureCI (lock locking.Lock ) {
206+ fmt .Println ("> Azure CI detected" )
207+ azureContext := os .Getenv ("AZURE_CONTEXT" )
208+ azureToken := os .Getenv ("AZURE_TOKEN" )
209+ if azureToken == "" {
210+ fmt .Println ("AZURE_TOKEN is empty" )
211+ }
212+ parsedAzureContext , err := azure .GetAzureReposContext (azureContext )
213+ if err != nil {
214+ fmt .Printf ("failed to parse Azure context. %s\n " , err .Error ())
215+ os .Exit (4 )
216+ }
217+
218+ walker := configuration.FileSystemDirWalker {}
219+ currentDir , err := os .Getwd ()
220+ if err != nil {
221+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to get current dir. %s" , err ), 4 )
222+ }
223+ fmt .Printf ("main: working dir: %s \n " , currentDir )
224+
225+ diggerConfig , err := configuration .NewDiggerConfig (currentDir , & walker )
226+ if err != nil {
227+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to read Digger config. %s" , err ), 4 )
228+ }
229+ fmt .Println ("Digger config read successfully" )
230+
231+ azureService , err := azure .NewAzureReposService (azureToken , parsedAzureContext .BaseUrl , parsedAzureContext .ProjectName , parsedAzureContext .RepositoryId )
232+ if err != nil {
233+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to initialise azure service. %s" , err ), 5 )
234+ }
235+
236+ impactedProjects , requestedProject , prNumber , err := azure .ProcessAzureReposEvent (parsedAzureContext .Event , diggerConfig , azureService )
237+ if err != nil {
238+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to process Azure event. %s" , err ), 6 )
239+ }
240+ fmt .Println ("Azure event processed successfully" )
241+
242+ commandsToRunPerProject , coversAllImpactedProjects , err := azure .ConvertAzureEventToCommands (parsedAzureContext , impactedProjects , requestedProject , diggerConfig .Workflows )
243+ if err != nil {
244+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to convert event to command. %s" , err ), 7 )
245+
246+ }
247+ fmt .Println (fmt .Sprintf ("Azure event converted to commands successfully: %v" , commandsToRunPerProject ))
248+
249+ for _ , v := range commandsToRunPerProject {
250+ fmt .Printf ("command: %s, project: %s\n " , strings .Join (v .Commands , ", " ), v .ProjectName )
251+ }
252+
253+ var planStorage storage.PlanStorage
254+
255+ allAppliesSuccess , atLeastOneApply , err := digger .RunCommandsPerProject (commandsToRunPerProject , parsedAzureContext .ProjectName , parsedAzureContext .ProjectName , parsedAzureContext .EventType , prNumber , azureService , lock , planStorage , currentDir )
256+ if err != nil {
257+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Failed to run commands. %s" , err ), 8 )
258+ }
259+
260+ if diggerConfig .AutoMerge && allAppliesSuccess && atLeastOneApply && coversAllImpactedProjects {
261+ digger .MergePullRequest (azureService , prNumber )
262+ fmt .Println ("PR merged successfully" )
263+ }
264+
265+ println ("Commands executed successfully" )
266+
267+ reportErrorAndExit (parsedAzureContext .BaseUrl , "Digger finished successfully" , 0 )
268+
269+ defer func () {
270+ if r := recover (); r != nil {
271+ reportErrorAndExit (parsedAzureContext .BaseUrl , fmt .Sprintf ("Panic occurred. %s" , r ), 1 )
272+ }
273+ }()
274+ }
275+
197276/*
198277Exit codes:
1992780 - No errors
@@ -219,7 +298,7 @@ func main() {
219298 os .Exit (0 )
220299 }
221300
222- lock , err := utils .GetLock ()
301+ lock , err := locking .GetLock ()
223302 if err != nil {
224303 fmt .Printf ("Failed to create lock provider. %s\n " , err )
225304 os .Exit (2 )
@@ -232,20 +311,22 @@ func main() {
232311 gitHubCI (lock )
233312 case digger .GitLab :
234313 gitLabCI (lock )
314+ case digger .Azure :
315+ azureCI (lock )
235316 case digger .BitBucket :
236317 case digger .None :
237318 print ("No CI detected." )
238319 os .Exit (10 )
239320 }
240321}
241322
242- func newPlanStorage (ghToken string , repoOwner string , repositoryName string , prNumber int ) utils .PlanStorage {
243- var planStorage utils .PlanStorage
323+ func newPlanStorage (ghToken string , repoOwner string , repositoryName string , prNumber int ) storage .PlanStorage {
324+ var planStorage storage .PlanStorage
244325
245326 uploadDestination := strings .ToLower (os .Getenv ("PLAN_UPLOAD_DESTINATION" ))
246327 if uploadDestination == "github" {
247328 zipManager := utils.Zipper {}
248- planStorage = & utils .GithubPlanStorage {
329+ planStorage = & storage .GithubPlanStorage {
249330 Client : github .NewTokenClient (context .Background (), ghToken ),
250331 Owner : repoOwner ,
251332 RepoName : repositoryName ,
@@ -259,7 +340,7 @@ func newPlanStorage(ghToken string, repoOwner string, repositoryName string, prN
259340 reportErrorAndExit (repoOwner , fmt .Sprintf ("GOOGLE_STORAGE_BUCKET is not defined" ), 9 )
260341 }
261342 bucket := client .Bucket (bucketName )
262- planStorage = & utils .PlanStorageGcp {
343+ planStorage = & storage .PlanStorageGcp {
263344 Client : client ,
264345 Bucket : bucket ,
265346 Context : ctx ,
@@ -279,7 +360,7 @@ func logImpactedProjects(projects []configuration.Project, prNumber int) {
279360 log .Print (logMessage )
280361}
281362
282- func logCommands (projectCommands []digger .ProjectCommand ) {
363+ func logCommands (projectCommands []models .ProjectCommand ) {
283364 logMessage := fmt .Sprintf ("Following commands are going to be executed:\n " )
284365 for _ , pc := range projectCommands {
285366 logMessage += fmt .Sprintf ("project: %s: commands: " , pc .ProjectName )
@@ -292,7 +373,7 @@ func logCommands(projectCommands []digger.ProjectCommand) {
292373}
293374
294375func reportErrorAndExit (repoOwner string , message string , exitCode int ) {
295- fmt .Printf (message )
376+ fmt .Println (message )
296377 err := usage .SendLogRecord (repoOwner , message )
297378 if err != nil {
298379 fmt .Printf ("Failed to send log record. %s\n " , err )
0 commit comments