Skip to content

Instantly share code, notes, and snippets.

@rodkranz
Last active December 27, 2016 17:13
Show Gist options
  • Save rodkranz/da5cd3f8e275a9c8f34d845fa32cb978 to your computer and use it in GitHub Desktop.
Save rodkranz/da5cd3f8e275a9c8f34d845fa32cb978 to your computer and use it in GitHub Desktop.
WebHook to execute "git pull".
// 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