You've already forked go-semantic-release
feat(releaser): add git only as releaser, will create a new tag with version only
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
release: 'github'
|
||||
release: "github"
|
||||
github:
|
||||
repo: "go-semantic-release"
|
||||
user: "nightapes"
|
||||
|
||||
@@ -35,7 +35,12 @@ var changelogCmd = &cobra.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository)
|
||||
ignoreConfigChecks, err := cmd.Flags().GetBool("no-checks")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository, !ignoreConfigChecks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -30,7 +30,12 @@ var nextCmd = &cobra.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository)
|
||||
ignoreConfigChecks, err := cmd.Flags().GetBool("no-checks")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository, !ignoreConfigChecks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -28,7 +28,12 @@ var releaseCmd = &cobra.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository)
|
||||
ignoreConfigChecks, err := cmd.Flags().GetBool("no-checks")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository, !ignoreConfigChecks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ func init() {
|
||||
rootCmd.PersistentFlags().StringP("loglevel", "l", "error", "Set loglevel")
|
||||
rootCmd.PersistentFlags().StringP("config", "c", ".release.yml", "Path to config file")
|
||||
rootCmd.PersistentFlags().Bool("no-cache", false, "Ignore cache, don't use in ci build")
|
||||
rootCmd.PersistentFlags().Bool("no-checks", false, "Ignore missing values and envs")
|
||||
}
|
||||
|
||||
func readConfig(file string) *config.ReleaseConfig {
|
||||
|
||||
@@ -26,7 +26,12 @@ var setCmd = &cobra.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository)
|
||||
ignoreConfigChecks, err := cmd.Flags().GetBool("no-checks")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository, !ignoreConfigChecks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -23,7 +23,12 @@ var zipCmd = &cobra.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository)
|
||||
ignoreConfigChecks, err := cmd.Flags().GetBool("no-checks")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s, err := semanticrelease.New(readConfig(config), repository, !ignoreConfigChecks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
5
go.sum
5
go.sum
@@ -55,6 +55,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
@@ -62,6 +63,7 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
|
||||
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
@@ -72,14 +74,17 @@ github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
|
||||
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
|
||||
|
||||
@@ -39,13 +39,13 @@ func ReadAllEnvs() map[string]string {
|
||||
}
|
||||
|
||||
//GetCIProvider get provider
|
||||
func GetCIProvider(gitUtil *gitutil.GitUtil, envs map[string]string) (*ProviderConfig, error) {
|
||||
func GetCIProvider(gitUtil *gitutil.GitUtil, configCheck bool, envs map[string]string) (*ProviderConfig, error) {
|
||||
|
||||
services := []Service{
|
||||
Travis{},
|
||||
GithubActions{},
|
||||
GitlabCI{},
|
||||
Git{gitUtil: gitUtil}, // GIt must be the last option to check
|
||||
Git{gitUtil: gitUtil}, // Git must be the last option to check
|
||||
}
|
||||
|
||||
for _, service := range services {
|
||||
@@ -57,5 +57,9 @@ func GetCIProvider(gitUtil *gitutil.GitUtil, envs map[string]string) (*ProviderC
|
||||
}
|
||||
log.Debugf("%s", err.Error())
|
||||
}
|
||||
return nil, fmt.Errorf("could not find any CI, if running locally set env CI=true")
|
||||
if configCheck {
|
||||
return nil, fmt.Errorf("could not find any CI, if running locally set env CI=true")
|
||||
|
||||
}
|
||||
return Git{gitUtil: gitUtil}.detect(map[string]string{"CI": "true"})
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ func TestCi(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, config := range testConfigs {
|
||||
provider, err := ci.GetCIProvider(gitUtilInMemory, config.envs)
|
||||
provider, err := ci.GetCIProvider(gitUtilInMemory, true, config.envs)
|
||||
assert.Equalf(t, config.hasError, err != nil, "Service %s should have error: %t -> %s", config.service, config.hasError, err)
|
||||
assert.Equalf(t, config.result, provider, "Service %s should have provider", config.service)
|
||||
}
|
||||
|
||||
101
internal/releaser/git/git.go
Normal file
101
internal/releaser/git/git.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package git
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/Nightapes/go-semantic-release/internal/gitutil"
|
||||
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||
"github.com/Nightapes/go-semantic-release/pkg/config"
|
||||
"gopkg.in/src-d/go-git.v4"
|
||||
gitConfig "gopkg.in/src-d/go-git.v4/config"
|
||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
||||
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// GITONLY identifer for git interface
|
||||
const GITONLY = "git"
|
||||
|
||||
// Client type struct
|
||||
type Client struct {
|
||||
config *config.GitProvider
|
||||
log *log.Entry
|
||||
git *gitutil.GitUtil
|
||||
}
|
||||
|
||||
// New initialize a new gitRelease
|
||||
func New(config *config.GitProvider, git *gitutil.GitUtil, checkConfig bool) (*Client, error) {
|
||||
|
||||
logger := log.WithField("releaser", GITONLY)
|
||||
|
||||
if config.Email == "" && checkConfig {
|
||||
return nil, fmt.Errorf("git email not set")
|
||||
}
|
||||
|
||||
if config.Username == "" && checkConfig {
|
||||
return nil, fmt.Errorf("git username not set")
|
||||
}
|
||||
|
||||
if !config.SSH && config.Auth == "" && checkConfig {
|
||||
return nil, fmt.Errorf("git auth not set")
|
||||
}
|
||||
|
||||
if config.SSH {
|
||||
return nil, fmt.Errorf("git ssh not supported yet")
|
||||
}
|
||||
|
||||
return &Client{
|
||||
config: config,
|
||||
log: logger,
|
||||
git: git,
|
||||
}, nil
|
||||
}
|
||||
|
||||
//GetCommitURL for git
|
||||
func (g *Client) GetCommitURL() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
//GetCompareURL for git
|
||||
func (g *Client) GetCompareURL(oldVersion, newVersion string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// CreateRelease creates release on remote
|
||||
func (g *Client) CreateRelease(releaseVersion *shared.ReleaseVersion, generatedChangelog *shared.GeneratedChangelog) error {
|
||||
|
||||
tag := "v" + releaseVersion.Next.Version.String()
|
||||
g.log.Infof("create release with version %s", tag)
|
||||
|
||||
head, err := g.git.Repository.Head()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = g.git.Repository.CreateTag(tag, head.Hash(), &git.CreateTagOptions{Message: "Release " + tag, Tagger: &object.Signature{
|
||||
Name: g.config.Username,
|
||||
Email: g.config.Email,
|
||||
When: time.Now(),
|
||||
}})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
g.log.Infof("Created release")
|
||||
|
||||
return g.git.Repository.Push(&git.PushOptions{
|
||||
Auth: &http.BasicAuth{
|
||||
Username: g.config.Username,
|
||||
Password: g.config.Auth,
|
||||
},
|
||||
RefSpecs: []gitConfig.RefSpec{"refs/tags/*:refs/tags/*"},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
// UploadAssets uploads specified assets
|
||||
func (g *Client) UploadAssets(repoDir string, assets []config.Asset) error {
|
||||
return nil
|
||||
}
|
||||
@@ -29,17 +29,27 @@ type Client struct {
|
||||
}
|
||||
|
||||
// New initialize a new GitHubRelease
|
||||
func New(c *config.GitHubProvider) (*Client, error) {
|
||||
var err error
|
||||
func New(c *config.GitHubProvider, checkConfig bool) (*Client, error) {
|
||||
|
||||
if c.AccessToken, err = util.GetAccessToken("GITHUB_TOKEN"); err != nil {
|
||||
token, err := util.GetAccessToken("GITHUB_TOKEN")
|
||||
if err != nil && checkConfig {
|
||||
return &Client{}, err
|
||||
}
|
||||
c.AccessToken = token
|
||||
ctx := context.Background()
|
||||
httpClient := util.CreateBearerHTTPClient(ctx, c.AccessToken)
|
||||
|
||||
var client *github.Client
|
||||
baseURL := "https://github.com"
|
||||
|
||||
if c.Repo == "" && checkConfig {
|
||||
return nil, fmt.Errorf("github repro is not set")
|
||||
}
|
||||
|
||||
if c.User == "" && checkConfig {
|
||||
return nil, fmt.Errorf("github user is not set")
|
||||
}
|
||||
|
||||
if c.CustomURL == "" {
|
||||
client = github.NewClient(httpClient)
|
||||
} else {
|
||||
@@ -54,7 +64,7 @@ func New(c *config.GitHubProvider) (*Client, error) {
|
||||
context: ctx,
|
||||
baseURL: baseURL,
|
||||
log: log.WithField("releaser", GITHUB),
|
||||
}, err
|
||||
}, nil
|
||||
}
|
||||
|
||||
//GetCommitURL for github
|
||||
@@ -67,26 +77,10 @@ func (g *Client) GetCompareURL(oldVersion, newVersion string) string {
|
||||
return fmt.Sprintf("%s/%s/%s/compare/%s...%s", g.baseURL, g.config.User, g.config.Repo, oldVersion, newVersion)
|
||||
}
|
||||
|
||||
//ValidateConfig for github
|
||||
func (g *Client) ValidateConfig() error {
|
||||
g.log.Debugf("validate GitHub provider config")
|
||||
|
||||
if g.config.Repo == "" {
|
||||
return fmt.Errorf("github Repro is not set")
|
||||
}
|
||||
|
||||
if g.config.User == "" {
|
||||
return fmt.Errorf("github User is not set")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// CreateRelease creates release on remote
|
||||
func (g *Client) CreateRelease(releaseVersion *shared.ReleaseVersion, generatedChangelog *shared.GeneratedChangelog) error {
|
||||
|
||||
tag := releaseVersion.Next.Version.String()
|
||||
tag := "v" + releaseVersion.Next.Version.String()
|
||||
g.log.Debugf("create release with version %s", tag)
|
||||
|
||||
prerelease := releaseVersion.Next.Version.Prerelease() != ""
|
||||
|
||||
@@ -146,7 +146,7 @@ func TestNew(t *testing.T) {
|
||||
os.Setenv("GITHUB_TOKEN", "XXX")
|
||||
}
|
||||
|
||||
_, err := github.New(&testOject.config)
|
||||
_, err := github.New(&testOject.config, true)
|
||||
assert.Equal(t, testOject.valid, err == nil)
|
||||
|
||||
os.Unsetenv("GITHUB_TOKEN")
|
||||
@@ -157,7 +157,7 @@ func TestNew(t *testing.T) {
|
||||
func TestGetCommitURL(t *testing.T) {
|
||||
os.Setenv("GITHUB_TOKEN", "XX")
|
||||
for _, testOject := range testNewClient {
|
||||
client, _ := github.New(&testOject.config)
|
||||
client, _ := github.New(&testOject.config, false)
|
||||
actualURL := client.GetCommitURL()
|
||||
if testOject.config.CustomURL != "" {
|
||||
expectedURL := fmt.Sprintf("%s/%s/%s/commit/{{hash}}", testOject.config.CustomURL, testOject.config.User, testOject.config.Repo)
|
||||
@@ -175,7 +175,7 @@ func TestGetCommitURL(t *testing.T) {
|
||||
func TestGetCompareURL(t *testing.T) {
|
||||
os.Setenv("GITHUB_TOKEN", "XX")
|
||||
for _, testOject := range testNewClient {
|
||||
client, _ := github.New(&testOject.config)
|
||||
client, _ := github.New(&testOject.config, false)
|
||||
actualURL := client.GetCompareURL("1", "2")
|
||||
if testOject.config.CustomURL != "" {
|
||||
expectedURL := fmt.Sprintf("%s/%s/%s/compare/%s...%s", testOject.config.CustomURL, testOject.config.User, testOject.config.Repo, "1", "2")
|
||||
@@ -190,18 +190,6 @@ func TestGetCompareURL(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestValidateConfig(t *testing.T) {
|
||||
os.Setenv("GITHUB_TOKEN", "XX")
|
||||
for _, testOject := range testHelperMethod {
|
||||
client, _ := github.New(&testOject.config)
|
||||
err := client.ValidateConfig()
|
||||
|
||||
assert.Equal(t, testOject.valid, err == nil)
|
||||
|
||||
}
|
||||
os.Unsetenv("GITHUB_TOKEN")
|
||||
}
|
||||
|
||||
func TestCreateRelease(t *testing.T) {
|
||||
os.Setenv("GITHUB_TOKEN", "XX")
|
||||
|
||||
@@ -209,7 +197,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
if testObejct.valid {
|
||||
server := initHTTPServer(testObejct.requestResponseCode, testObejct.requestResponseBody)
|
||||
testObejct.config.CustomURL = server.URL
|
||||
client, _ := github.New(&testObejct.config)
|
||||
client, _ := github.New(&testObejct.config, false)
|
||||
|
||||
err := client.CreateRelease(testObejct.releaseVersion, testObejct.generatedChangelog)
|
||||
if err != nil {
|
||||
@@ -221,7 +209,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
|
||||
} else {
|
||||
testObejct.config.CustomURL = "http://foo"
|
||||
client, _ := github.New(&testObejct.config)
|
||||
client, _ := github.New(&testObejct.config, false)
|
||||
|
||||
err := client.CreateRelease(testObejct.releaseVersion, testObejct.generatedChangelog)
|
||||
if err != nil {
|
||||
|
||||
@@ -34,9 +34,9 @@ type Client struct {
|
||||
}
|
||||
|
||||
// New initialize a new gitlabRelease
|
||||
func New(config *config.GitLabProvider) (*Client, error) {
|
||||
func New(config *config.GitLabProvider, checkConfig bool) (*Client, error) {
|
||||
accessToken, err := util.GetAccessToken(fmt.Sprintf("%s_ACCESS_TOKEN", strings.ToUpper(GITLAB)))
|
||||
if err != nil {
|
||||
if err != nil && checkConfig {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func New(config *config.GitLabProvider) (*Client, error) {
|
||||
|
||||
logger.Debugf("validate gitlab provider config")
|
||||
|
||||
if config.Repo == "" {
|
||||
if config.Repo == "" && checkConfig {
|
||||
return nil, fmt.Errorf("gitlab Repro is not set")
|
||||
}
|
||||
|
||||
@@ -85,16 +85,10 @@ func (g *Client) GetCompareURL(oldVersion, newVersion string) string {
|
||||
return fmt.Sprintf("%s/%s/compare/%s...%s", g.baseURL, g.config.Repo, oldVersion, newVersion)
|
||||
}
|
||||
|
||||
//ValidateConfig for gitlab
|
||||
func (g *Client) ValidateConfig() error {
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// CreateRelease creates release on remote
|
||||
func (g *Client) CreateRelease(releaseVersion *shared.ReleaseVersion, generatedChangelog *shared.GeneratedChangelog) error {
|
||||
|
||||
tag := releaseVersion.Next.Version.String()
|
||||
tag := "v" + releaseVersion.Next.Version.String()
|
||||
g.Release = tag
|
||||
g.log.Infof("create release with version %s", tag)
|
||||
url := fmt.Sprintf("%s/projects/%s/releases", g.apiURL, util.PathEscape(g.config.Repo))
|
||||
|
||||
@@ -24,7 +24,7 @@ func TestGetCommitURL(t *testing.T) {
|
||||
client, err := gitlab.New(&config.GitLabProvider{
|
||||
CustomURL: "https://localhost/",
|
||||
Repo: "test/test",
|
||||
})
|
||||
}, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "https://localhost/test/test/commit/{{hash}}", client.GetCommitURL())
|
||||
}
|
||||
@@ -35,7 +35,7 @@ func TestGetCompareURL(t *testing.T) {
|
||||
client, err := gitlab.New(&config.GitLabProvider{
|
||||
CustomURL: "https://localhost/",
|
||||
Repo: "test/test",
|
||||
})
|
||||
}, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "https://localhost/test/test/compare/1.0.0...1.0.1", client.GetCompareURL("1.0.0", "1.0.1"))
|
||||
}
|
||||
@@ -45,7 +45,7 @@ func TestValidateConfig_EmptyRepro(t *testing.T) {
|
||||
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
|
||||
_, err := gitlab.New(&config.GitLabProvider{
|
||||
CustomURL: "https://localhost/",
|
||||
})
|
||||
}, true)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ func TestValidateConfig_DefaultURL(t *testing.T) {
|
||||
config := &config.GitLabProvider{
|
||||
Repo: "localhost/test",
|
||||
}
|
||||
_, err := gitlab.New(config)
|
||||
_, err := gitlab.New(config, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "https://gitlab.com", config.CustomURL)
|
||||
}
|
||||
@@ -67,7 +67,7 @@ func TestValidateConfig_CustomURL(t *testing.T) {
|
||||
Repo: "/localhost/test/",
|
||||
CustomURL: "https://localhost/",
|
||||
}
|
||||
_, err := gitlab.New(config)
|
||||
_, err := gitlab.New(config, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "https://localhost", config.CustomURL)
|
||||
assert.Equal(t, "localhost/test", config.Repo)
|
||||
@@ -108,7 +108,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
},
|
||||
responseBody: "{}",
|
||||
responseCode: 200,
|
||||
requestBody: `{"tag_name":"2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
requestBody: `{"tag_name":"v2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
valid: true,
|
||||
},
|
||||
{
|
||||
@@ -132,7 +132,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
},
|
||||
responseBody: "{}",
|
||||
responseCode: 500,
|
||||
requestBody: `{"tag_name":"2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
requestBody: `{"tag_name":"v2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
valid: false,
|
||||
},
|
||||
{
|
||||
@@ -157,7 +157,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
},
|
||||
responseCode: 400,
|
||||
responseBody: "{}",
|
||||
requestBody: `{"tag_name":"2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
requestBody: `{"tag_name":"v2.0.0","name":"title","ref":"master","description":"content"}`,
|
||||
valid: false,
|
||||
},
|
||||
}
|
||||
@@ -190,7 +190,7 @@ func TestCreateRelease(t *testing.T) {
|
||||
}
|
||||
os.Setenv("GITLAB_ACCESS_TOKEN", "aToken")
|
||||
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
|
||||
client, err := gitlab.New(&testObject.config)
|
||||
client, err := gitlab.New(&testObject.config, false)
|
||||
assert.NoError(t, err)
|
||||
|
||||
err = client.CreateRelease(testObject.releaseVersion, testObject.generatedChangelog)
|
||||
@@ -317,7 +317,7 @@ func TestUploadAssets(t *testing.T) {
|
||||
}
|
||||
os.Setenv("GITLAB_ACCESS_TOKEN", "aToken")
|
||||
defer os.Unsetenv("GITLAB_ACCESS_TOKEN")
|
||||
client, err := gitlab.New(&testObject.config)
|
||||
client, err := gitlab.New(&testObject.config, false)
|
||||
assert.NoError(t, err)
|
||||
client.Release = "1.0.0"
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ package releaser
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/Nightapes/go-semantic-release/internal/gitutil"
|
||||
"github.com/Nightapes/go-semantic-release/internal/releaser/git"
|
||||
"github.com/Nightapes/go-semantic-release/internal/releaser/github"
|
||||
"github.com/Nightapes/go-semantic-release/internal/releaser/gitlab"
|
||||
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||
@@ -14,33 +16,37 @@ import (
|
||||
// Releasers struct type
|
||||
type Releasers struct {
|
||||
config *config.ReleaseConfig
|
||||
git *gitutil.GitUtil
|
||||
}
|
||||
|
||||
// Releaser interface for providers
|
||||
type Releaser interface {
|
||||
ValidateConfig() error
|
||||
CreateRelease(*shared.ReleaseVersion, *shared.GeneratedChangelog) error
|
||||
UploadAssets(repoDir string, assets []config.Asset) error
|
||||
GetCommitURL() string
|
||||
GetCompareURL(oldVersion, newVersion string) string
|
||||
}
|
||||
|
||||
// New initialize a Relerser
|
||||
func New(c *config.ReleaseConfig) *Releasers {
|
||||
// New initialize a releaser
|
||||
func New(c *config.ReleaseConfig, git *gitutil.GitUtil) *Releasers {
|
||||
return &Releasers{
|
||||
config: c,
|
||||
git: git,
|
||||
}
|
||||
}
|
||||
|
||||
//GetReleaser returns an initialized releaser
|
||||
func (r *Releasers) GetReleaser() (Releaser, error) {
|
||||
func (r *Releasers) GetReleaser(checkConfig bool) (Releaser, error) {
|
||||
switch r.config.Release {
|
||||
case github.GITHUB:
|
||||
log.Debugf("initialize new %s-provider", github.GITHUB)
|
||||
return github.New(&r.config.GitHubProvider)
|
||||
return github.New(&r.config.GitHubProvider, checkConfig)
|
||||
case gitlab.GITLAB:
|
||||
log.Debugf("initialize new %s-provider", gitlab.GITLAB)
|
||||
return gitlab.New(&r.config.GitLabProvider)
|
||||
return gitlab.New(&r.config.GitLabProvider, checkConfig)
|
||||
case git.GITONLY:
|
||||
log.Debugf("initialize new %s-provider", git.GITONLY)
|
||||
return git.New(&r.config.GitProvider, r.git, checkConfig)
|
||||
}
|
||||
return nil, fmt.Errorf("could not initialize a releaser from this type: %s", r.config.Release)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package config
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gopkg.in/yaml.v2"
|
||||
@@ -50,6 +51,20 @@ type GitLabProvider struct {
|
||||
AccessToken string
|
||||
}
|
||||
|
||||
// GitProvider struct
|
||||
type GitProvider struct {
|
||||
Email string `yaml:"email"`
|
||||
Username string `yaml:"user"`
|
||||
Auth string `yaml:"auth"`
|
||||
SSH bool `yaml:"ssh"`
|
||||
}
|
||||
|
||||
// Hooks struct
|
||||
type Hooks struct {
|
||||
PreRelease []string `yaml:"preRelease"`
|
||||
PostRelease []string `yaml:"postRelease"`
|
||||
}
|
||||
|
||||
// ReleaseConfig struct
|
||||
type ReleaseConfig struct {
|
||||
CommitFormat string `yaml:"commitFormat"`
|
||||
@@ -58,7 +73,9 @@ type ReleaseConfig struct {
|
||||
Release string `yaml:"release,omitempty"`
|
||||
GitHubProvider GitHubProvider `yaml:"github,omitempty"`
|
||||
GitLabProvider GitLabProvider `yaml:"gitlab,omitempty"`
|
||||
GitProvider GitProvider `yaml:"git,omitempty"`
|
||||
Assets []Asset `yaml:"assets"`
|
||||
Hooks Hooks `yaml:"hooks"`
|
||||
ReleaseTitle string `yaml:"title"`
|
||||
IsPreRelease bool
|
||||
}
|
||||
@@ -71,13 +88,31 @@ func Read(configPath string) (*ReleaseConfig, error) {
|
||||
return &ReleaseConfig{}, err
|
||||
}
|
||||
|
||||
var releaseConfig ReleaseConfig
|
||||
err = yaml.Unmarshal(content, &releaseConfig)
|
||||
log.Tracef("Found config %s", string(content))
|
||||
releaseConfig := &ReleaseConfig{}
|
||||
err = yaml.Unmarshal(content, releaseConfig)
|
||||
if err != nil {
|
||||
return &ReleaseConfig{}, err
|
||||
}
|
||||
|
||||
log.Tracef("Found config %+v", releaseConfig)
|
||||
org := *releaseConfig
|
||||
|
||||
return &releaseConfig, nil
|
||||
releaseConfig.Hooks = Hooks{}
|
||||
|
||||
configWithoutHooks, err := yaml.Marshal(releaseConfig)
|
||||
if err != nil {
|
||||
return &ReleaseConfig{}, err
|
||||
}
|
||||
configWithoutHooks = []byte(os.ExpandEnv(string(configWithoutHooks)))
|
||||
releaseConfigWithExpanedEnvs := &ReleaseConfig{}
|
||||
err = yaml.Unmarshal(configWithoutHooks, releaseConfigWithExpanedEnvs)
|
||||
if err != nil {
|
||||
return &ReleaseConfig{}, err
|
||||
}
|
||||
|
||||
releaseConfigWithExpanedEnvs.Hooks = org.Hooks
|
||||
|
||||
log.Tracef("Found config %+v", releaseConfigWithExpanedEnvs)
|
||||
|
||||
return releaseConfigWithExpanedEnvs, nil
|
||||
}
|
||||
|
||||
@@ -41,6 +41,9 @@ func TestWriteAndReadCache(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
os.Setenv("TEST_CONFIG", "value")
|
||||
defer os.Unsetenv("TEST_CONFIG")
|
||||
|
||||
completePath := path.Join(path.Dir(dir), ".release.yml")
|
||||
content := []byte(`
|
||||
commitFormat: angular
|
||||
@@ -53,9 +56,12 @@ branch:
|
||||
add_git_releases: alpha
|
||||
changelog:
|
||||
printAll: false
|
||||
template: ''
|
||||
templatePath: ''
|
||||
template: ""
|
||||
templatePath: '${TEST_CONFIG}'
|
||||
release: 'github'
|
||||
hooks:
|
||||
preRelease:
|
||||
- "Test hook ${RELEASE_VERSION}"
|
||||
assets:
|
||||
- name: ./build/go-semantic-release
|
||||
compress: false
|
||||
@@ -76,13 +82,18 @@ github:
|
||||
Changelog: config.ChangelogConfig{
|
||||
PrintAll: false,
|
||||
TemplateTitle: "",
|
||||
TemplatePath: ""},
|
||||
TemplatePath: "value"},
|
||||
Release: "github",
|
||||
GitHubProvider: config.GitHubProvider{
|
||||
Repo: "go-semantic-release",
|
||||
User: "nightapes",
|
||||
CustomURL: "",
|
||||
AccessToken: ""},
|
||||
Hooks: config.Hooks{
|
||||
PreRelease: []string{
|
||||
"Test hook ${RELEASE_VERSION}",
|
||||
},
|
||||
},
|
||||
Assets: []config.Asset{
|
||||
config.Asset{
|
||||
Name: "./build/go-semantic-release",
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"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/hooks"
|
||||
"github.com/Nightapes/go-semantic-release/internal/releaser"
|
||||
"github.com/Nightapes/go-semantic-release/internal/releaser/util"
|
||||
"github.com/Nightapes/go-semantic-release/internal/shared"
|
||||
@@ -20,16 +21,17 @@ import (
|
||||
|
||||
// SemanticRelease struct
|
||||
type SemanticRelease struct {
|
||||
config *config.ReleaseConfig
|
||||
gitutil *gitutil.GitUtil
|
||||
analyzer *analyzer.Analyzer
|
||||
calculator *calculator.Calculator
|
||||
releaser releaser.Releaser
|
||||
repository string
|
||||
config *config.ReleaseConfig
|
||||
gitutil *gitutil.GitUtil
|
||||
analyzer *analyzer.Analyzer
|
||||
calculator *calculator.Calculator
|
||||
releaser releaser.Releaser
|
||||
repository string
|
||||
checkConfig bool
|
||||
}
|
||||
|
||||
// New SemanticRelease struct
|
||||
func New(c *config.ReleaseConfig, repository string) (*SemanticRelease, error) {
|
||||
func New(c *config.ReleaseConfig, repository string, checkConfig bool) (*SemanticRelease, error) {
|
||||
util, err := gitutil.New(repository)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -40,24 +42,29 @@ func New(c *config.ReleaseConfig, repository string) (*SemanticRelease, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
releaser, err := releaser.New(c).GetReleaser()
|
||||
if !checkConfig {
|
||||
log.Infof("Ignore config checks!. No guarantee to run without issues")
|
||||
}
|
||||
|
||||
releaser, err := releaser.New(c, util).GetReleaser(checkConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &SemanticRelease{
|
||||
config: c,
|
||||
gitutil: util,
|
||||
releaser: releaser,
|
||||
analyzer: analyzer,
|
||||
repository: repository,
|
||||
calculator: calculator.New(),
|
||||
config: c,
|
||||
gitutil: util,
|
||||
releaser: releaser,
|
||||
analyzer: analyzer,
|
||||
repository: repository,
|
||||
checkConfig: checkConfig,
|
||||
calculator: calculator.New(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
//GetCIProvider result with ci config
|
||||
func (s *SemanticRelease) GetCIProvider() (*ci.ProviderConfig, error) {
|
||||
return ci.GetCIProvider(s.gitutil, ci.ReadAllEnvs())
|
||||
return ci.GetCIProvider(s.gitutil, s.checkConfig, ci.ReadAllEnvs())
|
||||
}
|
||||
|
||||
// GetNextVersion from .version or calculate new from commits
|
||||
@@ -183,7 +190,7 @@ func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error {
|
||||
return ioutil.WriteFile(file, []byte(changelogContent), 0644)
|
||||
}
|
||||
|
||||
// Release pusblish release to provider
|
||||
// Release publish release to provider
|
||||
func (s *SemanticRelease) Release(provider *ci.ProviderConfig, force bool) error {
|
||||
|
||||
if provider.IsPR {
|
||||
@@ -207,27 +214,31 @@ func (s *SemanticRelease) Release(provider *ci.ProviderConfig, force bool) error
|
||||
return nil
|
||||
}
|
||||
|
||||
generatedChanglog, err := s.GetChangelog(releaseVersion)
|
||||
hook := hooks.New(s.config, releaseVersion)
|
||||
|
||||
generatedChangelog, err := s.GetChangelog(releaseVersion)
|
||||
if err != nil {
|
||||
log.Debugf("Could not get changelog")
|
||||
return err
|
||||
}
|
||||
|
||||
releaser, err := releaser.New(s.config).GetReleaser()
|
||||
err = hook.PreRelease()
|
||||
if err != nil {
|
||||
log.Debugf("Error during pre release hook")
|
||||
return err
|
||||
}
|
||||
|
||||
err = releaser.ValidateConfig()
|
||||
if err = s.releaser.CreateRelease(releaseVersion, generatedChangelog); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = s.releaser.UploadAssets(s.repository, s.config.Assets); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = hook.PostRelease()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = releaser.CreateRelease(releaseVersion, generatedChanglog); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = releaser.UploadAssets(s.repository, s.config.Assets); err != nil {
|
||||
log.Debugf("Error during post release hook")
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user