Skip to content

Commit bd71d50

Browse files
authored
feat: Add kubectl feature (#31)
* feat: Add kubectl feature * chore: Simplified binary installation
1 parent 89bdc25 commit bd71d50

File tree

17 files changed

+968
-243
lines changed

17 files changed

+968
-243
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jobs:
2727
"goreleaser",
2828
"instant-client",
2929
"jfrog-cli",
30+
"kubectl",
3031
"locale",
3132
"make",
3233
"mingw",

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Below is a list with included features, click on the link for more details.
2727
| [goreleaser](./features/src/goreleaser/README.md) | Installs GoReleaser. |
2828
| [instant-client](./features/src/instant-client/README.md) | Installs the Oracle Instant Client Basic package. |
2929
| [jfrog-cli](./features/src/jfrog-cli/README.md) | Installs the JFrog CLI. |
30+
| [kubectl](./features/src/kubectl/README.md) | Installs kubectl and other tools for managing kubernetes. |
3031
| [locale](./features/src/locale/README.md) | Allows setting the locale. |
3132
| [make](./features/src/make/README.md) | Installs Make. |
3233
| [mingw](./features/src/mingw/README.md) | Installs MinGW. |
@@ -42,6 +43,11 @@ Below is a list with included features, click on the link for more details.
4243

4344
## Usage
4445

46+
### Tokens
47+
48+
Some version lookups depend on APIs with a rate limit. Use the following environment variables to set api tokens to increase those limits:
49+
* `DEV_FEATURE_TOKEN_GITHUB_API` - Set a token to use the GitHub API.
50+
4551
### Versions
4652

4753
Most features allow you to define one or more versions of the software that should be installed by the feature.
@@ -110,3 +116,22 @@ Then set this in your feature to explicitly unset it:
110116
### Extend an existing feature
111117

112118
TBD
119+
120+
## Development
121+
122+
### Testing features
123+
124+
To test a feature, you can compile it and copy or mount the installer into a container with root privileges.
125+
126+
Here is an example to compile a feature:
127+
```go
128+
go build -o kubectl.bin features/src/kubectl/installer.go
129+
```
130+
Then you can run a simple docker container which mounts the folder with the installer and then just run the installer:
131+
```bash
132+
docker run --rm -it -v $PWD:/data debian /bin/bash
133+
```
134+
and then run the installer:
135+
```bash
136+
/data/kubectl.bin --version=1.35.0
137+
```

build/build.go

Lines changed: 77 additions & 216 deletions
Original file line numberDiff line numberDiff line change
@@ -81,268 +81,129 @@ func init() {
8181
})
8282

8383
////////// browsers
84-
gotaskr.Task("Feature:browsers:Package", func() error {
85-
return packageFeature("browsers")
86-
})
87-
gotaskr.Task("Feature:browsers:Test", func() error {
88-
return testFeature("browsers")
89-
})
90-
gotaskr.Task("Feature:browsers:Publish", func() error {
91-
return publishFeature("browsers")
92-
})
84+
gotaskr.Task("Feature:browsers:Package", func() error { return packageFeature("browsers") })
85+
gotaskr.Task("Feature:browsers:Test", func() error { return testFeature("browsers") })
86+
gotaskr.Task("Feature:browsers:Publish", func() error { return publishFeature("browsers") })
9387

9488
////////// build-essential
95-
gotaskr.Task("Feature:build-essential:Package", func() error {
96-
return packageFeature("build-essential")
97-
})
98-
gotaskr.Task("Feature:build-essential:Test", func() error {
99-
return testFeature("build-essential")
100-
})
101-
gotaskr.Task("Feature:build-essential:Publish", func() error {
102-
return publishFeature("build-essential")
103-
})
89+
gotaskr.Task("Feature:build-essential:Package", func() error { return packageFeature("build-essential") })
90+
gotaskr.Task("Feature:build-essential:Test", func() error { return testFeature("build-essential") })
91+
gotaskr.Task("Feature:build-essential:Publish", func() error { return publishFeature("build-essential") })
10492

10593
////////// cypress-deps
106-
gotaskr.Task("Feature:cypress-deps:Package", func() error {
107-
return packageFeature("cypress-deps")
108-
})
109-
gotaskr.Task("Feature:cypress-deps:Test", func() error {
110-
return testFeature("cypress-deps")
111-
})
112-
gotaskr.Task("Feature:cypress-deps:Publish", func() error {
113-
return publishFeature("cypress-deps")
114-
})
94+
gotaskr.Task("Feature:cypress-deps:Package", func() error { return packageFeature("cypress-deps") })
95+
gotaskr.Task("Feature:cypress-deps:Test", func() error { return testFeature("cypress-deps") })
96+
gotaskr.Task("Feature:cypress-deps:Publish", func() error { return publishFeature("cypress-deps") })
11597

11698
////////// docker-out
117-
gotaskr.Task("Feature:docker-out:Package", func() error {
118-
return packageFeature("docker-out")
119-
})
120-
gotaskr.Task("Feature:docker-out:Test", func() error {
121-
return testFeature("docker-out")
122-
})
123-
gotaskr.Task("Feature:docker-out:Publish", func() error {
124-
return publishFeature("docker-out")
125-
})
99+
gotaskr.Task("Feature:docker-out:Package", func() error { return packageFeature("docker-out") })
100+
gotaskr.Task("Feature:docker-out:Test", func() error { return testFeature("docker-out") })
101+
gotaskr.Task("Feature:docker-out:Publish", func() error { return publishFeature("docker-out") })
126102

127103
////////// eclipse-deps
128-
gotaskr.Task("Feature:eclipse-deps:Package", func() error {
129-
return packageFeature("eclipse-deps")
130-
})
131-
gotaskr.Task("Feature:eclipse-deps:Test", func() error {
132-
return testFeature("eclipse-deps")
133-
})
134-
gotaskr.Task("Feature:eclipse-deps:Publish", func() error {
135-
return publishFeature("eclipse-deps")
136-
})
104+
gotaskr.Task("Feature:eclipse-deps:Package", func() error { return packageFeature("eclipse-deps") })
105+
gotaskr.Task("Feature:eclipse-deps:Test", func() error { return testFeature("eclipse-deps") })
106+
gotaskr.Task("Feature:eclipse-deps:Publish", func() error { return publishFeature("eclipse-deps") })
137107

138108
////////// git-lfs
139-
gotaskr.Task("Feature:git-lfs:Package", func() error {
140-
return packageFeature("git-lfs")
141-
})
142-
gotaskr.Task("Feature:git-lfs:Test", func() error {
143-
return testFeature("git-lfs")
144-
})
145-
gotaskr.Task("Feature:git-lfs:Publish", func() error {
146-
return publishFeature("git-lfs")
147-
})
109+
gotaskr.Task("Feature:git-lfs:Package", func() error { return packageFeature("git-lfs") })
110+
gotaskr.Task("Feature:git-lfs:Test", func() error { return testFeature("git-lfs") })
111+
gotaskr.Task("Feature:git-lfs:Publish", func() error { return publishFeature("git-lfs") })
148112

149113
////////// gitlab-cli
150-
gotaskr.Task("Feature:gitlab-cli:Package", func() error {
151-
return packageFeature("gitlab-cli")
152-
})
153-
gotaskr.Task("Feature:gitlab-cli:Test", func() error {
154-
return testFeature("gitlab-cli")
155-
})
156-
gotaskr.Task("Feature:gitlab-cli:Publish", func() error {
157-
return publishFeature("gitlab-cli")
158-
})
114+
gotaskr.Task("Feature:gitlab-cli:Package", func() error { return packageFeature("gitlab-cli") })
115+
gotaskr.Task("Feature:gitlab-cli:Test", func() error { return testFeature("gitlab-cli") })
116+
gotaskr.Task("Feature:gitlab-cli:Publish", func() error { return publishFeature("gitlab-cli") })
159117

160118
////////// go
161-
gotaskr.Task("Feature:go:Package", func() error {
162-
return packageFeature("go")
163-
})
164-
gotaskr.Task("Feature:go:Test", func() error {
165-
return testFeature("go")
166-
})
167-
gotaskr.Task("Feature:go:Publish", func() error {
168-
return publishFeature("go")
169-
})
119+
gotaskr.Task("Feature:go:Package", func() error { return packageFeature("go") })
120+
gotaskr.Task("Feature:go:Test", func() error { return testFeature("go") })
121+
gotaskr.Task("Feature:go:Publish", func() error { return publishFeature("go") })
170122

171123
////////// gonovate
172-
gotaskr.Task("Feature:gonovate:Package", func() error {
173-
return packageFeature("gonovate")
174-
})
175-
gotaskr.Task("Feature:gonovate:Test", func() error {
176-
return testFeature("gonovate")
177-
})
178-
gotaskr.Task("Feature:gonovate:Publish", func() error {
179-
return publishFeature("gonovate")
180-
})
124+
gotaskr.Task("Feature:gonovate:Package", func() error { return packageFeature("gonovate") })
125+
gotaskr.Task("Feature:gonovate:Test", func() error { return testFeature("gonovate") })
126+
gotaskr.Task("Feature:gonovate:Publish", func() error { return publishFeature("gonovate") })
181127

182128
////////// goreleaser
183-
gotaskr.Task("Feature:goreleaser:Package", func() error {
184-
return packageFeature("goreleaser")
185-
})
186-
gotaskr.Task("Feature:goreleaser:Test", func() error {
187-
return testFeature("goreleaser")
188-
})
189-
gotaskr.Task("Feature:goreleaser:Publish", func() error {
190-
return publishFeature("goreleaser")
191-
})
129+
gotaskr.Task("Feature:goreleaser:Package", func() error { return packageFeature("goreleaser") })
130+
gotaskr.Task("Feature:goreleaser:Test", func() error { return testFeature("goreleaser") })
131+
gotaskr.Task("Feature:goreleaser:Publish", func() error { return publishFeature("goreleaser") })
192132

193133
////////// instant-client
194-
gotaskr.Task("Feature:instant-client:Package", func() error {
195-
return packageFeature("instant-client")
196-
})
197-
gotaskr.Task("Feature:instant-client:Test", func() error {
198-
return testFeature("instant-client")
199-
})
200-
gotaskr.Task("Feature:instant-client:Publish", func() error {
201-
return publishFeature("instant-client")
202-
})
134+
gotaskr.Task("Feature:instant-client:Package", func() error { return packageFeature("instant-client") })
135+
gotaskr.Task("Feature:instant-client:Test", func() error { return testFeature("instant-client") })
136+
gotaskr.Task("Feature:instant-client:Publish", func() error { return publishFeature("instant-client") })
203137

204138
////////// jfrog-cli
205-
gotaskr.Task("Feature:jfrog-cli:Package", func() error {
206-
return packageFeature("jfrog-cli")
207-
})
208-
gotaskr.Task("Feature:jfrog-cli:Test", func() error {
209-
return testFeature("jfrog-cli")
210-
})
211-
gotaskr.Task("Feature:jfrog-cli:Publish", func() error {
212-
return publishFeature("jfrog-cli")
213-
})
139+
gotaskr.Task("Feature:jfrog-cli:Package", func() error { return packageFeature("jfrog-cli") })
140+
gotaskr.Task("Feature:jfrog-cli:Test", func() error { return testFeature("jfrog-cli") })
141+
gotaskr.Task("Feature:jfrog-cli:Publish", func() error { return publishFeature("jfrog-cli") })
142+
143+
////////// kubectl
144+
gotaskr.Task("Feature:kubectl:Package", func() error { return packageFeature("kubectl") })
145+
gotaskr.Task("Feature:kubectl:Test", func() error { return testFeature("kubectl") })
146+
gotaskr.Task("Feature:kubectl:Publish", func() error { return publishFeature("kubectl") })
214147

215148
////////// locale
216-
gotaskr.Task("Feature:locale:Package", func() error {
217-
return packageFeature("locale")
218-
})
219-
gotaskr.Task("Feature:locale:Test", func() error {
220-
return testFeature("locale")
221-
})
222-
gotaskr.Task("Feature:locale:Publish", func() error {
223-
return publishFeature("locale")
224-
})
149+
gotaskr.Task("Feature:locale:Package", func() error { return packageFeature("locale") })
150+
gotaskr.Task("Feature:locale:Test", func() error { return testFeature("locale") })
151+
gotaskr.Task("Feature:locale:Publish", func() error { return publishFeature("locale") })
225152

226153
////////// make
227-
gotaskr.Task("Feature:make:Package", func() error {
228-
return packageFeature("make")
229-
})
230-
gotaskr.Task("Feature:make:Test", func() error {
231-
return testFeature("make")
232-
})
233-
gotaskr.Task("Feature:make:Publish", func() error {
234-
return publishFeature("make")
235-
})
154+
gotaskr.Task("Feature:make:Package", func() error { return packageFeature("make") })
155+
gotaskr.Task("Feature:make:Test", func() error { return testFeature("make") })
156+
gotaskr.Task("Feature:make:Publish", func() error { return publishFeature("make") })
236157

237158
////////// mingw
238-
gotaskr.Task("Feature:mingw:Package", func() error {
239-
return packageFeature("mingw")
240-
})
241-
gotaskr.Task("Feature:mingw:Test", func() error {
242-
return testFeature("mingw")
243-
})
244-
gotaskr.Task("Feature:mingw:Publish", func() error {
245-
return publishFeature("mingw")
246-
})
159+
gotaskr.Task("Feature:mingw:Package", func() error { return packageFeature("mingw") })
160+
gotaskr.Task("Feature:mingw:Test", func() error { return testFeature("mingw") })
161+
gotaskr.Task("Feature:mingw:Publish", func() error { return publishFeature("mingw") })
247162

248163
////////// nginx
249-
gotaskr.Task("Feature:nginx:Package", func() error {
250-
return packageFeature("nginx")
251-
})
252-
gotaskr.Task("Feature:nginx:Test", func() error {
253-
return testFeature("nginx")
254-
})
255-
gotaskr.Task("Feature:nginx:Publish", func() error {
256-
return publishFeature("nginx")
257-
})
164+
gotaskr.Task("Feature:nginx:Package", func() error { return packageFeature("nginx") })
165+
gotaskr.Task("Feature:nginx:Test", func() error { return testFeature("nginx") })
166+
gotaskr.Task("Feature:nginx:Publish", func() error { return publishFeature("nginx") })
258167

259168
////////// node
260-
gotaskr.Task("Feature:node:Package", func() error {
261-
return packageFeature("node")
262-
})
263-
gotaskr.Task("Feature:node:Test", func() error {
264-
return testFeature("node")
265-
})
266-
gotaskr.Task("Feature:node:Publish", func() error {
267-
return publishFeature("node")
268-
})
169+
gotaskr.Task("Feature:node:Package", func() error { return packageFeature("node") })
170+
gotaskr.Task("Feature:node:Test", func() error { return testFeature("node") })
171+
gotaskr.Task("Feature:node:Publish", func() error { return publishFeature("node") })
269172

270173
////////// playwright-deps
271-
gotaskr.Task("Feature:playwright-deps:Package", func() error {
272-
return packageFeature("playwright-deps")
273-
})
274-
gotaskr.Task("Feature:playwright-deps:Test", func() error {
275-
return testFeature("playwright-deps")
276-
})
277-
gotaskr.Task("Feature:playwright-deps:Publish", func() error {
278-
return publishFeature("playwright-deps")
279-
})
174+
gotaskr.Task("Feature:playwright-deps:Package", func() error { return packageFeature("playwright-deps") })
175+
gotaskr.Task("Feature:playwright-deps:Test", func() error { return testFeature("playwright-deps") })
176+
gotaskr.Task("Feature:playwright-deps:Publish", func() error { return publishFeature("playwright-deps") })
280177

281178
////////// python
282-
gotaskr.Task("Feature:python:Package", func() error {
283-
return packageFeature("python")
284-
})
285-
gotaskr.Task("Feature:python:Test", func() error {
286-
return testFeature("python")
287-
})
288-
gotaskr.Task("Feature:python:Publish", func() error {
289-
return publishFeature("python")
290-
})
179+
gotaskr.Task("Feature:python:Package", func() error { return packageFeature("python") })
180+
gotaskr.Task("Feature:python:Test", func() error { return testFeature("python") })
181+
gotaskr.Task("Feature:python:Publish", func() error { return publishFeature("python") })
291182

292183
////////// sonar-scanner-cli
293-
gotaskr.Task("Feature:sonar-scanner-cli:Package", func() error {
294-
return packageFeature("sonar-scanner-cli")
295-
})
296-
gotaskr.Task("Feature:sonar-scanner-cli:Test", func() error {
297-
return testFeature("sonar-scanner-cli")
298-
})
299-
gotaskr.Task("Feature:sonar-scanner-cli:Publish", func() error {
300-
return publishFeature("sonar-scanner-cli")
301-
})
184+
gotaskr.Task("Feature:sonar-scanner-cli:Package", func() error { return packageFeature("sonar-scanner-cli") })
185+
gotaskr.Task("Feature:sonar-scanner-cli:Test", func() error { return testFeature("sonar-scanner-cli") })
186+
gotaskr.Task("Feature:sonar-scanner-cli:Publish", func() error { return publishFeature("sonar-scanner-cli") })
302187

303188
////////// system-packages
304-
gotaskr.Task("Feature:system-packages:Package", func() error {
305-
return packageFeature("system-packages")
306-
})
307-
gotaskr.Task("Feature:system-packages:Test", func() error {
308-
return testFeature("system-packages")
309-
})
310-
gotaskr.Task("Feature:system-packages:Publish", func() error {
311-
return publishFeature("system-packages")
312-
})
189+
gotaskr.Task("Feature:system-packages:Package", func() error { return packageFeature("system-packages") })
190+
gotaskr.Task("Feature:system-packages:Test", func() error { return testFeature("system-packages") })
191+
gotaskr.Task("Feature:system-packages:Publish", func() error { return publishFeature("system-packages") })
313192

314193
////////// timezone
315-
gotaskr.Task("Feature:timezone:Package", func() error {
316-
return packageFeature("timezone")
317-
})
318-
gotaskr.Task("Feature:timezone:Test", func() error {
319-
return testFeature("timezone")
320-
})
321-
gotaskr.Task("Feature:timezone:Publish", func() error {
322-
return publishFeature("timezone")
323-
})
194+
gotaskr.Task("Feature:timezone:Package", func() error { return packageFeature("timezone") })
195+
gotaskr.Task("Feature:timezone:Test", func() error { return testFeature("timezone") })
196+
gotaskr.Task("Feature:timezone:Publish", func() error { return publishFeature("timezone") })
324197

325198
////////// vault-cli
326-
gotaskr.Task("Feature:vault-cli:Package", func() error {
327-
return packageFeature("vault-cli")
328-
})
329-
gotaskr.Task("Feature:vault-cli:Test", func() error {
330-
return testFeature("vault-cli")
331-
})
332-
gotaskr.Task("Feature:vault-cli:Publish", func() error {
333-
return publishFeature("vault-cli")
334-
})
199+
gotaskr.Task("Feature:vault-cli:Package", func() error { return packageFeature("vault-cli") })
200+
gotaskr.Task("Feature:vault-cli:Test", func() error { return testFeature("vault-cli") })
201+
gotaskr.Task("Feature:vault-cli:Publish", func() error { return publishFeature("vault-cli") })
335202

336203
////////// zig
337-
gotaskr.Task("Feature:zig:Package", func() error {
338-
return packageFeature("zig")
339-
})
340-
gotaskr.Task("Feature:zig:Test", func() error {
341-
return testFeature("zig")
342-
})
343-
gotaskr.Task("Feature:zig:Publish", func() error {
344-
return publishFeature("zig")
345-
})
204+
gotaskr.Task("Feature:zig:Package", func() error { return packageFeature("zig") })
205+
gotaskr.Task("Feature:zig:Test", func() error { return testFeature("zig") })
206+
gotaskr.Task("Feature:zig:Publish", func() error { return publishFeature("zig") })
346207
}
347208

348209
////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)