Last active
December 27, 2016 17:13
-
-
Save rodkranz/da5cd3f8e275a9c8f34d845fa32cb978 to your computer and use it in GitHub Desktop.
WebHook to execute "git pull".
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright 2016 Kranz. All rights reserved. | |
// Use of this source code is governed by a MIT-style | |
// license that can be found in the LICENSE file. | |
package main | |
import ( | |
"fmt" | |
"net/http" | |
"os/exec" | |
"log" | |
"os" | |
"gopkg.in/yaml.v2" | |
"errors" | |
"io/ioutil" | |
"strings" | |
) | |
var ( | |
FOLDER_FAKES string = "fakes" | |
PWD string | |
Conf *Setting | |
// Logger | |
logger *log.Logger | |
) | |
// example | |
// settings.yaml | |
// ` | |
// Projects: | |
// - {Name: StockEquip, Secret: bananaGameDeixeMePassar, Folder: fake-api.stockequip.com} | |
// ` | |
type Setting struct { | |
Projects []Project `yaml:"Projects"` | |
} | |
func (s *Setting) SearchSecret(secret string) (Project, error) { | |
for _, p := range s.Projects { | |
if p.Secret == secret { | |
return p, nil | |
} | |
} | |
return Project{}, errors.New("No Secret found for " + secret + ".") | |
} | |
type Project struct { | |
Name string `yaml:"Name"` | |
Secret string `yaml:"Secret"` | |
Folder string `yaml:"Folder"` | |
} | |
func init() { | |
// set config | |
Conf = &Setting{} | |
data, err := ioutil.ReadFile(fmt.Sprintf("%v/%v", FOLDER_FAKES, "setting.yaml")) | |
if err != nil { | |
log.Fatalf("Error to read config: %v", err) | |
} | |
if err := yaml.Unmarshal(data, Conf); err != nil { | |
log.Fatalf("Error to read config: %v", err) | |
} | |
} | |
func main() { | |
// set log file | |
file, err := os.OpenFile("output.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) | |
if err != nil { | |
log.Fatalf("Failed to open log file: %v", err) | |
} | |
defer file.Close() | |
logger = log.New(file, "LOG: ", log.Ldate|log.Ltime) | |
if PWD, err = os.Getwd(); err != nil { | |
logger.Fatalf("Error to get PWD: %v", err.Error()) | |
} | |
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | |
secret := r.Header.Get("X-Gitlab-Token") | |
if len(secret) == 0 { | |
logger.Println("No secret key found.") | |
fmt.Fprint(w, "No secret key found.") | |
return | |
} | |
pjt, err := Conf.SearchSecret(secret) | |
if err != nil { | |
logger.Println(err.Error()) | |
fmt.Fprint(w, err.Error()) | |
return | |
} | |
fakeDir := fmt.Sprintf("%v/%v/%v", PWD, FOLDER_FAKES, pjt.Folder) | |
if _, err := os.Stat(fakeDir); os.IsNotExist(err) { | |
logger.Printf("Project folder doesn't exists [%s].\n", fakeDir) | |
fmt.Fprintf(w, "Project folder doesn't exists [%s].", fakeDir) | |
return | |
} | |
var cmdOut []byte | |
// TODO: fix this parameters | |
// cmdArgs := []string{"--work-tree=" + fakeDir, "--git-dir=" + fakeDir + "/.git", "pull"} // Git 1.7 | |
cmdArgs := []string{"-C", fakeDir, "pull"} // GIT 2.1+ | |
if cmdOut, err = exec.Command("git", cmdArgs...).Output(); err != nil { | |
logger.Printf("Command executed was: %v %v\n", "git", strings.Join(cmdArgs, " ")) | |
logger.Printf("There was an error running git pull command: %v\n", err) | |
fmt.Fprintf(w, "There was an error running git pull command: %v\n", err) | |
return | |
} | |
logger.Printf("Project [name=%s] %s", pjt.Name, cmdOut) | |
fmt.Fprintf(w, "Project [name=%s] %s", pjt.Name, cmdOut) | |
return | |
}) | |
http.ListenAndServe(":9091", nil) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment