diff --git a/WORKSPACE b/WORKSPACE index 6bd68aa6..64316000 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -35,11 +35,19 @@ kotlin_repositories( register_toolchains("//:kotlin_toolchain") +http_archive( + name = "rules_java", + sha256 = "f8ae9ed3887df02f40de9f4f7ac3873e6dd7a471f9cddf63952538b94b59aeb3", + urls = [ + "https://github.com/bazelbuild/rules_java/releases/download/7.6.1/rules_java-7.6.1.tar.gz", + ], +) + load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") git_repository( name = "grab_bazel_common", - commit = "8cfb7bcb84f6d9631b01bb14c25644030ad2ecf8", + commit = "0962a9aaeee64ed17eb65b577060693c3b3dc244", remote = "https://github.com/grab/grab-bazel-common.git", ) @@ -47,11 +55,16 @@ load("@grab_bazel_common//rules:repositories.bzl", "bazel_common_dependencies") bazel_common_dependencies() +load("@grab_bazel_common//rules:deps_init.bzl", "bazel_common_deps_init") + +bazel_common_deps_init() + load("@grab_bazel_common//rules:setup.bzl", "bazel_common_setup") bazel_common_setup( buildifier_version = "6.3.3", patched_android_tools = True, + pinned_maven_install = True, ) load("@grab_bazel_common//rules:maven.bzl", "pin_bazel_common_dependencies") @@ -74,9 +87,9 @@ load("@grab_bazel_common//:workspace_defs.bzl", "GRAB_BAZEL_COMMON_ARTIFACTS") http_archive( name = "rules_jvm_external", - sha256 = "d31e369b854322ca5098ea12c69d7175ded971435e55c18dd9dd5f29cc5249ac", - strip_prefix = "rules_jvm_external-5.3", - url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/5.3/rules_jvm_external-5.3.tar.gz", + sha256 = "e5f83b8f2678d2b26441e5eafefb1b061826608417b8d24e5e8e15e585eab1ba", + strip_prefix = "rules_jvm_external-6.10", + url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/6.10/rules_jvm_external-6.10.tar.gz", ) load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") diff --git a/build.gradle b/build.gradle index db5a4f3e..e2fbb48f 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ grazel { rules { bazelCommon { gitRepository { - commit = "8cfb7bcb84f6d9631b01bb14c25644030ad2ecf8" + commit = "0962a9aaeee64ed17eb65b577060693c3b3dc244" remote = "https://github.com/grab/grab-bazel-common.git" } toolchains { @@ -80,6 +80,17 @@ grazel { supportedArch = ["amd64", "arm64"] } } + preBazelCommonArchives = [ + [ + name: "rules_java", + sha256: "f8ae9ed3887df02f40de9f4f7ac3873e6dd7a471f9cddf63952538b94b59aeb3", + url: "", + urls: ["https://github.com/bazelbuild/rules_java/releases/download/7.6.1/rules_java-7.6.1.tar.gz"], + stripPrefix: null, + patches: [], + patchArgs: [], + ] as com.grab.grazel.extension.PreBazelCommonArchive, + ] } googleServices { crashlytics { @@ -92,9 +103,9 @@ grazel { } mavenInstall { httpArchiveRepository { - sha256 = "d31e369b854322ca5098ea12c69d7175ded971435e55c18dd9dd5f29cc5249ac" - stripPrefix = "rules_jvm_external-5.3" - url = String.format("https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz", "5.3", "5.3") + sha256 = "e5f83b8f2678d2b26441e5eafefb1b061826608417b8d24e5e8e15e585eab1ba" + stripPrefix = "rules_jvm_external-6.10" + url = String.format("https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz", "6.10", "6.10") } includeCredentials = false resolveTimeout = 1000 diff --git a/constants.gradle b/constants.gradle index 9d36b1f3..03c8d56d 100644 --- a/constants.gradle +++ b/constants.gradle @@ -15,7 +15,7 @@ */ ext { groupId = "com.grab.grazel" - versionName = project.hasProperty("versionName") ? versionName : "0.4.2-alpha.13" + versionName = project.hasProperty("versionName") ? versionName : "0.4.2-alpha.14" website = "https://grab.github.io/Grazel/" } diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/CommonRules.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/CommonRules.kt index dd8877a9..f8bd5d53 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/CommonRules.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/CommonRules.kt @@ -18,9 +18,11 @@ package com.grab.grazel.bazel.rules import com.grab.grazel.bazel.starlark.StatementsBuilder import com.grab.grazel.bazel.starlark.add +import com.grab.grazel.bazel.starlark.array import com.grab.grazel.bazel.starlark.function import com.grab.grazel.bazel.starlark.load import com.grab.grazel.bazel.starlark.quote +import com.grab.grazel.extension.PreBazelCommonArchive const val GRAB_BAZEL_COMMON = "grab_bazel_common" const val GRAB_BAZEL_COMMON_ARTIFACTS = "GRAB_BAZEL_COMMON_ARTIFACTS" @@ -49,13 +51,18 @@ fun StatementsBuilder.registerToolchain(toolchain: String) { fun StatementsBuilder.bazelCommonRepository( repositoryRule: GitRepositoryRule, buildifierVersion: String, + pinnedMavenInstall: Boolean = true, + additionalCoursierOptions: List = emptyList(), ) { add(repositoryRule) val bazelCommonRepoName = repositoryRule.name bazelCommonDependencies(bazelCommonRepoName) + bazelCommonDepsInit(bazelCommonRepoName) bazelCommonInitialize( bazelCommonRepoName, buildifierVersion, + pinnedMavenInstall, + additionalCoursierOptions, ) pinBazelCommonArtifacts(bazelCommonRepoName) } @@ -70,13 +77,38 @@ fun StatementsBuilder.bazelCommonDependencies(bazelCommonRepoName: String) { function("bazel_common_dependencies") } +fun StatementsBuilder.bazelCommonDepsInit(bazelCommonRepoName: String) { + load("@${bazelCommonRepoName}//rules:deps_init.bzl", "bazel_common_deps_init") + function("bazel_common_deps_init") +} + fun StatementsBuilder.bazelCommonInitialize( bazelCommonRepoName: String, buildifierVersion: String, + pinnedMavenInstall: Boolean = true, + additionalCoursierOptions: List = emptyList(), ) { load("@${bazelCommonRepoName}//rules:setup.bzl", "bazel_common_setup") function("bazel_common_setup") { "patched_android_tools" `=` "True" "buildifier_version" `=` buildifierVersion.quote + "pinned_maven_install" `=` if (pinnedMavenInstall) "True" else "False" + if (additionalCoursierOptions.isNotEmpty()) { + "additional_coursier_options" `=` array(additionalCoursierOptions.quote) + } + } +} + +fun StatementsBuilder.preBazelCommonArchives(archives: List) { + archives.forEach { archive -> + add(HttpArchiveRule( + name = archive.name, + url = archive.url, + urls = archive.urls, + sha256 = archive.sha256, + stripPrefix = archive.stripPrefix, + patches = archive.patches, + patchArgs = archive.patchArgs + )) } } diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/MavenRules.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/MavenRules.kt index 7201cd00..76c7cbd9 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/MavenRules.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/MavenRules.kt @@ -91,6 +91,7 @@ fun StatementsBuilder.mavenInstall( overrideTargets: Map = emptyMap(), versionConflictPolicy: String? = null, artifactPinning: Boolean = false, + additionalCoursierOptions: List = emptyList(), ) { load("@$rulesJvmExternalName//:defs.bzl", "maven_install") load("@$rulesJvmExternalName//:specs.bzl", "maven") @@ -146,6 +147,10 @@ fun StatementsBuilder.mavenInstall( if (artifactPinning) { "fail_if_repin_required" `=` "False" } + + if (additionalCoursierOptions.isNotEmpty()) { + "additional_coursier_options" `=` array(additionalCoursierOptions.quote) + } } if (artifactPinning) { diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/RepositoryRules.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/RepositoryRules.kt index 1f27bbff..bce6cadb 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/RepositoryRules.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/bazel/rules/RepositoryRules.kt @@ -17,6 +17,7 @@ package com.grab.grazel.bazel.rules import com.grab.grazel.bazel.starlark.StatementsBuilder +import com.grab.grazel.bazel.starlark.array import com.grab.grazel.bazel.starlark.load import com.grab.grazel.bazel.starlark.quote @@ -68,18 +69,32 @@ fun StatementsBuilder.httpArchive( url: String, sha256: String? = null, type: String? = null, - stripPrefix: String? = null + stripPrefix: String? = null, + urls: List = emptyList(), + patches: List = emptyList(), + patchArgs: List = emptyList() ) { load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") rule("http_archive") { "name" `=` name.quote stripPrefix?.let { "strip_prefix" `=` stripPrefix } sha256?.let { "sha256" `=` sha256 } - "url" `=` url + if (urls.isNotEmpty()) { + "urls" `=` array(urls.quote) + } else if (url.isNotEmpty()) { + "url" `=` url + } type?.let { "type" `=` type } + if (patches.isNotEmpty()) { + "patches" `=` array(patches.quote) + } + if (patchArgs.isNotEmpty()) { + "patch_args" `=` array(patchArgs.quote) + } } } + /** * Data structure denoting `http_archive` * @@ -90,16 +105,23 @@ data class HttpArchiveRule( var url: String, var sha256: String? = null, var type: String? = null, - var stripPrefix: String? = null + var stripPrefix: String? = null, + var urls: List = emptyList(), + var patches: List = emptyList(), + var patchArgs: List = emptyList() ) : BazelRepositoryRule { override fun StatementsBuilder.statements() { httpArchive( name = name.quote, url = url.quote, + urls = urls, sha256 = sha256?.quote, type = type?.quote, - stripPrefix = stripPrefix?.quote + stripPrefix = stripPrefix?.quote, + patches = patches, + patchArgs = patchArgs ) } } + diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/BazelCommonExtension.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/BazelCommonExtension.kt index 1943c66e..4ed4251e 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/BazelCommonExtension.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/BazelCommonExtension.kt @@ -19,11 +19,44 @@ package com.grab.grazel.extension import com.grab.grazel.bazel.rules.GRAB_BAZEL_COMMON import com.grab.grazel.bazel.rules.GitRepositoryRule import groovy.lang.Closure +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property +import org.gradle.kotlin.dsl.listProperty +import org.gradle.kotlin.dsl.property + +/** + * Configuration for http archives needed before bazel_common initialization + * (e.g., remote_java_tools, rules_java_builtin, rules_java) + */ +open class PreBazelCommonArchive( + open var name: String = "", + open var sha256: String = "", + open var url: String = "", + open var urls: List = emptyList(), + open var stripPrefix: String? = null, + open var patches: List = emptyList(), + open var patchArgs: List = emptyList(), +) class BazelCommonExtension( + private val objects: ObjectFactory? = null, var repository: GitRepositoryRule = GitRepositoryRule(name = GRAB_BAZEL_COMMON), - var toolchains: CommonToolchainExtension = CommonToolchainExtension() + var toolchains: CommonToolchainExtension = CommonToolchainExtension(), + private val _preBazelCommonArchives: MutableList = mutableListOf(), ) { + var pinnedMavenInstall: Property? = objects?.property()?.convention(true) + var additionalCoursierOptions: ListProperty? = objects?.listProperty()?.convention( + emptyList() + ) + + var preBazelCommonArchives: List + get() = _preBazelCommonArchives + set(value) { + _preBazelCommonArchives.clear() + _preBazelCommonArchives.addAll(value) + } + fun gitRepository(closure: Closure<*>) { closure.delegate = repository closure.call() diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/MavenInstallExtension.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/MavenInstallExtension.kt index 8aa18933..89f208e3 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/MavenInstallExtension.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/MavenInstallExtension.kt @@ -29,14 +29,15 @@ import org.gradle.kotlin.dsl.property internal const val RULES_JVM_EXTERNAL_NAME = "rules_jvm_external" internal const val RULES_JVM_EXTERNAL_SHA256 = - "d31e369b854322ca5098ea12c69d7175ded971435e55c18dd9dd5f29cc5249ac" -internal const val RULES_JVM_EXTERNAl_TAG = "5.3" + "e5f83b8f2678d2b26441e5eafefb1b061826608417b8d24e5e8e15e585eab1ba" +internal const val RULES_JVM_EXTERNAl_TAG = "6.10" internal val MAVEN_INSTALL_REPOSITORY = HttpArchiveRule( name = RULES_JVM_EXTERNAL_NAME, sha256 = RULES_JVM_EXTERNAL_SHA256, stripPrefix = "rules_jvm_external-%s".format(RULES_JVM_EXTERNAl_TAG), - url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip".format( + url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz".format( + RULES_JVM_EXTERNAl_TAG, RULES_JVM_EXTERNAl_TAG ) ) @@ -57,6 +58,8 @@ internal val MAVEN_INSTALL_REPOSITORY = HttpArchiveRule( * `maven_install.override_targets` param. * @param jetifyIncludeList Maven artifacts in `groupId:artifact` format that should be added * `maven_install.jetify_include_list` + * @param additionalCoursierOptions Additional options to pass to Coursier, maps to + * `maven_install.additional_coursier_options` */ data class MavenInstallExtension( private val objects: ObjectFactory, @@ -70,6 +73,9 @@ data class MavenInstallExtension( var jetifyExcludeList: ListProperty = objects.listProperty(), var versionConflictPolicy: String? = null, var includeCredentials: Boolean = true, + var additionalCoursierOptions: ListProperty = objects.listProperty().convention( + emptyList() + ), ) { // TODO GitRepositoryRule /** diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/RulesExtension.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/RulesExtension.kt index 18c10de9..bcb0acc0 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/RulesExtension.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/extension/RulesExtension.kt @@ -50,7 +50,7 @@ data class DependenciesExtension( */ data class RulesExtension( private val objects: ObjectFactory, - val bazelCommon: BazelCommonExtension = BazelCommonExtension(), + val bazelCommon: BazelCommonExtension = BazelCommonExtension(objects), val googleServices: GoogleServicesExtension = GoogleServicesExtension(), val mavenInstall: MavenInstallExtension = MavenInstallExtension(objects), val kotlin: KotlinExtension = KotlinExtension(), diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallArtifactsCalculator.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallArtifactsCalculator.kt index 67806461..ddb2d1ec 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallArtifactsCalculator.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallArtifactsCalculator.kt @@ -120,7 +120,8 @@ constructor( artifactPinning = mavenInstallExtension.artifactPinning.enabled.get(), versionConflictPolicy = mavenInstallExtension.versionConflictPolicy, mavenInstallJson = mavenInstallJson.name, - isMavenInstallJsonEnabled = mavenInstallExtension.artifactPinning.enabled.get() && mavenInstallJson.exists() + isMavenInstallJsonEnabled = mavenInstallExtension.artifactPinning.enabled.get() && mavenInstallJson.exists(), + additionalCoursierOptions = mavenInstallExtension.additionalCoursierOptions.get() ) } @@ -151,7 +152,8 @@ constructor( artifactPinning = mavenInstallExtension.artifactPinning.enabled.get(), versionConflictPolicy = mavenInstallExtension.versionConflictPolicy, mavenInstallJson = kspMavenInstallJson.name, - isMavenInstallJsonEnabled = mavenInstallExtension.artifactPinning.enabled.get() && kspMavenInstallJson.exists() + isMavenInstallJsonEnabled = mavenInstallExtension.artifactPinning.enabled.get() && kspMavenInstallJson.exists(), + additionalCoursierOptions = mavenInstallExtension.additionalCoursierOptions.get() ) ) } diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallData.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallData.kt index 200f37ab..74e68aab 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallData.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/dependencies/MavenInstallData.kt @@ -21,7 +21,8 @@ internal data class MavenInstallData( * then in generated code maven_install_json will be commented out */ val isMavenInstallJsonEnabled: Boolean, - val versionConflictPolicy: String? + val versionConflictPolicy: String?, + val additionalCoursierOptions: List = listOf("--parallel", "12") ) internal data class JetifierConfig( diff --git a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/internal/WorkspaceBuilder.kt b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/internal/WorkspaceBuilder.kt index 84dc09bd..5b528bf6 100644 --- a/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/internal/WorkspaceBuilder.kt +++ b/grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/migrate/internal/WorkspaceBuilder.kt @@ -30,6 +30,7 @@ import com.grab.grazel.bazel.rules.kotlinRepository import com.grab.grazel.bazel.rules.loadBazelCommonArtifacts import com.grab.grazel.bazel.rules.loadDaggerArtifactsAndRepositories import com.grab.grazel.bazel.rules.mavenInstall +import com.grab.grazel.bazel.rules.preBazelCommonArchives import com.grab.grazel.bazel.rules.registerKotlinToolchain import com.grab.grazel.bazel.rules.setupMavenInstall import com.grab.grazel.bazel.rules.toolAndroidRepository @@ -87,6 +88,12 @@ internal class WorkspaceBuilder( kotlinRules() + // Generate pre-bazel_common http_archive rules + val bazelCommon = grazelExtension.rules.bazelCommon + if (bazelCommon.preBazelCommonArchives.isNotEmpty()) { + preBazelCommonArchives(bazelCommon.preBazelCommonArchives) + } + bazelCommon() buildJvmRules() @@ -139,6 +146,7 @@ internal class WorkspaceBuilder( artifactPinning = mavenInstallData.artifactPinning, mavenInstallJson = mavenInstallData.mavenInstallJson, mavenInstallJsonEnabled = mavenInstallData.isMavenInstallJsonEnabled, + additionalCoursierOptions = mavenInstallData.additionalCoursierOptions, ) } } @@ -153,6 +161,8 @@ internal class WorkspaceBuilder( bazelCommonRepository( bazelCommonRepo, buildifier.releaseVersion, + bazelCommon.pinnedMavenInstall?.get() ?: true, + bazelCommon.additionalCoursierOptions?.get() ?: emptyList(), ) }