Skip to content

Commit

Permalink
run npm publish if deployment event caught
Browse files Browse the repository at this point in the history
  • Loading branch information
aereal committed Feb 13, 2020
1 parent 61455da commit daadde6
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 0 deletions.
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -5,6 +5,7 @@ go 1.13
require (
github.com/aws/aws-lambda-go v1.13.3
github.com/aws/aws-sdk-go-v2 v0.18.0
github.com/google/go-github/v29 v29.0.2
github.com/kr/pretty v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/mackerelio/mackerel-client-go v0.9.0
Expand Down
10 changes: 10 additions & 0 deletions go.sum
Expand Up @@ -9,7 +9,13 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts=
github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
Expand All @@ -32,18 +38,22 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc h1:a3CU5tJYVj92DY2LaA1kUkrsqD5/3mLDhx2NcNqyW+0=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
133 changes: 133 additions & 0 deletions tools/deployment/handle_deployment.go
@@ -0,0 +1,133 @@
package main

import (
"encoding/json"
"fmt"
"io"
"log"
"os"
"os/exec"
"strings"

"github.com/google/go-github/v29/github"
)

func main() {
if err := run(os.Args); err != nil {
log.Printf("! %s", err)
os.Exit(1)
}
}

func run(argv []string) error {
if err := handleEvent(os.Stdin); err != nil {
return fmt.Errorf("failed to handle event: %w", err)
}
return nil
}

type deploymentPayload struct {
NextVersion string `json:"nextVersion"`
}

func handleEvent(input io.Reader) error {
var event github.DeploymentEvent
if err := json.NewDecoder(input).Decode(&event); err != nil {
return fmt.Errorf("failed to parse input as DeploymentEvent: %w", err)
}

deployment := event.GetDeployment()
var payloadJSON string
if err := json.Unmarshal(deployment.Payload, &payloadJSON); err != nil {
return fmt.Errorf("failed to parse DeploymentEvent.Deployment.Payload: %w", err)
}
payload := new(deploymentPayload)
if err := json.Unmarshal([]byte(payloadJSON), payload); err != nil {
return fmt.Errorf("failed to parse DeploymentEvent.Deployment.Payload: %w", err)
}
log.Printf("deployment (task:%q) requested on ref:%q sha:%q payload:%#v", deployment.GetTask(), deployment.GetRef(), deployment.GetSHA(), payload)

packageJSONPath := "package.json"
if err := bumpVersion(packageJSONPath, payload.NextVersion); err != nil {
return fmt.Errorf("failed to bump version: %w", err)
}

dryRun := os.Getenv("DO_CHANGE") == ""
if err := publishToNPM(dryRun); err != nil {
return fmt.Errorf("failed to publish package to NPM: %w", err)
}

return nil
}

type pkgJSON map[string]json.RawMessage

func bumpVersion(pkgJSONPath string, nextVersion string) error {
forRead, err := os.Open(pkgJSONPath)
if err != nil {
return fmt.Errorf("cannot open %s: %w", pkgJSONPath, err)
}
var pkgJSON pkgJSON
if err := json.NewDecoder(forRead).Decode(&pkgJSON); err != nil {
return fmt.Errorf("failed to decode package.json: %w", err)
}
if err := forRead.Close(); err != nil {
return fmt.Errorf("cannot close %s: %w", pkgJSONPath, err)
}

if string(pkgJSON["version"]) == fmt.Sprintf("%q", nextVersion) {
return fmt.Errorf("version not changed; current:%s next:%q", string(pkgJSON["version"]), nextVersion)
}

forUpdate, err := os.Create(pkgJSONPath)
if err != nil {
return fmt.Errorf("cannot open %s for write: %w", pkgJSONPath, err)
}
log.Printf("bump version to %q", nextVersion)
pkgJSON["version"] = json.RawMessage(fmt.Sprintf("%q", nextVersion))
enc := json.NewEncoder(forUpdate)
enc.SetEscapeHTML(false)
enc.SetIndent("", " ")
if err := enc.Encode(&pkgJSON); err != nil {
return fmt.Errorf("cannot update %s: %w", pkgJSONPath, err)
}

if err := doCommand("git", "add", "-u", pkgJSONPath); err != nil {
return fmt.Errorf("failed to git add: %w", err)
}
if err := doCommand("git", "commit", "-m", fmt.Sprintf("bump version to %s", nextVersion)); err != nil {
return fmt.Errorf("failed to git commit (maybe any files not staged): %w", err)
}

return nil
}

func publishToNPM(dryRun bool) error {
args := []string{"publish", "--access", "publish"}
if dryRun {
args = append(args, "--dry-run")
}
if err := doCommand("npm", args...); err != nil {
return fmt.Errorf("failed execute npm publish: %w", err)
}
return nil
}

func pushBumpedVersion(dryRun bool, remote, branch string) error {
args := []string{"push", remote, branch}
if dryRun {
args = append(args, "--dry-run")
}
if err := doCommand("git", args...); err != nil {
return fmt.Errorf("failed to git push: %w", err)
}
return nil
}

func doCommand(name string, arg ...string) error {
log.Printf("run command: %s %s", name, strings.Join(arg, " "))
cmd := exec.Command(name, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}

0 comments on commit daadde6

Please sign in to comment.