| 
				
			 | 
			
			
				@@ -12,6 +12,8 @@ import ( 
			 | 
		
	
		
			
			| 
				12
			 | 
			
				12
			 | 
			
			
				 	"gopkg.in/go-playground/webhooks.v3/gitlab" 
			 | 
		
	
		
			
			| 
				13
			 | 
			
				13
			 | 
			
			
				 ) 
			 | 
		
	
		
			
			| 
				14
			 | 
			
				14
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				15
			 | 
			
			
				+// SetupWebhook creates and exposes a GitLab webhook using a given configuration. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				16
			 | 
			
			
				+// Returns an error if the webhook couldn't be set up. 
			 | 
		
	
		
			
			| 
				15
			 | 
			
				17
			 | 
			
			
				 func SetupWebhook(cfg *config.Config) error { 
			 | 
		
	
		
			
			| 
				16
			 | 
			
				18
			 | 
			
			
				 	hook := gitlab.New(&gitlab.Config{ 
			 | 
		
	
		
			
			| 
				17
			 | 
			
				19
			 | 
			
			
				 		Secret: cfg.Webhook.Secret, 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -25,27 +27,33 @@ func SetupWebhook(cfg *config.Config) error { 
			 | 
		
	
		
			
			| 
				25
			 | 
			
				27
			 | 
			
			
				 	) 
			 | 
		
	
		
			
			| 
				26
			 | 
			
				28
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				27
			 | 
			
				29
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				30
			 | 
			
			
				+// HandlePush is called each time a push event is sent by GitLab on the webhook. 
			 | 
		
	
		
			
			| 
				28
			 | 
			
				31
			 | 
			
			
				 func HandlePush(payload interface{}, header webhooks.Header) { 
			 | 
		
	
		
			
			| 
				29
			 | 
			
				32
			 | 
			
			
				 	var err error 
			 | 
		
	
		
			
			| 
				30
			 | 
			
				33
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				34
			 | 
			
			
				+	// Process the payload using the right structure 
			 | 
		
	
		
			
			| 
				31
			 | 
			
				35
			 | 
			
			
				 	pl := payload.(gitlab.PushEventPayload) 
			 | 
		
	
		
			
			| 
				32
			 | 
			
				36
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				37
			 | 
			
			
				+	// Clone or pull the repository 
			 | 
		
	
		
			
			| 
				33
			 | 
			
				38
			 | 
			
			
				 	if _, err = git.Sync(cfg.Git); err != nil { 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				39
			 | 
			
			
				 		panic(err) 
			 | 
		
	
		
			
			| 
				35
			 | 
			
				40
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				36
			 | 
			
				41
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				+	// Iterate over the commits descriptions from the payload 
			 | 
		
	
		
			
			| 
				37
			 | 
			
				43
			 | 
			
			
				 	for _, commit := range pl.Commits { 
			 | 
		
	
		
			
			| 
				38
			 | 
			
				44
			 | 
			
			
				 		// We don't want to process commits made by the puller 
			 | 
		
	
		
			
			| 
				39
			 | 
			
				45
			 | 
			
			
				 		if commit.Author.Email == cfg.Git.CommitsAuthor.Email { 
			 | 
		
	
		
			
			| 
				40
			 | 
			
				46
			 | 
			
			
				 			continue 
			 | 
		
	
		
			
			| 
				41
			 | 
			
				47
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				42
			 | 
			
				48
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+		// Push all added files 
			 | 
		
	
		
			
			| 
				43
			 | 
			
				50
			 | 
			
			
				 		for _, addedFile := range commit.Added { 
			 | 
		
	
		
			
			| 
				44
			 | 
			
				51
			 | 
			
			
				 			if err = pushFile(addedFile); err != nil { 
			 | 
		
	
		
			
			| 
				45
			 | 
			
				52
			 | 
			
			
				 				panic(err) 
			 | 
		
	
		
			
			| 
				46
			 | 
			
				53
			 | 
			
			
				 			} 
			 | 
		
	
		
			
			| 
				47
			 | 
			
				54
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				48
			 | 
			
				55
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+		// Push all modified files 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				57
			 | 
			
			
				 		for _, modifiedFile := range commit.Modified { 
			 | 
		
	
		
			
			| 
				50
			 | 
			
				58
			 | 
			
			
				 			if err = pushFile(modifiedFile); err != nil { 
			 | 
		
	
		
			
			| 
				51
			 | 
			
				59
			 | 
			
			
				 				panic(err) 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -63,6 +71,10 @@ func HandlePush(payload interface{}, header webhooks.Header) { 
			 | 
		
	
		
			
			| 
				63
			 | 
			
				71
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				64
			 | 
			
				72
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				65
			 | 
			
				73
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				74
			 | 
			
			
				+// pushFile pushes the content of a given file to the Grafana API in order to 
			 | 
		
	
		
			
			| 
				
			 | 
			
				75
			 | 
			
			
				+// create or update a dashboard. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				76
			 | 
			
			
				+// Returns an error if there was an issue reading the file or sending its content 
			 | 
		
	
		
			
			| 
				
			 | 
			
				77
			 | 
			
			
				+// to the Grafana instance. 
			 | 
		
	
		
			
			| 
				66
			 | 
			
				78
			 | 
			
			
				 func pushFile(filename string) error { 
			 | 
		
	
		
			
			| 
				67
			 | 
			
				79
			 | 
			
			
				 	filePath := cfg.Git.ClonePath + "/" + filename 
			 | 
		
	
		
			
			| 
				68
			 | 
			
				80
			 | 
			
			
				 	fileContent, err := ioutil.ReadFile(filePath) 
			 |