From 2ec7c39404351ee489d7c88f3c8d3459da08a302 Mon Sep 17 00:00:00 2001 From: Ricardo Franco Date: Tue, 12 Aug 2014 10:52:24 -0300 Subject: [PATCH 1/2] flag to update latest tag --- .../sbt/packager/docker/DockerPlugin.scala | 26 ++++++++++++++----- .../typesafe/sbt/packager/docker/Keys.scala | 1 + src/sbt-test/docker/update-latest/build.sbt | 12 +++++++++ .../docker/update-latest/project/plugins.sbt | 1 + .../update-latest/src/main/scala/Main.scala | 3 +++ src/sbt-test/docker/update-latest/test | 3 +++ 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/sbt-test/docker/update-latest/build.sbt create mode 100644 src/sbt-test/docker/update-latest/project/plugins.sbt create mode 100644 src/sbt-test/docker/update-latest/src/main/scala/Main.scala create mode 100644 src/sbt-test/docker/update-latest/test diff --git a/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala index 81fbaf052..884719987 100644 --- a/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala @@ -92,7 +92,7 @@ trait DockerPlugin extends Plugin with UniversalPlugin { } } - def publishLocalDocker(context: File, tag: String, log: Logger): Unit = { + def publishLocalDocker(context: File, tag: String, latest: Boolean, log: Logger): Unit = { val cmd = Seq("docker", "build", "--force-rm", "-t", tag, ".") val cwd = context.getParentFile @@ -105,6 +105,15 @@ trait DockerPlugin extends Plugin with UniversalPlugin { throw new RuntimeException("Nonzero exit value: " + ret) else log.info("Built image " + tag) + + if (latest) { + val name = tag.substring(0, tag.lastIndexOf(":")) + ":latest" + val latestCmd = Seq("docker", "tag", tag, name) + Process(latestCmd).! match { + case 0 => log.info("Update Latest from image" + tag) + case n => sys.error("Failed to run docker tag") + } + } } def publishDocker(tag: String, log: Logger): Unit = { @@ -152,6 +161,7 @@ trait DockerPlugin extends Plugin with UniversalPlugin { packageName in Docker <<= packageName, executableScriptName in Docker <<= executableScriptName, dockerRepository := None, + dockerUpdateLatest := false, sourceDirectory in Docker <<= sourceDirectory apply (_ / "docker"), target in Docker <<= target apply (_ / "docker"), @@ -180,13 +190,17 @@ trait DockerPlugin extends Plugin with UniversalPlugin { (repo, name, version) => repo.map(_ + "/").getOrElse("") + name + ":" + version }, - publishLocal <<= (dockerGenerateConfig, dockerGenerateContext, dockerTarget, streams) map { - (config, _, target, s) => - publishLocalDocker(config, target, s.log) + publishLocal <<= (dockerGenerateConfig, dockerGenerateContext, dockerTarget, dockerUpdateLatest, streams) map { + (config, _, target, updateLatest, s) => + publishLocalDocker(config, target, updateLatest, s.log) }, - publish <<= (publishLocal, dockerTarget, streams) map { - (_, target, s) => + publish <<= (publishLocal, dockerTarget, dockerUpdateLatest, streams) map { + (_, target, updateLatest, s) => publishDocker(target, s.log) + if (updateLatest) { + val name = target.substring(0, target.lastIndexOf(":")) + ":latest" + publishDocker(name, s.log) + } } )) } diff --git a/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala index 80693bcf4..753bf0351 100644 --- a/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala @@ -14,6 +14,7 @@ trait DockerKeys { val dockerExposedPorts = SettingKey[Seq[Int]]("dockerExposedPorts", "Ports exposed by Docker image") val dockerExposedVolumes = SettingKey[Seq[String]]("dockerExposedVolumes", "Volumes exposed by Docker image") val dockerRepository = SettingKey[Option[String]]("dockerRepository", "Repository for published Docker image") + val dockerUpdateLatest = SettingKey[Boolean]("dockerUpdateLatest", "Set to update latest tag") } object Keys extends DockerKeys { diff --git a/src/sbt-test/docker/update-latest/build.sbt b/src/sbt-test/docker/update-latest/build.sbt new file mode 100644 index 000000000..c47083808 --- /dev/null +++ b/src/sbt-test/docker/update-latest/build.sbt @@ -0,0 +1,12 @@ +import com.typesafe.sbt.SbtNativePackager._ +import NativePackagerKeys._ + +packageArchetype.java_application + +name := "docker-test" + +version := "0.1.0" + +maintainer := "Gary Coady " + +dockerUpdateLatest := true diff --git a/src/sbt-test/docker/update-latest/project/plugins.sbt b/src/sbt-test/docker/update-latest/project/plugins.sbt new file mode 100644 index 000000000..b53de154c --- /dev/null +++ b/src/sbt-test/docker/update-latest/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version")) diff --git a/src/sbt-test/docker/update-latest/src/main/scala/Main.scala b/src/sbt-test/docker/update-latest/src/main/scala/Main.scala new file mode 100644 index 000000000..61471c658 --- /dev/null +++ b/src/sbt-test/docker/update-latest/src/main/scala/Main.scala @@ -0,0 +1,3 @@ +object Main extends App { + println("Hello world") +} diff --git a/src/sbt-test/docker/update-latest/test b/src/sbt-test/docker/update-latest/test new file mode 100644 index 000000000..c666e2a58 --- /dev/null +++ b/src/sbt-test/docker/update-latest/test @@ -0,0 +1,3 @@ +# Generate the Docker image locally +> docker:publishLocal +$ exec bash -c 'docker run docker-test:latest | grep -q "Hello world"' From 54a1d94c77a4ac842e90535151dbec402f68c004 Mon Sep 17 00:00:00 2001 From: Ricardo Franco Date: Thu, 28 Aug 2014 14:50:32 -0300 Subject: [PATCH 2/2] add doc for the key dockerUpdateLatest --- src/sphinx/DetailedTopics/docker.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sphinx/DetailedTopics/docker.rst b/src/sphinx/DetailedTopics/docker.rst index 157b51f92..2756bdd50 100644 --- a/src/sphinx/DetailedTopics/docker.rst +++ b/src/sphinx/DetailedTopics/docker.rst @@ -62,6 +62,8 @@ Publishing Settings ``dockerRepository`` The repository to which the image is pushed when the ``docker:publish`` task is run. This should be of the form ``[username]`` (assumes use of the ``index.docker.io`` repository) or ``[repository.host]/[username]``. + ``dockerUpdateLatest`` + The flag to automatic update the latest tag when the ``docker:publish`` task is run. Default value is ``FALSE``. Tasks -----