You've already forked go-semantic-release
feat(hooks): add pre and post release hooks
This commit is contained in:
71
internal/hooks/hooks.go
Normal file
71
internal/hooks/hooks.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package hooks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
//Hooks struct
|
||||||
|
type Hooks struct {
|
||||||
|
version *shared.ReleaseVersion
|
||||||
|
config *config.ReleaseConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// New hooks struct
|
||||||
|
func New(config *config.ReleaseConfig, version *shared.ReleaseVersion) *Hooks {
|
||||||
|
return &Hooks{
|
||||||
|
config: config,
|
||||||
|
version: version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PreRelease runs before creating release
|
||||||
|
func (h *Hooks) PreRelease() error {
|
||||||
|
log.Infof("Run pre release hooks")
|
||||||
|
for _, cmd := range h.config.Hooks.PreRelease {
|
||||||
|
log.Debugf("Run %s", cmd)
|
||||||
|
err := h.runCommand(cmd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PostRelease runs after creating release
|
||||||
|
func (h *Hooks) PostRelease() error {
|
||||||
|
log.Infof("Run post release hooks")
|
||||||
|
for _, cmd := range h.config.Hooks.PostRelease {
|
||||||
|
err := h.runCommand(cmd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Hooks) runCommand(command string) error {
|
||||||
|
|
||||||
|
splittedCmd := strings.Split(strings.ReplaceAll(command, "$RELEASE_VERSION", h.version.Next.Version.String()), " ")
|
||||||
|
|
||||||
|
cmd := exec.Command(splittedCmd[0], splittedCmd[1:]...)
|
||||||
|
|
||||||
|
cmdReader, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(cmdReader)
|
||||||
|
go func() {
|
||||||
|
for scanner.Scan() {
|
||||||
|
log.WithField("cmd", splittedCmd[0]).Infof("%s\n", scanner.Text())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return cmd.Run()
|
||||||
|
}
|
||||||
103
internal/hooks/hooks_test.go
Normal file
103
internal/hooks/hooks_test.go
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package hooks_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/Masterminds/semver"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/hooks"
|
||||||
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||||
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPreReleaseHooks(t *testing.T) {
|
||||||
|
|
||||||
|
os.Setenv("GO_WANT_HELPER_PROCESS", "1")
|
||||||
|
hooks := hooks.New(&config.ReleaseConfig{
|
||||||
|
Hooks: config.Hooks{
|
||||||
|
PreRelease: []string{
|
||||||
|
"go test -test.run=TestHelperProcess -- " + "$RELEASE_VERSION",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&shared.ReleaseVersion{
|
||||||
|
Next: shared.ReleaseVersionEntry{
|
||||||
|
Version: createVersion("1.0.0"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
err := hooks.PreRelease()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
os.Unsetenv("GO_WANT_HELPER_PROCESS")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPreReleaseHooksError(t *testing.T) {
|
||||||
|
|
||||||
|
hooks := hooks.New(&config.ReleaseConfig{
|
||||||
|
Hooks: config.Hooks{
|
||||||
|
PreRelease: []string{
|
||||||
|
"exit 1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&shared.ReleaseVersion{
|
||||||
|
Next: shared.ReleaseVersionEntry{
|
||||||
|
Version: createVersion("1.0.0"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
err := hooks.PreRelease()
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPostReleaseHooks(t *testing.T) {
|
||||||
|
|
||||||
|
os.Setenv("GO_WANT_HELPER_PROCESS", "1")
|
||||||
|
hooks := hooks.New(&config.ReleaseConfig{
|
||||||
|
Hooks: config.Hooks{
|
||||||
|
PostRelease: []string{
|
||||||
|
"go test -test.run=TestHelperProcess -- " + "$RELEASE_VERSION",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&shared.ReleaseVersion{
|
||||||
|
Next: shared.ReleaseVersionEntry{
|
||||||
|
Version: createVersion("1.0.0"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
err := hooks.PostRelease()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
os.Unsetenv("GO_WANT_HELPER_PROCESS")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPostReleaseHooksError(t *testing.T) {
|
||||||
|
|
||||||
|
hooks := hooks.New(&config.ReleaseConfig{
|
||||||
|
Hooks: config.Hooks{
|
||||||
|
PostRelease: []string{
|
||||||
|
"exit 1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&shared.ReleaseVersion{
|
||||||
|
Next: shared.ReleaseVersionEntry{
|
||||||
|
Version: createVersion("1.0.0"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
err := hooks.PostRelease()
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHelperProcess(t *testing.T) {
|
||||||
|
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.Equal(t, "1.0.0", os.Args[3])
|
||||||
|
}
|
||||||
|
|
||||||
|
func createVersion(version string) *semver.Version {
|
||||||
|
ver, _ := semver.NewVersion(version)
|
||||||
|
return ver
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user