From 74adb3b50fceea2934d4da09c51738c436c2b039 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 3 Nov 2022 16:52:28 +0100 Subject: [PATCH 1/2] Support custom Unit config in Sbt --- sbt-plugin/build.sbt | 13 +++--- sbt-plugin/src/main/scala/SNUnitPlugin.scala | 13 +++++- .../snunit-plugin/custom-config/build.sbt | 44 +++++++++++++++++++ .../custom-config/project/build.properties | 1 + .../custom-config/project/plugins.sbt | 5 +++ .../custom-config/src/main/scala/Main.scala | 9 ++++ .../sbt-test/snunit-plugin/custom-config/test | 2 + .../src/SNUnitPluginShared.scala | 43 ++++++++++-------- .../src/UnitConfiguration.scala | 5 +++ 9 files changed, 110 insertions(+), 25 deletions(-) create mode 100644 sbt-plugin/src/sbt-test/snunit-plugin/custom-config/build.sbt create mode 100644 sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/build.properties create mode 100644 sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/plugins.sbt create mode 100644 sbt-plugin/src/sbt-test/snunit-plugin/custom-config/src/main/scala/Main.scala create mode 100644 sbt-plugin/src/sbt-test/snunit-plugin/custom-config/test create mode 100644 snunit-plugins-shared/src/UnitConfiguration.scala diff --git a/sbt-plugin/build.sbt b/sbt-plugin/build.sbt index 9a6ee372..8936d429 100644 --- a/sbt-plugin/build.sbt +++ b/sbt-plugin/build.sbt @@ -7,11 +7,14 @@ import scala.sys.process._ val snunitVersion = Def.setting { val snunitDir = baseDirectory.value / ".." - val versionString = - Process( - Seq("./mill", "--disable-ticker", "show", s"snunit-plugins-shared[${Versions.scala212}].publishVersion"), - cwd = snunitDir - ).!! + Process( + Seq("./mill", "--disable-ticker", s"snunit-plugins-shared[${Versions.scala212}].publishLocal"), + cwd = snunitDir + ).!! + val versionString = Process( + Seq("./mill", "--disable-ticker", "show", s"snunit-plugins-shared[${Versions.scala212}].publishVersion"), + cwd = snunitDir + ).!! val JString(version) = Parser.parseFromString(versionString).get version } diff --git a/sbt-plugin/src/main/scala/SNUnitPlugin.scala b/sbt-plugin/src/main/scala/SNUnitPlugin.scala index 274cb886..352cf608 100644 --- a/sbt-plugin/src/main/scala/SNUnitPlugin.scala +++ b/sbt-plugin/src/main/scala/SNUnitPlugin.scala @@ -14,6 +14,8 @@ object SNUnitPlugin extends AutoPlugin { object autoImport { val snunitPort = settingKey[Int]("Port where the SNUnit app runs") val snunitCurlCommand = settingKey[Seq[String]]("curl command to use") + val snunitAppName = settingKey[String]("app name in NGINX Unit config") + val snunitConfig = settingKey[String]("NGINX Unit configuration") val snunitVersion: String = snunit.plugin.internal.BuildInfo.snunitVersion val deployToNGINXUnit = taskKey[Unit]("Deploy app to NGINX Unit") @@ -34,10 +36,17 @@ object SNUnitPlugin extends AutoPlugin { }, snunitCurlCommand := Seq("curl"), snunitPort := 8080, - deployToNGINXUnit := { + snunitAppName := name.value, + snunitConfig := { + val appName = snunitAppName.value val port = snunitPort.value + SNUnitPluginShared.defaultConfig(appName, port) + }, + deployToNGINXUnit := { + val config = snunitConfig.value val executable = (Compile / nativeLink).value - shared.value.deployToNGINXUnit(executable.toString, port) + val appName = snunitAppName.value + shared.value.deployToNGINXUnit(appName = appName, config = config, executable = executable.toString) } ) } diff --git a/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/build.sbt b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/build.sbt new file mode 100644 index 00000000..bcae3fdf --- /dev/null +++ b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/build.sbt @@ -0,0 +1,44 @@ +enablePlugins(ScalaNativePlugin) +enablePlugins(SNUnitPlugin) + +scalaVersion := "3.2.0" +snunitConfig := """{ + "listeners": { + "*:8086": { + "pass": "routes" + } + }, + "routes": [ + { + "action": { + "pass": "applications/my_app" + } + } + ], + "applications": { + "my_app": { + "processes": { + "max": 10, + "spare": 2, + "idle_timeout": 1 + }, + "type": "external", + "executable": "$SNUNIT_BINARY", + "limits": { + "timeout": 1, + "requests": 1000 + } + } + } +}""" +snunitCurlCommand := Seq("sudo", "curl") +snunitAppName := "my_app" +libraryDependencies += "com.github.lolgab" %%% "snunit" % snunitVersion + +lazy val doCallToServer = taskKey[Unit]("test that server works") +doCallToServer := { + import sys.process._ + val port = snunitPort.value + val response = s"curl -sL http://127.0.0.1:8086".!! + require(response == "Hello world\n") +} diff --git a/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/build.properties b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/build.properties new file mode 100644 index 00000000..563a014d --- /dev/null +++ b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.7.2 diff --git a/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/plugins.sbt b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/plugins.sbt new file mode 100644 index 00000000..3b848608 --- /dev/null +++ b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/project/plugins.sbt @@ -0,0 +1,5 @@ +sys.props.get("plugin.version") match { + case Some(x) => addSbtPlugin("com.github.lolgab" % "sbt-snunit" % x) + case _ => sys.error("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) +} diff --git a/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/src/main/scala/Main.scala b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/src/main/scala/Main.scala new file mode 100644 index 00000000..802a6e4c --- /dev/null +++ b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/src/main/scala/Main.scala @@ -0,0 +1,9 @@ +import snunit._ + +object HelloWorld { + def main(args: Array[String]): Unit = { + SyncServerBuilder + .build(_.send(StatusCode.OK, "Hello world", Seq())) + .listen() + } +} diff --git a/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/test b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/test new file mode 100644 index 00000000..50c4e273 --- /dev/null +++ b/sbt-plugin/src/sbt-test/snunit-plugin/custom-config/test @@ -0,0 +1,2 @@ +> deployToNGINXUnit +> doCallToServer diff --git a/snunit-plugins-shared/src/SNUnitPluginShared.scala b/snunit-plugins-shared/src/SNUnitPluginShared.scala index 2f09b07b..21a6cf2d 100644 --- a/snunit-plugins-shared/src/SNUnitPluginShared.scala +++ b/snunit-plugins-shared/src/SNUnitPluginShared.scala @@ -76,39 +76,46 @@ private[plugin] class SNUnitPluginShared(buildTool: BuildTool, logger: Logger, s private def doCurl(control: File, command: String*) = (snunitCurlCommand ++ Seq("-sL", "--unix-socket", control.toString) ++ command).!! - def deployToNGINXUnit(executable: String, port: Int): Unit = { + def deployToNGINXUnit(appName: String, config: String, executable: String): Unit = { require(isUnitInstalled(), "unitd is not installed") val control = unitControlSocket() require(controlSocketExists(control), "control socket doesn't exist") require(isUnitRunning(control), "unitd is not available") - val config = s"""{ - "applications": { - "app": { - "type": "external", - "executable": "$executable" - } - }, - "listeners": { - "*:$port": { - "pass": "applications/app" - } - } - }""" + val configToApply = config.replaceAllLiterally(SNUnitPluginShared.binaryPlaceholder, executable) + println(configToApply) val result = doCurl( control, "-X", "PUT", "-d", - config, + configToApply, "http://localhost/config" ) logger.info(result) - restartApp(control) + restartApp(control, appName = appName) } - private def restartApp(control: File) = { - val result = doCurl(control, "http://localhost/control/applications/app/restart") + private def restartApp(control: File, appName: String) = { + val result = doCurl(control, s"http://localhost/control/applications/$appName/restart") logger.info(result) } } +private[plugin] object SNUnitPluginShared { + private final val binaryPlaceholder = "$SNUNIT_BINARY" + def defaultConfig(appName: String, port: Int): String = { + s"""{ + "listeners": { + "*:$port": { + "pass": "applications/$appName" + } + }, + "applications": { + "$appName": { + "type": "external", + "executable": "$binaryPlaceholder" + } + } + }""" + } +} diff --git a/snunit-plugins-shared/src/UnitConfiguration.scala b/snunit-plugins-shared/src/UnitConfiguration.scala new file mode 100644 index 00000000..72041dc7 --- /dev/null +++ b/snunit-plugins-shared/src/UnitConfiguration.scala @@ -0,0 +1,5 @@ +package snunit.plugin + +case class Route( + +) From 548b717e67c2099a36f10a1deebedb0ebf46a1e7 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Fri, 4 Nov 2022 11:56:40 +0100 Subject: [PATCH 2/2] Change snunitConfig to be a task --- sbt-plugin/src/main/scala/SNUnitPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbt-plugin/src/main/scala/SNUnitPlugin.scala b/sbt-plugin/src/main/scala/SNUnitPlugin.scala index 352cf608..a71eb3d9 100644 --- a/sbt-plugin/src/main/scala/SNUnitPlugin.scala +++ b/sbt-plugin/src/main/scala/SNUnitPlugin.scala @@ -15,7 +15,7 @@ object SNUnitPlugin extends AutoPlugin { val snunitPort = settingKey[Int]("Port where the SNUnit app runs") val snunitCurlCommand = settingKey[Seq[String]]("curl command to use") val snunitAppName = settingKey[String]("app name in NGINX Unit config") - val snunitConfig = settingKey[String]("NGINX Unit configuration") + val snunitConfig = taskKey[String]("NGINX Unit configuration") val snunitVersion: String = snunit.plugin.internal.BuildInfo.snunitVersion val deployToNGINXUnit = taskKey[Unit]("Deploy app to NGINX Unit")