[Gradle] Install ruby locally in CocoaPods tests
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt
index 8c76ac0..3b3cc53 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt
@@ -19,7 +19,6 @@
import org.jetbrains.kotlin.gradle.util.modify
import org.jetbrains.kotlin.gradle.util.runProcess
import org.jetbrains.kotlin.konan.target.HostManager
-import org.jetbrains.kotlin.konan.target.KonanTarget
import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.BeforeClass
@@ -1883,46 +1882,50 @@
@BeforeClass
@JvmStatic
- fun installCocoaPods() {
- if (cocoapodsInstallationRequired) {
- if (cocoapodsInstallationAllowed) {
- println("Installing CocoaPods...")
- gem("install", "--install-dir", cocoapodsInstallationRoot.absolutePath, "cocoapods", "-v", cocoapodsVersion)
- } else {
- fail(
- """
- Running CocoaPods integration tests requires cocoapods to be installed.
- Please install them manually:
- gem install cocoapods
- Or re-run the tests with the 'installCocoapods=true' Gradle property.
+ fun ensureCocoapodsInstalled() {
+ if (useLocalCocoapods) {
+ println("Installing RVM, Ruby, CocoaPods...")
+ installLocalEnvironment()
+ } else if (isCocoapodsInstalled()) {
+ println("Using system CocoaPods")
+ } else {
+ fail(
+ """
+ Running CocoaPods integration tests requires cocoapods to be installed.
+ Please install them manually:
+ gem install cocoapods
+ Or re-run the tests with the 'installCocoapods=true' Gradle property.
""".trimIndent()
- )
- }
+ )
}
}
- private const val cocoapodsVersion = "1.11.0"
+ private const val rubyVersion = "3.2.1"
+ private const val cocoapodsVersion = "1.12.0"
- private val cocoapodsInstallationRequired: Boolean by lazy {
- !isCocoapodsInstalled()
+ private val useLocalCocoapods: Boolean = System.getProperty("installCocoapods").toBoolean()
+ private val rvmInstallationRoot by lazy { createTempDir("rvm") }
+
+ private fun installLocalEnvironment() {
+ cmd("sh", "-c", "curl -sSL https://get.rvm.io | bash -s -- --path ${rvmInstallationRoot.absolutePath}")
+ rvm("install", rubyVersion)
+ rvm(rubyVersion, "do", "gem", "install", "cocoapods", "-v", cocoapodsVersion)
}
- private val cocoapodsInstallationAllowed: Boolean = System.getProperty("installCocoapods").toBoolean()
- private val cocoapodsInstallationRoot: File by lazy { createTempDir("cocoapods") }
- private val cocoapodsBinPath: File by lazy {
- if (hostIsArmMac) cocoapodsInstallationRoot.resolve("bin/wrapper") else cocoapodsInstallationRoot.resolve("bin")
+ private val pathEnv by lazy {
+ val customPath = if (useLocalCocoapods) {
+ rvm(rubyVersion, "gemdir").lineSequence().last() + "/bin" + File.pathSeparator
+ } else {
+ ""
+ }
+ customPath + System.getenv("PATH")
}
private fun getEnvs(): Map<String, String> {
- val path = cocoapodsBinPath.absolutePath + File.pathSeparator + System.getenv("PATH")
- val gemPath = System.getenv("GEM_PATH")?.let {
- cocoapodsInstallationRoot.absolutePath + File.pathSeparator + it
- } ?: cocoapodsInstallationRoot.absolutePath
return mapOf(
- "PATH" to path,
- "GEM_PATH" to gemPath,
+ "PATH" to pathEnv,
// CocoaPods 1.11 requires UTF-8 locale being set, more details: https://github.com/CocoaPods/CocoaPods/issues/10939
- "LC_ALL" to "en_US.UTF-8"
+ "LC_ALL" to "en_US.UTF-8",
)
}
@@ -1941,19 +1944,18 @@
}
}
- private fun gem(vararg args: String): String {
- // On ARM MacOS, run gem using arch -x86_64 to workaround problems with libffi.
- // https://stackoverflow.com/questions/64901180/running-cocoapods-on-apple-silicon-m1
- val command = listOf("gem", *args)
+ private fun rvm(vararg args: String): String {
+ return cmd(rvmInstallationRoot.resolve("bin/rvm").absolutePath, *args)
+ }
+
+ private fun cmd(vararg args: String): String {
+ val command = listOf(*args)
println("Run command: ${command.joinToString(separator = " ")}")
val result = runProcess(command, File("."), options = BuildOptions(forceOutputToStdout = true))
check(result.isSuccessful) {
- "Process 'gem ${args.joinToString(separator = " ")}' exited with error code ${result.exitCode}. See log for details."
+ "Process '${args.joinToString(separator = " ")}' exited with error code ${result.exitCode}. See log for details."
}
return result.output
}
-
- private val hostIsArmMac: Boolean
- get() = HostManager.host == KonanTarget.MACOS_ARM64
}
}
\ No newline at end of file