diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/domain/DesktopService.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/domain/DesktopService.kt index 9593809..97b9a21 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/domain/DesktopService.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/domain/DesktopService.kt @@ -163,6 +163,7 @@ fun Prov.provisionIdeDesktop() { provisionPython() installHugoByDeb() installGo() + installBabashka() // IDEs installIntelliJ() diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/Babashka.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/Babashka.kt new file mode 100644 index 0000000..64e1cae --- /dev/null +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/Babashka.kt @@ -0,0 +1,51 @@ +package org.domaindrivenarchitecture.provs.desktop.infrastructure + +import org.domaindrivenarchitecture.provs.framework.core.Prov +import org.domaindrivenarchitecture.provs.framework.core.ProvResult +import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.* +import org.domaindrivenarchitecture.provs.framework.ubuntu.install.base.checkCommand +import org.domaindrivenarchitecture.provs.framework.ubuntu.web.base.downloadFromURL + +fun Prov.installBabashka( + version: String = "1.12.196", + enforceVersion: Boolean = false, + sha256sum: String = "13c197bf1151cac038abedfa2869a27303f62650474f334867264e13ee9f8cd6" +) = taskWithResult { + if (checkCommand("bb") && !enforceVersion) { + return@taskWithResult ProvResult(true) + } + + if (checkBabashkaVersion(version)) { + return@taskWithResult ProvResult(true, out = "Version $version of babashka is already installed.") + } + + val downloadUrl = "https://github.com/babashka/babashka/releases/download/v$version/babashka-$version-linux-amd64.tar.gz" + val filename = "babashka-$version-linux-amd64.tar.gz" + val target = "${userHome()}tmp" + val result = downloadFromURL( + downloadUrl, + filename, + target, + sha256sum = sha256sum + ) + + if (result.success) { + cmd("tar -C /usr/local/bin/ -xzf $target/go1.23.5.linux-amd64.tar.gz --no-same-owner", sudo = true) + deleteFile("$target/$filename") + + // check and assert installation + addResult(checkBabashkaVersion(version), info = "Babashka version $version has been installed.") + } else { + return@taskWithResult ProvResult(false, err = "Babashka $version could not be downloaded and installed. " + result.err) + } +} + +fun Prov.checkBabashkaVersion(version: String): Boolean { + val installedBabashkaVersion = babashkaVersion() + return installedBabashkaVersion != null && installedBabashkaVersion.startsWith("babashka v" + version) +} + +internal fun Prov.babashkaVersion(): String? { + val result = cmdNoEval("/usr/local/bb version") + return if (!result.success) null else result.out +} \ No newline at end of file diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/BabashkaKtTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/BabashkaKtTest.kt new file mode 100644 index 0000000..7d3ac0f --- /dev/null +++ b/src/test/kotlin/org/domaindrivenarchitecture/provs/desktop/infrastructure/BabashkaKtTest.kt @@ -0,0 +1,24 @@ +package org.domaindrivenarchitecture.provs.desktop.infrastructure + +import org.domaindrivenarchitecture.provs.test.defaultTestContainer +import org.domaindrivenarchitecture.provs.test.tags.ExtensiveContainerTest +import org.junit.jupiter.api.Assertions.assertTrue + + class BabashkaKtTest { + +@ExtensiveContainerTest + fun installBabashka() { + // given + val prov = defaultTestContainer() + + // when + val res = prov.task { + installGo() + installGo() // check repeatability + } + + // then + assertTrue(res.success) + } +} +