Skip to content

Commit f916c5a

Browse files
committed
feat(workers): Include GradleDefinitions in the GradleInitGenerator
Extend the `GradleInitGenerator` to include repositories from `GradleDefinition`s in addition to the globally configured `MavenCentralMirror`. Override the globally configured `MavenCentralMirror` if a `GradleDefinition` uses the same URL. Signed-off-by: Onur Demirci <[email protected]>
1 parent df80cff commit f916c5a

File tree

2 files changed

+325
-6
lines changed

2 files changed

+325
-6
lines changed

workers/common/src/main/kotlin/common/env/GradleInitGenerator.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,27 @@ class GradleInitGenerator : EnvironmentConfigGenerator<GradleDefinition> {
6565
builder.buildInUserHome(TARGET_NAME) {
6666
val repositories = buildList {
6767
builder.adminConfig.mavenCentralMirror?.let { mirror ->
68-
add(
69-
GradleRepositoryEntry(
70-
mirror.url,
71-
mirror.usernameSecret?.let { builder.infraSecretResolverFun(Path(it)) },
72-
mirror.passwordSecret?.let { builder.infraSecretResolverFun(Path(it)) }
68+
val isOverridden = definitions.any { it.service.url == mirror.url }
69+
if (!isOverridden) {
70+
add(
71+
GradleRepositoryEntry(
72+
mirror.url,
73+
mirror.usernameSecret?.let { builder.infraSecretResolverFun(Path(it)) },
74+
mirror.passwordSecret?.let { builder.infraSecretResolverFun(Path(it)) }
75+
)
7376
)
74-
)
77+
}
7578
}
79+
80+
addAll(
81+
definitions.map { definition ->
82+
GradleRepositoryEntry(
83+
definition.service.url,
84+
builder.secretRef(definition.service.usernameSecret),
85+
builder.secretRef(definition.service.passwordSecret)
86+
)
87+
}
88+
)
7689
}
7790

7891
if (repositories.isNotEmpty()) {

workers/common/src/test/kotlin/common/env/GradleInitGeneratorTest.kt

Lines changed: 306 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,312 @@ class GradleInitGeneratorTest : WordSpec({
4848
mockBuilder.homeFileName shouldBe ".gradle/init.gradle.kts"
4949
}
5050

51+
"generate repositories blocks from definitions" {
52+
val secUser1 = MockConfigFileBuilder.createSecret("user1Secret")
53+
val secPass1 = MockConfigFileBuilder.createSecret("pass1Secret")
54+
val secUser2 = MockConfigFileBuilder.createSecret("user2Secret")
55+
val secPass2 = MockConfigFileBuilder.createSecret("pass2Secret")
56+
57+
val definition1 = GradleDefinition(
58+
MockConfigFileBuilder.createInfrastructureService("https://repo1.example.org", secUser1, secPass1),
59+
emptySet()
60+
)
61+
62+
val definition2 = GradleDefinition(
63+
MockConfigFileBuilder.createInfrastructureService("https://repo2.example.org", secUser2, secPass2),
64+
emptySet()
65+
)
66+
67+
val mockBuilder = MockConfigFileBuilder()
68+
69+
GradleInitGenerator().generate(mockBuilder.builder, listOf(definition1, definition2))
70+
71+
val expectedLines = listOf(
72+
"allprojects {",
73+
" repositories {",
74+
" maven {",
75+
" url = uri(\"https://repo1.example.org\")",
76+
" credentials {",
77+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser1)}\"",
78+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass1)}\"",
79+
" }",
80+
" }",
81+
" maven {",
82+
" url = uri(\"https://repo2.example.org\")",
83+
" credentials {",
84+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser2)}\"",
85+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass2)}\"",
86+
" }",
87+
" }",
88+
" }",
89+
"",
90+
" buildscript {",
91+
" repositories {",
92+
" maven {",
93+
" url = uri(\"https://repo1.example.org\")",
94+
" credentials {",
95+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser1)}\"",
96+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass1)}\"",
97+
" }",
98+
" }",
99+
" maven {",
100+
" url = uri(\"https://repo2.example.org\")",
101+
" credentials {",
102+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser2)}\"",
103+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass2)}\"",
104+
" }",
105+
" }",
106+
" }",
107+
" }",
108+
"}",
109+
"",
110+
"settingsEvaluated {",
111+
" settings.pluginManagement {",
112+
" repositories {",
113+
" maven {",
114+
" url = uri(\"https://repo1.example.org\")",
115+
" credentials {",
116+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser1)}\"",
117+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass1)}\"",
118+
" }",
119+
" }",
120+
" maven {",
121+
" url = uri(\"https://repo2.example.org\")",
122+
" credentials {",
123+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser2)}\"",
124+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass2)}\"",
125+
" }",
126+
" }",
127+
" gradlePluginPortal()",
128+
" }",
129+
" }",
130+
"",
131+
" settings.dependencyResolutionManagement {",
132+
" repositories {",
133+
" maven {",
134+
" url = uri(\"https://repo1.example.org\")",
135+
" credentials {",
136+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser1)}\"",
137+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass1)}\"",
138+
" }",
139+
" }",
140+
" maven {",
141+
" url = uri(\"https://repo2.example.org\")",
142+
" credentials {",
143+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser2)}\"",
144+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass2)}\"",
145+
" }",
146+
" }",
147+
" }",
148+
" }",
149+
"}"
150+
)
151+
152+
val lines = mockBuilder.generatedLines()
153+
lines shouldContainExactly expectedLines
154+
}
155+
156+
"generate repositories section for both GradleDefinition and MavenCentralMirror if URL differs" {
157+
val secUser = MockConfigFileBuilder.createSecret("userSecret")
158+
val secPass = MockConfigFileBuilder.createSecret("passSecret")
159+
160+
val definition1 = GradleDefinition(
161+
MockConfigFileBuilder.createInfrastructureService("https://repo.example.org", secUser, secPass),
162+
emptySet()
163+
)
164+
165+
val username = "test-username"
166+
val infraUsernameSecret = MockConfigFileBuilder.createSecret("infra-secret-username")
167+
val password = "test-password"
168+
val infraPasswordSecret = MockConfigFileBuilder.createSecret("infra-secret-password")
169+
val mavenCentralMirror = MavenCentralMirror(
170+
id = "central",
171+
name = "Maven Central",
172+
url = "https://different-repo.example.org",
173+
mirrorOf = "central",
174+
usernameSecret = infraUsernameSecret.name,
175+
passwordSecret = infraPasswordSecret.name
176+
)
177+
178+
val mockBuilder = MockConfigFileBuilder()
179+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraUsernameSecret.path)) } returns username
180+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraPasswordSecret.path)) } returns password
181+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
182+
183+
GradleInitGenerator().generate(mockBuilder.builder, listOf(definition1))
184+
185+
val expectedLines = listOf(
186+
"allprojects {",
187+
" repositories {",
188+
" maven {",
189+
" url = uri(\"${mavenCentralMirror.url}\")",
190+
" credentials {",
191+
" username = \"$username\"",
192+
" password = \"$password\"",
193+
" }",
194+
" }",
195+
" maven {",
196+
" url = uri(\"https://repo.example.org\")",
197+
" credentials {",
198+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
199+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
200+
" }",
201+
" }",
202+
" }",
203+
"",
204+
" buildscript {",
205+
" repositories {",
206+
" maven {",
207+
" url = uri(\"${mavenCentralMirror.url}\")",
208+
" credentials {",
209+
" username = \"$username\"",
210+
" password = \"$password\"",
211+
" }",
212+
" }",
213+
" maven {",
214+
" url = uri(\"https://repo.example.org\")",
215+
" credentials {",
216+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
217+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
218+
" }",
219+
" }",
220+
" }",
221+
" }",
222+
"}",
223+
"",
224+
"settingsEvaluated {",
225+
" settings.pluginManagement {",
226+
" repositories {",
227+
" maven {",
228+
" url = uri(\"${mavenCentralMirror.url}\")",
229+
" credentials {",
230+
" username = \"$username\"",
231+
" password = \"$password\"",
232+
" }",
233+
" }",
234+
" maven {",
235+
" url = uri(\"https://repo.example.org\")",
236+
" credentials {",
237+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
238+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
239+
" }",
240+
" }",
241+
" gradlePluginPortal()",
242+
" }",
243+
" }",
244+
"",
245+
" settings.dependencyResolutionManagement {",
246+
" repositories {",
247+
" maven {",
248+
" url = uri(\"${mavenCentralMirror.url}\")",
249+
" credentials {",
250+
" username = \"$username\"",
251+
" password = \"$password\"",
252+
" }",
253+
" }",
254+
" maven {",
255+
" url = uri(\"https://repo.example.org\")",
256+
" credentials {",
257+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
258+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
259+
" }",
260+
" }",
261+
" }",
262+
" }",
263+
"}"
264+
)
265+
266+
val lines = mockBuilder.generatedLines()
267+
lines shouldContainExactly expectedLines
268+
}
269+
270+
"prefer GradleDefinition over MavenCentralMirror if URLs match" {
271+
val repositoryUrl = "https://repo.example.org"
272+
val secUser = MockConfigFileBuilder.createSecret("userSecret")
273+
val secPass = MockConfigFileBuilder.createSecret("passSecret")
274+
275+
val definition1 = GradleDefinition(
276+
MockConfigFileBuilder.createInfrastructureService(repositoryUrl, secUser, secPass),
277+
emptySet()
278+
)
279+
280+
val username = "test-username"
281+
val infraUsernameSecret = MockConfigFileBuilder.createSecret("infra-secret-username")
282+
val password = "test-password"
283+
val infraPasswordSecret = MockConfigFileBuilder.createSecret("infra-secret-password")
284+
val mavenCentralMirror = MavenCentralMirror(
285+
id = "central",
286+
name = "Maven Central",
287+
url = repositoryUrl,
288+
mirrorOf = "central",
289+
usernameSecret = infraUsernameSecret.name,
290+
passwordSecret = infraPasswordSecret.name
291+
)
292+
293+
val mockBuilder = MockConfigFileBuilder()
294+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraUsernameSecret.path)) } returns username
295+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraPasswordSecret.path)) } returns password
296+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
297+
298+
GradleInitGenerator().generate(mockBuilder.builder, listOf(definition1))
299+
300+
val expectedLines = listOf(
301+
"allprojects {",
302+
" repositories {",
303+
" maven {",
304+
" url = uri(\"$repositoryUrl\")",
305+
" credentials {",
306+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
307+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
308+
" }",
309+
" }",
310+
" }",
311+
"",
312+
" buildscript {",
313+
" repositories {",
314+
" maven {",
315+
" url = uri(\"$repositoryUrl\")",
316+
" credentials {",
317+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
318+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
319+
" }",
320+
" }",
321+
" }",
322+
" }",
323+
"}",
324+
"",
325+
"settingsEvaluated {",
326+
" settings.pluginManagement {",
327+
" repositories {",
328+
" maven {",
329+
" url = uri(\"$repositoryUrl\")",
330+
" credentials {",
331+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
332+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
333+
" }",
334+
" }",
335+
" gradlePluginPortal()",
336+
" }",
337+
" }",
338+
"",
339+
" settings.dependencyResolutionManagement {",
340+
" repositories {",
341+
" maven {",
342+
" url = uri(\"$repositoryUrl\")",
343+
" credentials {",
344+
" username = \"${MockConfigFileBuilder.testSecretRef(secUser)}\"",
345+
" password = \"${MockConfigFileBuilder.testSecretRef(secPass)}\"",
346+
" }",
347+
" }",
348+
" }",
349+
" }",
350+
"}"
351+
)
352+
353+
val lines = mockBuilder.generatedLines()
354+
lines shouldContainExactly expectedLines
355+
}
356+
51357
"generate an empty file if MavenCentralMirror is null" {
52358
val mockBuilder = MockConfigFileBuilder()
53359

0 commit comments

Comments
 (0)