diff --git a/cmd/drone-docker/main.go b/cmd/drone-docker/main.go index 3a1247f..55a2a10 100644 --- a/cmd/drone-docker/main.go +++ b/cmd/drone-docker/main.go @@ -192,6 +192,17 @@ func main() { Usage: "docker email", EnvVar: "PLUGIN_EMAIL,DOCKER_EMAIL", }, + cli.StringFlag{ + Name: "commit.branch", + Value: "master", + Usage: "git commit branch", + EnvVar: "DRONE_COMMIT_BRANCH", + }, + cli.StringFlag{ + Name: "default.branch", + Usage: "defualt latest branch", + EnvVar: "PLUGIN_DEFALUT_BRANCH", + }, } if err := app.Run(os.Args); err != nil { @@ -209,18 +220,20 @@ func run(c *cli.Context) error { Email: c.String("docker.email"), }, Build: docker.Build{ - Remote: c.String("remote.url"), - Name: c.String("commit.sha"), - Dockerfile: c.String("dockerfile"), - Context: c.String("context"), - Tags: c.StringSlice("tags"), - Args: c.StringSlice("args"), - ArgsEnv: c.StringSlice("args-from-env"), - Squash: c.Bool("squash"), - Pull: c.BoolT("pull-image"), - Compress: c.Bool("compress"), - Repo: c.String("repo"), - LabelSchema: c.StringSlice("label-schema"), + Remote: c.String("remote.url"), + Name: c.String("commit.sha"), + Branch: c.String("commit.branch"), + DefaultBranch: c.String("default.branch"), + Dockerfile: c.String("dockerfile"), + Context: c.String("context"), + Tags: c.StringSlice("tags"), + Args: c.StringSlice("args"), + ArgsEnv: c.StringSlice("args-from-env"), + Squash: c.Bool("squash"), + Pull: c.BoolT("pull-image"), + Compress: c.Bool("compress"), + Repo: c.String("repo"), + LabelSchema: c.StringSlice("label-schema"), }, Daemon: docker.Daemon{ Registry: c.String("docker.registry"), @@ -243,6 +256,8 @@ func run(c *cli.Context) error { plugin.Build.Tags = docker.DefaultTagSuffix( c.String("commit.ref"), c.String("tags.suffix"), + c.String("commit.branch"), + c.String("default.branch"), ) } diff --git a/docker.go b/docker.go index e7ca7e0..2f4728a 100644 --- a/docker.go +++ b/docker.go @@ -37,18 +37,20 @@ type ( // Build defines Docker build parameters. Build struct { - Remote string // Git remote URL - Name string // Docker build using default named tag - Dockerfile string // Docker build Dockerfile - Context string // Docker build context - Tags []string // Docker build tags - Args []string // Docker build args - ArgsEnv []string // Docker build args from env - Squash bool // Docker build squash - Pull bool // Docker build pull - Compress bool // Docker build compress - Repo string // Docker build repository - LabelSchema []string // Label schema map + Remote string // Git remote URL + Name string // Docker build using default named tag + Dockerfile string // Docker build Dockerfile + Context string // Docker build context + Tags []string // Docker build tags + Args []string // Docker build args + ArgsEnv []string // Docker build args from env + Squash bool // Docker build squash + Pull bool // Docker build pull + Compress bool // Docker build compress + Repo string // Docker build repository + LabelSchema []string // Label schema map + Branch string // Docker build branch + DefaultBranch string // Docker latest branch } // Plugin defines the Docker plugin parameters. diff --git a/tags.go b/tags.go index 5e1b36e..5482b53 100644 --- a/tags.go +++ b/tags.go @@ -9,8 +9,8 @@ import ( // DefaultTagSuffix returns a set of default suggested tags // based on the commit ref with an attached suffix. -func DefaultTagSuffix(ref, suffix string) []string { - tags := DefaultTags(ref) +func DefaultTagSuffix(ref, suffix, commitBranch, defaultBranch string) []string { + tags := DefaultTags(ref, commitBranch, defaultBranch) if len(suffix) == 0 { return tags } @@ -26,10 +26,18 @@ func DefaultTagSuffix(ref, suffix string) []string { // DefaultTags returns a set of default suggested tags based on // the commit ref. -func DefaultTags(ref string) []string { +func DefaultTags(ref, commitBranch, defaultBranch string) []string { + + if defaultBranch != "" && + commitBranch != defaultBranch && + !strings.HasPrefix(ref, "refs/tags/") { + return []string{} + } + if !strings.HasPrefix(ref, "refs/tags/") { return []string{"latest"} } + v := stripTagPrefix(ref) version, err := semver.NewVersion(v) if err != nil { diff --git a/tags_test.go b/tags_test.go index 9d356f8..f86d4ca 100644 --- a/tags_test.go +++ b/tags_test.go @@ -25,23 +25,30 @@ func Test_stripTagPrefix(t *testing.T) { func TestDefaultTags(t *testing.T) { var tests = []struct { - Before string - After []string + Before string + CommitBranch string + DefaultBranch string + After []string }{ - {"", []string{"latest"}}, - {"refs/heads/master", []string{"latest"}}, - {"refs/tags/0.9.0", []string{"0.9", "0.9.0"}}, - {"refs/tags/1.0.0", []string{"1", "1.0", "1.0.0"}}, - {"refs/tags/v1.0.0", []string{"1", "1.0", "1.0.0"}}, - {"refs/tags/v1.0.0-alpha.1", []string{"1.0.0-alpha.1"}}, + {"", "master", "", []string{"latest"}}, + {"refs/heads/master", "master", "", []string{"latest"}}, + {"refs/tags/0.9.0", "master", "", []string{"0.9", "0.9.0"}}, + {"refs/tags/1.0.0", "master", "", []string{"1", "1.0", "1.0.0"}}, + {"refs/tags/v1.0.0", "master", "", []string{"1", "1.0", "1.0.0"}}, + {"refs/tags/v1.0.0-alpha.1", "master", "", []string{"1.0.0-alpha.1"}}, // malformed or errors - {"refs/tags/x1.0.0", []string{"latest"}}, - {"v1.0.0", []string{"latest"}}, + {"refs/tags/x1.0.0", "master", "", []string{"latest"}}, + {"v1.0.0", "master", "", []string{"latest"}}, + + // defualt branch + {"refs/heads/master", "master", "master", []string{"latest"}}, + {"refs/heads/test", "test", "master", []string{}}, + {"refs/tags/v1.0.0", "v1.0.0", "master", []string{"1", "1.0", "1.0.0"}}, } for _, test := range tests { - got, want := DefaultTags(test.Before), test.After + got, want := DefaultTags(test.Before, test.CommitBranch, test.DefaultBranch), test.After if !reflect.DeepEqual(got, want) { t.Errorf("Got tag %v, want %v", got, want) } @@ -50,16 +57,22 @@ func TestDefaultTags(t *testing.T) { func TestDefaultTagSuffix(t *testing.T) { var tests = []struct { - Before string - Suffix string - After []string + Before string + CommitBranch string + DefaultBranch string + Suffix string + After []string }{ // without suffix { - After: []string{"latest"}, + After: []string{"latest"}, + CommitBranch: "master", + DefaultBranch: "", }, { - Before: "refs/tags/v1.0.0", + Before: "refs/tags/v1.0.0", + CommitBranch: "master", + DefaultBranch: "", After: []string{ "1", "1.0", @@ -68,12 +81,16 @@ func TestDefaultTagSuffix(t *testing.T) { }, // with suffix { - Suffix: "linux-amd64", - After: []string{"linux-amd64"}, + CommitBranch: "master", + DefaultBranch: "", + Suffix: "linux-amd64", + After: []string{"linux-amd64"}, }, { - Before: "refs/tags/v1.0.0", - Suffix: "linux-amd64", + CommitBranch: "master", + DefaultBranch: "", + Before: "refs/tags/v1.0.0", + Suffix: "linux-amd64", After: []string{ "1-linux-amd64", "1.0-linux-amd64", @@ -81,12 +98,16 @@ func TestDefaultTagSuffix(t *testing.T) { }, }, { - Suffix: "nanoserver", - After: []string{"nanoserver"}, + CommitBranch: "master", + DefaultBranch: "", + Suffix: "nanoserver", + After: []string{"nanoserver"}, }, { - Before: "refs/tags/v1.9.2", - Suffix: "nanoserver", + CommitBranch: "master", + DefaultBranch: "", + Before: "refs/tags/v1.9.2", + Suffix: "nanoserver", After: []string{ "1-nanoserver", "1.9-nanoserver", @@ -96,7 +117,7 @@ func TestDefaultTagSuffix(t *testing.T) { } for _, test := range tests { - got, want := DefaultTagSuffix(test.Before, test.Suffix), test.After + got, want := DefaultTagSuffix(test.Before, test.Suffix, test.CommitBranch, test.DefaultBranch), test.After if !reflect.DeepEqual(got, want) { t.Errorf("Got tag %v, want %v", got, want) }