Skip to content

Commit b2a3717

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 b2a3717

File tree

2 files changed

+328
-6
lines changed

2 files changed

+328
-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: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,315 @@ 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 expectedContent = """
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+
""".trimIndent()
152+
153+
val content = mockBuilder.generatedText()
154+
content shouldBe expectedContent
155+
}
156+
157+
"generate repositories section for both GradleDefinition and MavenCentralMirror if URL differs" {
158+
val secUser = MockConfigFileBuilder.createSecret("userSecret")
159+
val secPass = MockConfigFileBuilder.createSecret("passSecret")
160+
161+
val definition1 = GradleDefinition(
162+
MockConfigFileBuilder.createInfrastructureService("https://repo.example.org", secUser, secPass),
163+
emptySet()
164+
)
165+
166+
val username = "test-username"
167+
val infraUsernameSecret = MockConfigFileBuilder.createSecret("infra-secret-username")
168+
val password = "test-password"
169+
val infraPasswordSecret = MockConfigFileBuilder.createSecret("infra-secret-password")
170+
val mavenCentralMirror = MavenCentralMirror(
171+
id = "central",
172+
name = "Maven Central",
173+
url = "https://different-repo.example.org",
174+
mirrorOf = "central",
175+
usernameSecret = infraUsernameSecret.name,
176+
passwordSecret = infraPasswordSecret.name
177+
)
178+
179+
val mockBuilder = MockConfigFileBuilder()
180+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraUsernameSecret.path)) } returns username
181+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraPasswordSecret.path)) } returns password
182+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
183+
184+
GradleInitGenerator().generate(mockBuilder.builder, listOf(definition1))
185+
186+
val expectedContent = """
187+
allprojects {
188+
repositories {
189+
maven {
190+
url = uri("${mavenCentralMirror.url}")
191+
credentials {
192+
username = "$username"
193+
password = "$password"
194+
}
195+
}
196+
maven {
197+
url = uri("https://repo.example.org")
198+
credentials {
199+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
200+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
201+
}
202+
}
203+
}
204+
205+
buildscript {
206+
repositories {
207+
maven {
208+
url = uri("${mavenCentralMirror.url}")
209+
credentials {
210+
username = "$username"
211+
password = "$password"
212+
}
213+
}
214+
maven {
215+
url = uri("https://repo.example.org")
216+
credentials {
217+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
218+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
219+
}
220+
}
221+
}
222+
}
223+
}
224+
225+
settingsEvaluated {
226+
settings.pluginManagement {
227+
repositories {
228+
maven {
229+
url = uri("${mavenCentralMirror.url}")
230+
credentials {
231+
username = "$username"
232+
password = "$password"
233+
}
234+
}
235+
maven {
236+
url = uri("https://repo.example.org")
237+
credentials {
238+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
239+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
240+
}
241+
}
242+
gradlePluginPortal()
243+
}
244+
}
245+
246+
settings.dependencyResolutionManagement {
247+
repositories {
248+
maven {
249+
url = uri("${mavenCentralMirror.url}")
250+
credentials {
251+
username = "$username"
252+
password = "$password"
253+
}
254+
}
255+
maven {
256+
url = uri("https://repo.example.org")
257+
credentials {
258+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
259+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
260+
}
261+
}
262+
}
263+
}
264+
}
265+
266+
""".trimIndent()
267+
268+
val content = mockBuilder.generatedText()
269+
content shouldBe expectedContent
270+
}
271+
272+
"prefer GradleDefinition over MavenCentralMirror if URLs match" {
273+
val repositoryUrl = "https://repo.example.org"
274+
val secUser = MockConfigFileBuilder.createSecret("userSecret")
275+
val secPass = MockConfigFileBuilder.createSecret("passSecret")
276+
277+
val definition1 = GradleDefinition(
278+
MockConfigFileBuilder.createInfrastructureService(repositoryUrl, secUser, secPass),
279+
emptySet()
280+
)
281+
282+
val username = "test-username"
283+
val infraUsernameSecret = MockConfigFileBuilder.createSecret("infra-secret-username")
284+
val password = "test-password"
285+
val infraPasswordSecret = MockConfigFileBuilder.createSecret("infra-secret-password")
286+
val mavenCentralMirror = MavenCentralMirror(
287+
id = "central",
288+
name = "Maven Central",
289+
url = repositoryUrl,
290+
mirrorOf = "central",
291+
usernameSecret = infraUsernameSecret.name,
292+
passwordSecret = infraPasswordSecret.name
293+
)
294+
295+
val mockBuilder = MockConfigFileBuilder()
296+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraUsernameSecret.path)) } returns username
297+
every { mockBuilder.infraSecretResolverFun.invoke(Path(infraPasswordSecret.path)) } returns password
298+
every { mockBuilder.adminConfig.mavenCentralMirror } returns mavenCentralMirror
299+
300+
GradleInitGenerator().generate(mockBuilder.builder, listOf(definition1))
301+
302+
val expectedContent = """
303+
allprojects {
304+
repositories {
305+
maven {
306+
url = uri("$repositoryUrl")
307+
credentials {
308+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
309+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
310+
}
311+
}
312+
}
313+
314+
buildscript {
315+
repositories {
316+
maven {
317+
url = uri("$repositoryUrl")
318+
credentials {
319+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
320+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
321+
}
322+
}
323+
}
324+
}
325+
}
326+
327+
settingsEvaluated {
328+
settings.pluginManagement {
329+
repositories {
330+
maven {
331+
url = uri("$repositoryUrl")
332+
credentials {
333+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
334+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
335+
}
336+
}
337+
gradlePluginPortal()
338+
}
339+
}
340+
341+
settings.dependencyResolutionManagement {
342+
repositories {
343+
maven {
344+
url = uri("$repositoryUrl")
345+
credentials {
346+
username = "${MockConfigFileBuilder.testSecretRef(secUser)}"
347+
password = "${MockConfigFileBuilder.testSecretRef(secPass)}"
348+
}
349+
}
350+
}
351+
}
352+
}
353+
354+
""".trimIndent()
355+
356+
val content = mockBuilder.generatedText()
357+
content shouldBe expectedContent
358+
}
359+
51360
"generate an empty file if MavenCentralMirror is null" {
52361
val mockBuilder = MockConfigFileBuilder()
53362

0 commit comments

Comments
 (0)