Skip to content

Commit 4f599aa

Browse files
petertrrsonartech
authored andcommitted
SONARIAC-2502 Gradle builds should use Repox when authentication is available (#665)
SONARIAC-2503 Use master branch for build-logic/common (#667) GitOrigin-RevId: 97d3929f40727a2df9a60b81210dcbffd98e607b
1 parent 3563faa commit 4f599aa

File tree

10 files changed

+187
-82
lines changed

10 files changed

+187
-82
lines changed

build-logic/common/.cirrus.star

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Build
2+
on:
3+
push:
4+
branches:
5+
- master
6+
- branch-*
7+
pull_request:
8+
workflow_dispatch:
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
12+
cancel-in-progress: true
13+
14+
jobs:
15+
build:
16+
name: Build
17+
runs-on: github-ubuntu-latest-s
18+
permissions:
19+
id-token: write
20+
contents: write
21+
steps:
22+
- uses: actions/checkout@v5
23+
with:
24+
fetch-depth: 0
25+
- uses: jdx/mise-action@5ac50f778e26fac95da98d50503682459e86d566 # v3.2.0
26+
with:
27+
version: 2025.7.12
28+
- name: get secrets
29+
id: secrets
30+
uses: SonarSource/vault-action-wrapper@v3
31+
with:
32+
secrets: |
33+
development/kv/data/develocity token | DEVELOCITY_TOKEN;
34+
35+
# The SonarSource/ci-github-actions/build-gradle fails because of no access to ARTIFACTORY_DEPLOY_USERNAME
36+
# it is not needed in this case, so the Gradle is called directly
37+
- name: Build with Gradle
38+
env:
39+
DEVELOCITY_ACCESS_KEY: develocity-public.sonar.build=${{ fromJSON(steps.secrets.outputs.vault).DEVELOCITY_TOKEN }}
40+
run: |
41+
./gradlew build
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: Cleanup PR Resources
2+
on:
3+
pull_request:
4+
types: [closed]
5+
6+
jobs:
7+
cleanup:
8+
runs-on: github-ubuntu-latest-s
9+
permissions:
10+
actions: write
11+
steps:
12+
- uses: SonarSource/ci-github-actions/pr_cleanup@v1
13+

build-logic/common/gradle-modules/src/main/kotlin/org.sonarsource.cloud-native.rule-api.gradle.kts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* along with this program; if not, see https://sonarsource.com/license/ssal/
1616
*/
1717
import org.sonarsource.cloudnative.gradle.RuleApiExtension
18+
import org.sonarsource.cloudnative.gradle.ifAuthenticatedOrElse
1819
import org.sonarsource.cloudnative.gradle.registerRuleApiGenerateTask
1920
import org.sonarsource.cloudnative.gradle.registerRuleApiUpdateTask
2021
import org.sonarsource.cloudnative.gradle.repox
@@ -23,12 +24,15 @@ val ruleApi: Configuration = configurations.create("ruleApi")
2324
val ruleApiExtension = extensions.create<RuleApiExtension>("ruleApi")
2425

2526
repositories {
26-
repox("sonarsource-private-releases", providers, ruleApiExtension.fileOperations)
27-
mavenCentral()
27+
ifAuthenticatedOrElse(providers, { artifactoryUsername, artifactoryPassword ->
28+
repox("sonarsource-private-releases", artifactoryUsername, artifactoryPassword, ruleApiExtension.fileOperations)
29+
}) {
30+
error("Downloading dependencies from sonarsource-private-releases requires authentication.")
31+
}
2832
}
2933

3034
dependencies {
31-
ruleApi("com.sonarsource.rule-api:rule-api:2.16.0.5596")
35+
ruleApi("com.sonarsource.rule-api:rule-api:2.17.0.5605")
3236
ruleApi("org.slf4j:slf4j-nop:1.7.36") {
3337
because(
3438
"To get rid of a warning. A logging backend is not needed, because the rule API logs everything important to stdout. " +

build-logic/common/gradle-modules/src/main/kotlin/org/sonarsource/cloudnative/gradle/BuildUtils.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.sonarsource.cloudnative.gradle
1818

1919
import java.io.File
20-
import java.util.HashSet
2120
import java.util.Locale
2221
import java.util.jar.JarInputStream
2322
import org.gradle.api.GradleException
@@ -40,27 +39,18 @@ fun Project.signingCondition(): Boolean {
4039

4140
internal fun RepositoryHandler.repox(
4241
repository: String,
43-
providers: ProviderFactory,
42+
artifactoryUsername: String,
43+
artifactoryPassword: String,
4444
fileOperations: FileOperations,
4545
): MavenArtifactRepository =
4646
maven {
4747
name = "artifactory"
4848
url = fileOperations.uri("https://repox.jfrog.io/repox/$repository")
4949

50-
// This authentication relies on env vars configured on Cirrus CI or on Gradle properties (`-P<prop>` flags or `gradle.properties` file)
51-
val artifactoryUsername = providers.environmentVariable("ARTIFACTORY_PRIVATE_USERNAME")
52-
.orElse(providers.environmentVariable("ARTIFACTORY_USERNAME"))
53-
.orElse(providers.gradleProperty("artifactoryUsername"))
54-
val artifactoryPassword = providers.environmentVariable("ARTIFACTORY_PRIVATE_PASSWORD")
55-
.orElse(providers.environmentVariable("ARTIFACTORY_ACCESS_TOKEN"))
56-
.orElse(providers.gradleProperty("artifactoryPassword"))
57-
58-
if (artifactoryUsername.isPresent && artifactoryPassword.isPresent) {
59-
authentication {
60-
credentials {
61-
username = artifactoryUsername.get()
62-
password = artifactoryPassword.get()
63-
}
50+
authentication {
51+
credentials {
52+
username = artifactoryUsername
53+
password = artifactoryPassword
6454
}
6555
}
6656
}
@@ -129,3 +119,23 @@ fun getArchitecture(): String {
129119
else -> "amd64"
130120
}
131121
}
122+
123+
internal fun ifAuthenticatedOrElse(
124+
providers: ProviderFactory,
125+
onAuthenticated: (artifactoryUsername: String, artifactoryPassword: String) -> Unit,
126+
onNotAuthenticated: () -> Unit,
127+
) {
128+
// This authentication relies on env vars configured on Cirrus CI or on Gradle properties (`-P<prop>` flags or `gradle.properties` file)
129+
val artifactoryUsername = providers.environmentVariable("ARTIFACTORY_PRIVATE_USERNAME")
130+
.orElse(providers.environmentVariable("ARTIFACTORY_USERNAME"))
131+
.orElse(providers.gradleProperty("artifactoryUsername"))
132+
val artifactoryPassword = providers.environmentVariable("ARTIFACTORY_PRIVATE_PASSWORD")
133+
.orElse(providers.environmentVariable("ARTIFACTORY_ACCESS_TOKEN"))
134+
.orElse(providers.gradleProperty("artifactoryPassword"))
135+
136+
if (artifactoryUsername.isPresent && artifactoryPassword.isPresent) {
137+
onAuthenticated(artifactoryUsername.get(), artifactoryPassword.get())
138+
} else {
139+
onNotAuthenticated()
140+
}
141+
}

build-logic/common/gradle-modules/src/main/kotlin/org/sonarsource/cloudnative/gradle/CommonSettingsPlugin.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,31 @@ open class CommonSettingsPlugin
7575
private fun Settings.configureRepositories() {
7676
pluginManagement {
7777
repositories {
78-
mavenCentral()
79-
gradlePluginPortal()
80-
repox("sonarsource", settings.providers, fileOperations)
78+
ifAuthenticatedOrElse(providers, { artifactoryUsername, artifactoryPassword ->
79+
repox("sonarsource", artifactoryUsername, artifactoryPassword, fileOperations)
80+
}) {
81+
mavenCentral()
82+
gradlePluginPortal()
83+
}
8184
}
8285
}
8386

8487
dependencyResolutionManagement {
8588
repositories {
86-
mavenCentral()
87-
repox("sonarsource", settings.providers, fileOperations)
89+
ifAuthenticatedOrElse(providers, { artifactoryUsername, artifactoryPassword ->
90+
repox("sonarsource", artifactoryUsername, artifactoryPassword, fileOperations)
91+
}) {
92+
mavenCentral()
93+
}
8894
}
8995
}
9096

9197
buildscript.repositories {
92-
gradlePluginPortal()
98+
ifAuthenticatedOrElse(providers, { artifactoryUsername, artifactoryPassword ->
99+
repox("plugins.gradle.org", artifactoryUsername, artifactoryPassword, fileOperations)
100+
}) {
101+
gradlePluginPortal()
102+
}
93103
}
94104
}
95105

build-logic/common/gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
spotless-gradle = "8.0.0"
2+
spotless-gradle = "8.1.0"
33
blowdryer-gradle = "1.7.1"
44
develocity = "4.0.3"
55
jackson = "2.20.1"

build-logic/common/mise.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[tools]
2+
java = "21.0"
3+

build-logic/common/settings.gradle.kts

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import java.net.URI
2+
13
/*
24
* SonarSource Cloud Native Gradle Modules
35
* Copyright (C) 2024-2025 SonarSource Sàrl
@@ -15,9 +17,31 @@
1517
* along with this program; if not, see https://sonarsource.com/license/ssal/
1618
*/
1719
pluginManagement {
20+
// Note: because of the way how settings are initialized, we cannot reuse functions defined later in this file.
21+
val artifactoryUsername = providers.environmentVariable("ARTIFACTORY_PRIVATE_USERNAME")
22+
.orElse(providers.environmentVariable("ARTIFACTORY_USERNAME"))
23+
.orElse(providers.gradleProperty("artifactoryUsername"))
24+
val artifactoryPassword = providers.environmentVariable("ARTIFACTORY_PRIVATE_PASSWORD")
25+
.orElse(providers.environmentVariable("ARTIFACTORY_ACCESS_TOKEN"))
26+
.orElse(providers.gradleProperty("artifactoryPassword"))
27+
1828
repositories {
19-
mavenCentral()
20-
gradlePluginPortal()
29+
if (artifactoryUsername.isPresent && artifactoryPassword.isPresent) {
30+
maven {
31+
name = "artifactory"
32+
url = uri("https://repox.jfrog.io/repox/plugins.gradle.org")
33+
34+
authentication {
35+
credentials {
36+
username = artifactoryUsername.get()
37+
password = artifactoryPassword.get()
38+
}
39+
}
40+
}
41+
} else {
42+
mavenCentral()
43+
gradlePluginPortal()
44+
}
2145
}
2246
}
2347

@@ -30,13 +54,18 @@ include("gradle-modules")
3054

3155
dependencyResolutionManagement {
3256
repositories {
33-
mavenCentral()
34-
gradlePluginPortal()
57+
ifAuthenticatedOrElse(providers, { artifactoryUsername, artifactoryPassword ->
58+
repox("sonarsource", artifactoryUsername, artifactoryPassword, ::uri)
59+
repox("plugins.gradle.org", artifactoryUsername, artifactoryPassword, ::uri)
60+
}) {
61+
mavenCentral()
62+
gradlePluginPortal()
63+
}
3564
}
3665
}
3766

3867
develocity {
39-
server.set("https://develocity.sonar.build")
68+
server.set("https://develocity-public.sonar.build/")
4069
}
4170

4271
val isCI = System.getenv("CI") != null
@@ -49,3 +78,41 @@ buildCache {
4978
isPush = isCI
5079
}
5180
}
81+
82+
internal fun RepositoryHandler.repox(
83+
repository: String,
84+
artifactoryUsername: String,
85+
artifactoryPassword: String,
86+
uri: (Any) -> URI,
87+
): MavenArtifactRepository =
88+
maven {
89+
name = "artifactory"
90+
url = uri("https://repox.jfrog.io/repox/$repository")
91+
92+
authentication {
93+
credentials {
94+
username = artifactoryUsername
95+
password = artifactoryPassword
96+
}
97+
}
98+
}
99+
100+
internal fun ifAuthenticatedOrElse(
101+
providers: ProviderFactory,
102+
onAuthenticated: (artifactoryUsername: String, artifactoryPassword: String) -> Unit,
103+
onNotAuthenticated: () -> Unit,
104+
) {
105+
// This authentication relies on env vars configured on Cirrus CI or on Gradle properties (`-P<prop>` flags or `gradle.properties` file)
106+
val artifactoryUsername = providers.environmentVariable("ARTIFACTORY_PRIVATE_USERNAME")
107+
.orElse(providers.environmentVariable("ARTIFACTORY_USERNAME"))
108+
.orElse(providers.gradleProperty("artifactoryUsername"))
109+
val artifactoryPassword = providers.environmentVariable("ARTIFACTORY_PRIVATE_PASSWORD")
110+
.orElse(providers.environmentVariable("ARTIFACTORY_ACCESS_TOKEN"))
111+
.orElse(providers.gradleProperty("artifactoryPassword"))
112+
113+
if (artifactoryUsername.isPresent && artifactoryPassword.isPresent) {
114+
onAuthenticated(artifactoryUsername.get(), artifactoryPassword.get())
115+
} else {
116+
onNotAuthenticated()
117+
}
118+
}

build-logic/iac/settings.gradle.kts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414
* You should have received a copy of the Sonar Source-Available License
1515
* along with this program; if not, see https://sonarsource.com/license/ssal/
1616
*/
17+
pluginManagement {
18+
includeBuild("../common")
19+
}
20+
21+
plugins {
22+
id("org.sonarsource.cloud-native.common-settings")
23+
}
24+
1725
dependencyResolutionManagement {
18-
repositories {
19-
mavenCentral()
20-
gradlePluginPortal()
21-
}
2226
versionCatalogs {
2327
create("libs") {
2428
from(files("../../gradle/libs.versions.toml"))

0 commit comments

Comments
 (0)