Created
June 9, 2018 17:56
-
-
Save wreulicke/d2891f32d5dce9530cc21f069ea0f364 to your computer and use it in GitHub Desktop.
AWS Lambdaでリポジトリの内容を書き換えるサンプル
This file contains 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
package main | |
import ( | |
"encoding/base64" | |
"encoding/json" | |
"fmt" | |
"io/ioutil" | |
"os" | |
"time" | |
"gopkg.in/src-d/go-billy.v4" | |
"gopkg.in/src-d/go-git.v4/plumbing/object" | |
"gopkg.in/src-d/go-git.v4/storage/memory" | |
"github.com/aws/aws-lambda-go/events" | |
"github.com/aws/aws-lambda-go/lambda" | |
jsonpointer "github.com/mattn/go-jsonpointer" | |
"gopkg.in/src-d/go-billy.v4/memfs" | |
"gopkg.in/src-d/go-git.v4" | |
"gopkg.in/src-d/go-git.v4/config" | |
"gopkg.in/src-d/go-git.v4/plumbing" | |
) | |
var token = os.Getenv("GITHUB_ACCESS_TOKEN") | |
var userID = "<your-github-id>" | |
type Request struct { | |
Version string `json:"version"` | |
} | |
func decodeBody(body string) (*Request, error) { | |
var ur Request | |
b, err := base64.StdEncoding.DecodeString(body) | |
if err != nil { | |
return nil, err | |
} | |
err = json.Unmarshal(b, &ur) | |
if err != nil { | |
return nil, err | |
} | |
return &ur, nil | |
} | |
func rewriteVersion(fs billy.Filesystem, version string) (err error) { | |
file, err := fs.Open(".version") | |
if err != nil { | |
return | |
} | |
b, err := ioutil.ReadAll(file) | |
if err != nil { | |
return | |
} | |
err = file.Close() | |
if err != nil { | |
return | |
} | |
var obj interface{} | |
json.Unmarshal(b, &obj) | |
jsonpointer.Set(obj, "/version", version) | |
rb, err := json.MarshalIndent(obj, "", " ") | |
if err != nil { | |
return | |
} | |
err = fs.Remove(".version") | |
if err != nil { | |
return | |
} | |
file, err = fs.OpenFile(".version", os.O_RDWR|os.O_CREATE, 0666) | |
if err != nil { | |
return | |
} | |
_, err = file.Write(rb) | |
if err != nil { | |
return | |
} | |
_, err = file.Write([]byte("\n")) | |
return | |
} | |
func Commit(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { | |
fmt.Printf("request body:%s \n", req.Body) | |
f := memfs.New() | |
repo, err := git.Clone(memory.NewStorage(), f, &git.CloneOptions{ | |
URL: "https://" + userID + ":" + token + "@github.com/<your-user-id>/<your-repoistory>.git", | |
ReferenceName: plumbing.ReferenceName("refs/heads/develop"), | |
}) | |
ur, err := decodeBody(req.Body) | |
if err != nil { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 400, | |
Body: err.Error(), | |
}, nil | |
} | |
if ur.Version == "" { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 400, | |
Body: "version is empty.", | |
}, nil | |
} | |
w, err := repo.Worktree() | |
err = w.Checkout(&git.CheckoutOptions{ | |
Create: true, | |
Branch: "feature/test-update", | |
}) | |
if err != nil { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 500, | |
Body: err.Error(), | |
}, nil | |
} | |
// ファイルを書き換える | |
err = rewriteVersion(f, ur.Version) | |
if err != nil { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 500, | |
Body: err.Error(), | |
}, nil | |
} | |
// Commitする | |
_, err = w.Add(".version") | |
ref := plumbing.ReferenceName("feature/test-update") | |
if err == nil { | |
hash, _ := w.Commit("test", &git.CommitOptions{ | |
Author: &object.Signature{ | |
Name: "<your-github-id>", | |
Email: "<your-mail-address>", | |
When: time.Now(), | |
}, | |
}) | |
repo.Storer.SetReference(plumbing.NewReferenceFromStrings("feature/test-update", hash.String())) | |
} | |
if err != nil { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 500, | |
Body: err.Error(), | |
}, nil | |
} | |
// Pushする | |
remote, err := repo.Remote("origin") | |
if err == nil { | |
err = remote.Push(&git.PushOptions{ | |
Progress: os.Stdout, | |
RefSpecs: []config.RefSpec{ | |
config.RefSpec(ref + ":" + plumbing.ReferenceName("refs/heads/feature/test-update")), | |
}, | |
}) | |
} | |
if err != nil { | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 500, | |
Body: err.Error(), | |
}, nil | |
} | |
return events.APIGatewayProxyResponse{ | |
StatusCode: 200, | |
Body: "updated version", | |
}, nil | |
} | |
func main() { | |
lambda.Start(Commit) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment