Skip to content

Instantly share code, notes, and snippets.

@wreulicke
Created June 9, 2018 17:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save wreulicke/d2891f32d5dce9530cc21f069ea0f364 to your computer and use it in GitHub Desktop.
Save wreulicke/d2891f32d5dce9530cc21f069ea0f364 to your computer and use it in GitHub Desktop.
AWS Lambdaでリポジトリの内容を書き換えるサンプル
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