From 8169d2d878cf2ec2fb68fd9726df1b7ca814609e Mon Sep 17 00:00:00 2001 From: AireL Date: Sat, 22 Dec 2018 14:58:18 +0000 Subject: [PATCH] Added plugin details --- src/main/scala/com/twalford/SnykPlugin.scala | 26 +++++++++ src/main/scala/com/twalford/SnykTasks.scala | 56 ++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/main/scala/com/twalford/SnykPlugin.scala create mode 100644 src/main/scala/com/twalford/SnykTasks.scala diff --git a/src/main/scala/com/twalford/SnykPlugin.scala b/src/main/scala/com/twalford/SnykPlugin.scala new file mode 100644 index 0000000..5dbb043 --- /dev/null +++ b/src/main/scala/com/twalford/SnykPlugin.scala @@ -0,0 +1,26 @@ +package com.twalford + +import net.virtualvoid.sbt.graph.DependencyGraphPlugin +import sbt._ +import sbt.Keys._ +import SnykTasks._ + +object SnykPlugin extends AutoPlugin { + self => + override def requires = DependencyGraphPlugin + object autoImport { + val SnykPlugin: AutoPlugin = self + val snykOrganization = SnykTasks.snykOrganization + } + + override def globalSettings: Seq[Def.Setting[_]] = Seq( + Global / concurrentRestrictions += Tags.exclusive(snykTag), + aggregate in snykAuth := false + ) + + override lazy val projectSettings: Seq[Setting[_]] = Seq( + snykTest := snykTestTask.value, + snykMonitor := snykMonitorTask.value, + snykAuth := snykAuthTask.value + ) +} diff --git a/src/main/scala/com/twalford/SnykTasks.scala b/src/main/scala/com/twalford/SnykTasks.scala new file mode 100644 index 0000000..d52b6e7 --- /dev/null +++ b/src/main/scala/com/twalford/SnykTasks.scala @@ -0,0 +1,56 @@ +package com.twalford + +import sbt.ConcurrentRestrictions.Tag +import sbt.{Def, settingKey, taskKey} +import sbt.Keys.{name, streams} +import sbt.internal.util.ManagedLogger + +import scala.sys.process.Process + +object SnykTasks { + private lazy val authEnvVar = "SNYK_TOKEN" + + val snykOrganization = settingKey[String]("The organization snyk should be run for") + val snykAuth = taskKey[Unit]("Authorizes a local snyk instance") + val snykTest = taskKey[Unit]("Runs snyk test on the local project") + val snykMonitor = taskKey[Unit]("Runs snyk monitor on the local project") + + val snykTag = Tag("snyk-exclusive") + + + lazy val snykTestTask = Def.task { + val log = streams.value.log + run(s"""snyk test -- "\\"project ${name.value}\\""""", log) + }.tag(snykTag) + + lazy val snykMonitorTask = Def.task { + val log = streams.value.log + val projectName = name.value + run(s"""snyk monitor --org=${snykOrganization.value} --project-name=$projectName -- "\\"project $projectName\\""""", log) + }.tag(snykTag) + + lazy val snykAuthTask = Def.task { + val log = streams.value.log + checkForAuth(log) + }.tag(snykTag) + + private def checkForAuth(log: ManagedLogger): Unit = { + Option(System.getenv(authEnvVar)) match { + case None => + log.info("No auth set up, but presumed we're running locally. Requesting auth via `snyk auth`") + run("snyk auth", log) + case Some(auth) => + log.debug("Snyk using environment variable authorization, continuing") + run(s"snyk auth $auth", log) + } + } + + private def run(cmd: String, log: ManagedLogger): Unit = { + val shell = if (sys.props("os.name").contains("Windows")) { + List("cmd", "/c") + } else { + List("bash", "-c") + } + Process(shell ::: cmd.split(' ').toList) ! log + } +}