feat(ci): check if running on a ci, else skip release

This commit is contained in:
Nightapes
2019-07-15 21:20:44 +02:00
parent e3b54c63b0
commit 13afcea8a0
5 changed files with 169 additions and 35 deletions

44
internal/ci/ci.go Normal file
View File

@@ -0,0 +1,44 @@
package ci
import (
"fmt"
"github.com/Nightapes/go-semantic-release/internal/gitutil"
log "github.com/sirupsen/logrus"
)
//ProviderConfig struct
type ProviderConfig struct {
IsPR bool
PR string
PRBranch string
Branch string
Tag string
Commit string
BuildURL string
Service string
Name string
}
//Service interface
type Service interface {
Detect() (*ProviderConfig, error)
}
//GetCIProvider get provider
func GetCIProvider(gitUtil *gitutil.GitUtil) (*ProviderConfig, error) {
services := []Service{
Travis{},
Git{gitUtil: gitUtil}, // GIt must be the last option to check
}
for _, service := range services {
config, err := service.Detect()
if err == nil {
log.Infof("Found CI: %s", config.Name)
return config, nil
}
log.Debugf("%s", err.Error())
}
return nil, fmt.Errorf("could not find any CI, if running locally set env CI=true")
}

38
internal/ci/git.go Normal file
View File

@@ -0,0 +1,38 @@
package ci
import (
"fmt"
"github.com/Nightapes/go-semantic-release/internal/gitutil"
"os"
)
//Git struct
type Git struct {
gitUtil *gitutil.GitUtil
}
//Detect if on Git
func (t Git) Detect() (*ProviderConfig, error) {
if _, exists := os.LookupEnv("CI"); !exists {
return nil, fmt.Errorf("running not git only")
}
hash, err := t.gitUtil.GetHash()
if err != nil {
return nil, err
}
currentBranch, err := t.gitUtil.GetBranch()
if err != nil {
return nil, err
}
return &ProviderConfig{
Service: "Git",
Name: "Git only",
Commit: hash,
Branch: currentBranch,
IsPR: false,
}, nil
}

39
internal/ci/travis.go Normal file
View File

@@ -0,0 +1,39 @@
package ci
import (
"fmt"
log "github.com/sirupsen/logrus"
"os"
)
//Travis struct
type Travis struct{}
//Detect if on travis
func (t Travis) Detect() (*ProviderConfig, error) {
if _, exists := os.LookupEnv("TRAVIS"); !exists {
return nil, fmt.Errorf("not running on travis")
}
isPR := false
value := os.Getenv("TRAVIS_PULL_REQUEST")
if value == "false" {
log.Debugf("TRAVIS_PULL_REQUEST=%s, not running on pr", value)
} else {
isPR = true
}
return &ProviderConfig{
Service: "travis",
Name: "Travis CI",
Commit: os.Getenv("TRAVIS_COMMIT"),
Tag: os.Getenv("TRAVIS_TAG"),
BuildURL: os.Getenv("TRAVIS_BUILD_WEB_URL"),
Branch: os.Getenv("TRAVIS_BRANCH"),
IsPR: isPR,
PRBranch: os.Getenv("TRAVIS_PULL_REQUEST_BRANCH"),
}, nil
}

View File

@@ -100,7 +100,7 @@ func (g *GitUtil) GetLastVersion() (*semver.Version, string, error) {
log.Debugf("Add tag %s", p.Name().Short()) log.Debugf("Add tag %s", p.Name().Short())
tags = append(tags, v) tags = append(tags, v)
} else { } else {
log.Debugf("Found tag %s, but is not annotated, skip", err.Error()) log.Debugf("Found tag, but is not annotated, skip")
} }
} else { } else {
log.Debugf("Tag %s is not a valid version, skip", p.Name().Short()) log.Debugf("Tag %s is not a valid version, skip", p.Name().Short())

View File

@@ -1,12 +1,14 @@
package semanticrelease package semanticrelease
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"strings" "strings"
"github.com/Masterminds/semver" "github.com/Masterminds/semver"
"github.com/Nightapes/go-semantic-release/internal/analyzer" "github.com/Nightapes/go-semantic-release/internal/analyzer"
"github.com/Nightapes/go-semantic-release/internal/changelog" "github.com/Nightapes/go-semantic-release/internal/changelog"
"github.com/Nightapes/go-semantic-release/internal/ci"
"github.com/Nightapes/go-semantic-release/internal/gitutil" "github.com/Nightapes/go-semantic-release/internal/gitutil"
"github.com/Nightapes/go-semantic-release/internal/releaser" "github.com/Nightapes/go-semantic-release/internal/releaser"
"github.com/Nightapes/go-semantic-release/internal/releaser/util" "github.com/Nightapes/go-semantic-release/internal/releaser/util"
@@ -52,14 +54,22 @@ func New(c *config.ReleaseConfig, repository string) (*SemanticRelease, error) {
// GetNextVersion from .version or calculate new from commits // GetNextVersion from .version or calculate new from commits
func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, error) { func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, error) {
hash, err := s.gitutil.GetHash() provider, err := ci.GetCIProvider(s.gitutil)
if err != nil { if err != nil {
return nil, err fakeVersion, _ := semver.NewVersion("0.0.0-fake.0")
log.Warnf("Will not calculate version, set fake version. Could not find CI Provider, if running locally, set env CI=true")
return &shared.ReleaseVersion{
Next: shared.ReleaseVersionEntry{
Commit: "",
Version: fakeVersion,
},
}, nil
} }
log.Debugf("Ignore .version file if exits, %t", force) log.Debugf("Ignore .version file if exits, %t", force)
if !force { if !force {
releaseVersion, err := s.readFromCache(hash) releaseVersion, err := s.readFromCache(provider.Commit)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -69,22 +79,19 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
} }
} }
currentBranch, err := s.gitutil.GetBranch()
if err != nil {
return nil, err
}
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
if err != nil { if err != nil {
return nil, err return nil, err
} }
var newVersion semver.Version var newVersion semver.Version
firstRelease := false
if lastVersion == nil { if lastVersion == nil {
defaultVersion, _ := semver.NewVersion("1.0.0") defaultVersion, _ := semver.NewVersion("1.0.0")
newVersion = *defaultVersion newVersion = *defaultVersion
lastVersion = defaultVersion lastVersion = defaultVersion
firstRelease = true
} else { } else {
newVersion = *lastVersion newVersion = *lastVersion
} }
@@ -103,8 +110,8 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
result := a.Analyze(commits) result := a.Analyze(commits)
isDraft := false isDraft := false
for branch, releaseType := range s.config.Branch { for branch, releaseType := range s.config.Branch {
if currentBranch == branch || strings.HasPrefix(currentBranch, branch) { if provider.Branch == branch || strings.HasPrefix(provider.Branch, branch) {
log.Debugf("Found branch config for branch %s with release type %s", currentBranch, releaseType) log.Debugf("Found branch config for branch %s with release type %s", provider.Branch, releaseType)
switch releaseType { switch releaseType {
case "beta", "alpha": case "beta", "alpha":
isDraft = true isDraft = true
@@ -112,6 +119,7 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
case "rc": case "rc":
newVersion = s.incPrerelease(releaseType, newVersion) newVersion = s.incPrerelease(releaseType, newVersion)
case "release": case "release":
if !firstRelease {
if len(result["major"]) > 0 { if len(result["major"]) > 0 {
newVersion = newVersion.IncMajor() newVersion = newVersion.IncMajor()
} else if len(result["minor"]) > 0 { } else if len(result["minor"]) > 0 {
@@ -122,17 +130,18 @@ func (s *SemanticRelease) GetNextVersion(force bool) (*shared.ReleaseVersion, er
} }
} }
} }
}
releaseVersion := shared.ReleaseVersion{ releaseVersion := shared.ReleaseVersion{
Next: shared.ReleaseVersionEntry{ Next: shared.ReleaseVersionEntry{
Commit: hash, Commit: provider.Commit,
Version: &newVersion, Version: &newVersion,
}, },
Last: shared.ReleaseVersionEntry{ Last: shared.ReleaseVersionEntry{
Commit: lastVersionHash, Commit: lastVersionHash,
Version: lastVersion, Version: lastVersion,
}, },
Branch: currentBranch, Branch: provider.Branch,
Draft: isDraft, Draft: isDraft,
} }
@@ -152,6 +161,12 @@ func (s *SemanticRelease) SetVersion(version string) error {
return err return err
} }
provider, err := ci.GetCIProvider(s.gitutil)
if err != nil {
return fmt.Errorf("will not set version. Could not find CI Provider, if running locally, set env CI=true")
}
lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion()
if err != nil { if err != nil {
return err return err
@@ -160,26 +175,16 @@ func (s *SemanticRelease) SetVersion(version string) error {
lastVersion, _ = semver.NewVersion("1.0.0") lastVersion, _ = semver.NewVersion("1.0.0")
} }
hash, err := s.gitutil.GetHash()
if err != nil {
return err
}
currentBranch, err := s.gitutil.GetBranch()
if err != nil {
return err
}
return s.saveToCache(shared.ReleaseVersion{ return s.saveToCache(shared.ReleaseVersion{
Next: shared.ReleaseVersionEntry{ Next: shared.ReleaseVersionEntry{
Commit: hash, Commit: provider.Commit,
Version: newVersion, Version: newVersion,
}, },
Last: shared.ReleaseVersionEntry{ Last: shared.ReleaseVersionEntry{
Commit: lastVersionHash, Commit: lastVersionHash,
Version: lastVersion, Version: lastVersion,
}, },
Branch: currentBranch, Branch: provider.Branch,
}) })
} }
@@ -211,13 +216,21 @@ func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error {
// Release pusblish release to provider // Release pusblish release to provider
func (s *SemanticRelease) Release(force bool) error { func (s *SemanticRelease) Release(force bool) error {
currentBranch, err := s.gitutil.GetBranch()
provider, err := ci.GetCIProvider(s.gitutil)
if err != nil { if err != nil {
return err log.Debugf("Will not perform a new release. Could not find CI Provider")
return nil
} }
if _, ok := s.config.Branch[currentBranch]; !ok { if provider.IsPR {
log.Debugf("Will not perform a new release. Current %s branch is not configured in release config", currentBranch) log.Debugf("Will not perform a new release. This is a pull request")
return nil
}
if _, ok := s.config.Branch[provider.Branch]; !ok {
log.Debugf("Will not perform a new release. Current %s branch is not configured in release config", provider.Branch)
return nil return nil
} }