Skip to content

Commit 823c6ea

Browse files
committed
feat(gitlab): support gitlab-ci
1 parent 35e214f commit 823c6ea

File tree

1,948 files changed

+653395
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,948 files changed

+653395
-1
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ jobs:
5858
- [multiple plugins published from one repo](https://github.com/ahmetb/kubectx/blob/master/.github/workflows/release.yml)
5959
- [circle-ci](examples/circleci.yml)
6060
- [travis-ci](examples/travis.yml)
61+
- [gitlab-ci](examples/gitabci.yml)
6162

6263
# Testing the template file
6364

examples/gitlabci.yml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
variables:
2+
## KREW_RELEASE_BOT_WEBHOOK_URL env helps you test your setup without actually publishing to kubernetes-sigs/krew-index
3+
## remove this env when you are ready for real release
4+
KREW_RELEASE_BOT_WEBHOOK_URL: "https://krew-release-bot-dryrun.rajatjindal.com/github-action-webhook2"
5+
KREW_RELEASE_BOT_VERSION: "v0.0.46"
6+
7+
stages:
8+
- release
9+
10+
update-krew-index:
11+
stage: release
12+
script:
13+
- echo "using krew-release-bot version ${KREW_RELEASE_BOT_VERSION}"
14+
- curl -LO https://github.com/rajatjindal/krew-release-bot/releases/download/${KREW_RELEASE_BOT_VERSION}/krew-release-bot_${KREW_RELEASE_BOT_VERSION}_linux_amd64.tar.gz
15+
- tar -xvf krew-release-bot_${KREW_RELEASE_BOT_VERSION}_linux_amd64.tar.gz
16+
- ./krew-release-bot action
17+
rules:
18+
- if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9-\.]+)?$/'

pkg/cicd/gitlabci/gitlabci.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package gitlabci
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
"strings"
8+
)
9+
10+
// Provider implements provider interface
11+
type Provider struct{}
12+
13+
func (p *Provider) IsPreRelease(owner, repo, tag string) (bool, error) {
14+
// gitlab doesn't have Prerelease.
15+
return false, nil
16+
}
17+
18+
// GetTag returns tag
19+
func (p *Provider) GetTag() (string, error) {
20+
ref := os.Getenv("CI_COMMIT_TAG")
21+
if ref == "" {
22+
return "", fmt.Errorf("CI_COMMIT_TAG env variable not found")
23+
}
24+
25+
return ref, nil
26+
}
27+
28+
// GetOwnerAndRepo gets the owner and repo from the env
29+
func (p *Provider) GetOwnerAndRepo() (string, string, error) {
30+
owner := os.Getenv("CI_PROJECT_NAMESPACE")
31+
if owner == "" {
32+
return "", "", fmt.Errorf("env CI_PROJECT_NAMESPACE not set")
33+
}
34+
35+
repo := os.Getenv("CI_PROJECT_NAME")
36+
if repo == "" {
37+
return "", "", fmt.Errorf("env CI_PROJECT_NAME not set")
38+
}
39+
40+
return owner, repo, nil
41+
}
42+
43+
// GetActor gets the owner and repo from the env
44+
func (p *Provider) GetActor() (string, error) {
45+
actor := os.Getenv("GITLAB_USER_LOGIN")
46+
if actor == "" {
47+
return "", fmt.Errorf("env GITLAB_USER_LOGIN not set")
48+
}
49+
50+
return actor, nil
51+
}
52+
53+
// getInputForAction gets input to action
54+
func getInputForAction(key string) string {
55+
return os.Getenv(fmt.Sprintf("INPUT_%s", strings.ToUpper(key)))
56+
}
57+
58+
// GetWorkDirectory gets workdir
59+
func (p *Provider) GetWorkDirectory() string {
60+
workdirInput := getInputForAction("workdir")
61+
if workdirInput != "" {
62+
return workdirInput
63+
}
64+
65+
return os.Getenv("CI_PROJECT_DIR")
66+
}
67+
68+
// GetTemplateFile returns the template file
69+
func (p *Provider) GetTemplateFile() string {
70+
templateFile := getInputForAction("krew_template_file")
71+
if templateFile != "" {
72+
return filepath.Join(p.GetWorkDirectory(), templateFile)
73+
}
74+
75+
return filepath.Join(p.GetWorkDirectory(), ".krew.yaml")
76+
}

pkg/cicd/gitlabci/gitlabci_test.go

+228
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
package gitlabci
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestGetOwnerAndRepo(t *testing.T) {
11+
testcases := []struct {
12+
name string
13+
setup func()
14+
expectedOwner string
15+
expectedRepo string
16+
expectedError string
17+
}{
18+
{
19+
name: "CI_PROJECT_NAMESPACE and CI_PROJECT_NAME is set as expected",
20+
setup: func() {
21+
os.Setenv("CI_PROJECT_NAMESPACE", "foo-bar")
22+
os.Setenv("CI_PROJECT_NAME", "my-awesome-repo")
23+
},
24+
expectedOwner: "foo-bar",
25+
expectedRepo: "my-awesome-repo",
26+
},
27+
{
28+
name: "CI_PROJECT_NAMESPACE is not set",
29+
setup: func() {
30+
os.Unsetenv("CI_PROJECT_NAMESPACE")
31+
os.Setenv("CI_PROJECT_NAME", "my-awesome-repo")
32+
},
33+
expectedError: `env CI_PROJECT_NAMESPACE not set`,
34+
},
35+
{
36+
name: "CI_PROJECT_NAME is not set",
37+
setup: func() {
38+
os.Setenv("CI_PROJECT_NAMESPACE", "foo-bar")
39+
os.Unsetenv("CI_PROJECT_NAME")
40+
},
41+
expectedError: `env CI_PROJECT_NAME not set`,
42+
},
43+
}
44+
45+
p := &Provider{}
46+
for _, tc := range testcases {
47+
t.Run(tc.name, func(t *testing.T) {
48+
os.Clearenv()
49+
50+
if tc.setup != nil {
51+
tc.setup()
52+
}
53+
54+
owner, repo, err := p.GetOwnerAndRepo()
55+
56+
assert.Equal(t, tc.expectedOwner, owner)
57+
assert.Equal(t, tc.expectedRepo, repo)
58+
assertError(t, tc.expectedError, err)
59+
})
60+
}
61+
}
62+
63+
func TestGetActionActor(t *testing.T) {
64+
testcases := []struct {
65+
name string
66+
setup func()
67+
expectedActor string
68+
expectedError string
69+
}{
70+
{
71+
name: "env GITLAB_USER_LOGIN is set as expected",
72+
setup: func() {
73+
os.Setenv("GITLAB_USER_LOGIN", "foo-bar")
74+
},
75+
expectedActor: "foo-bar",
76+
},
77+
{
78+
name: "env GITLAB_USER_LOGIN is not set",
79+
expectedError: "env GITLAB_USER_LOGIN not set",
80+
},
81+
}
82+
83+
p := &Provider{}
84+
for _, tc := range testcases {
85+
t.Run(tc.name, func(t *testing.T) {
86+
os.Clearenv()
87+
88+
if tc.setup != nil {
89+
tc.setup()
90+
}
91+
92+
actor, err := p.GetActor()
93+
assert.Equal(t, tc.expectedActor, actor)
94+
assertError(t, tc.expectedError, err)
95+
})
96+
}
97+
}
98+
99+
func TestGetTag(t *testing.T) {
100+
testcases := []struct {
101+
name string
102+
setup func()
103+
expectedTag string
104+
expectedError string
105+
}{
106+
{
107+
name: "env CI_COMMIT_TAG is setup",
108+
setup: func() {
109+
os.Setenv("CI_COMMIT_TAG", "v5.0.0")
110+
},
111+
expectedTag: "v5.0.0",
112+
},
113+
{
114+
name: "CI_COMMIT_TAG is not set",
115+
setup: func() {
116+
os.Unsetenv("CI_COMMIT_TAG")
117+
},
118+
expectedError: `CI_COMMIT_TAG env variable not found`,
119+
},
120+
}
121+
122+
p := &Provider{}
123+
for _, tc := range testcases {
124+
t.Run(tc.name, func(t *testing.T) {
125+
os.Clearenv()
126+
127+
if tc.setup != nil {
128+
tc.setup()
129+
}
130+
131+
tag, err := p.GetTag()
132+
assert.Equal(t, tc.expectedTag, tag)
133+
assertError(t, tc.expectedError, err)
134+
})
135+
}
136+
}
137+
138+
func assertError(t *testing.T, expectedError string, err error) {
139+
if expectedError == "" {
140+
assert.Nil(t, err)
141+
}
142+
143+
if expectedError != "" {
144+
assert.NotNil(t, err)
145+
if err != nil {
146+
assert.Equal(t, expectedError, err.Error())
147+
}
148+
}
149+
}
150+
151+
func TestGetWorkingDirectory(t *testing.T) {
152+
testcases := []struct {
153+
name string
154+
setup func()
155+
expectedDir string
156+
}{
157+
{
158+
name: "env CI_PROJECT_DIR is setup",
159+
setup: func() {
160+
os.Setenv("CI_PROJECT_DIR", "/builds/foo-bar/my-awesome-repo")
161+
},
162+
expectedDir: "/builds/foo-bar/my-awesome-repo",
163+
}, {
164+
name: "env CI_PROJECT_DIR is setup",
165+
setup: func() {
166+
os.Setenv("CI_PROJECT_DIR", "/builds/foo-bar/my-awesome-repo")
167+
os.Setenv("INPUT_WORKDIR", "/my-workdir")
168+
},
169+
expectedDir: "/my-workdir",
170+
}, {
171+
name: "env CI_PROJECT_DIR is not set",
172+
setup: func() {
173+
os.Unsetenv("CI_PROJECT_DIR")
174+
},
175+
expectedDir: "",
176+
},
177+
}
178+
179+
p := &Provider{}
180+
for _, tc := range testcases {
181+
t.Run(tc.name, func(t *testing.T) {
182+
os.Clearenv()
183+
184+
if tc.setup != nil {
185+
tc.setup()
186+
}
187+
188+
dir := p.GetWorkDirectory()
189+
assert.Equal(t, tc.expectedDir, dir)
190+
})
191+
}
192+
}
193+
194+
func TestGetTemplateFile(t *testing.T) {
195+
testcases := []struct {
196+
name string
197+
setup func()
198+
expectFile string
199+
}{
200+
{
201+
name: "env INPUT_KREW_TEMPLATE_FILE is setup",
202+
setup: func() {
203+
os.Setenv("INPUT_KREW_TEMPLATE_FILE", "my-awesome-plugin.yaml")
204+
},
205+
expectFile: "my-awesome-plugin.yaml",
206+
}, {
207+
name: "env INPUT_KREW_TEMPLATE_FILE is not set",
208+
setup: func() {
209+
os.Unsetenv("INPUT_KREW_TEMPLATE_FILE")
210+
},
211+
expectFile: ".krew.yaml",
212+
},
213+
}
214+
215+
p := &Provider{}
216+
for _, tc := range testcases {
217+
t.Run(tc.name, func(t *testing.T) {
218+
os.Clearenv()
219+
220+
if tc.setup != nil {
221+
tc.setup()
222+
}
223+
224+
dir := p.GetTemplateFile()
225+
assert.Equal(t, tc.expectFile, dir)
226+
})
227+
}
228+
}

pkg/cicd/provider.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/rajatjindal/krew-release-bot/pkg/cicd/circleci"
77
"github.com/rajatjindal/krew-release-bot/pkg/cicd/github"
8+
"github.com/rajatjindal/krew-release-bot/pkg/cicd/gitlabci"
89
"github.com/rajatjindal/krew-release-bot/pkg/cicd/travisci"
910
)
1011

@@ -19,8 +20,12 @@ type Provider interface {
1920
}
2021

2122
// GetProvider returns the CI/CD provider
22-
// e.g. github-actions or circle-ci
23+
// e.g. github-actions, travis-ci, circle-ci or gitlab-ci
2324
func GetProvider() Provider {
25+
if os.Getenv("GITLAB_CI") == "true" {
26+
return &gitlabci.Provider{}
27+
}
28+
2429
if os.Getenv("GITHUB_ACTIONS") == "true" {
2530
return &github.Actions{}
2631
}

vendor/github.com/Microsoft/go-winio/.gitattributes

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Microsoft/go-winio/.gitignore

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)