Merge pull request #19 from giolekva/bazel

bazel_tools: Introduce new custom push_to_dev macro

#7 
diff --git a/appmanager/BUILD b/appmanager/BUILD
new file mode 100644
index 0000000..9faa2ab
--- /dev/null
+++ b/appmanager/BUILD
@@ -0,0 +1,12 @@
+load("//:bazel_tools/docker.bzl", "docker_image")
+
+# TODO(lekva): figure out how to build py_binary with pip dependencies and
+# migrate off docker_image rule
+docker_image(
+	name = "push_to_dev",
+	registry = "localhost:30500",
+	image = "giolekva/pcloud-app-manager",
+	tag = "latest",
+	dockerfile = "Dockerfile",
+	srcs = glob(["**"], exclude=["Dockerfile"]),
+)
diff --git a/apps/face_detection/BUILD b/apps/face_detection/BUILD
index d1ed253..8a61786 100644
--- a/apps/face_detection/BUILD
+++ b/apps/face_detection/BUILD
@@ -1,17 +1,16 @@
-load("@rules_pkg//:pkg.bzl", "pkg_tar")
+load("//:bazel_tools/docker.bzl", "docker_image")
 
 # TODO(lekva): figure out how to build py_binary with pip dependencies and
-# migrate off of shell script running docker build
-sh_binary(
+# migrate off docker_image rule
+docker_image(
 	name = "push_to_dev",
-	srcs = ["push_to_dev.sh"],
-	data = glob(["*.py"]) + [
-	     "Dockerfile",
+	registry = "localhost:30500",
+	image = "giolekva/face-detector",
+	tag = "latest",
+	dockerfile = "Dockerfile",
+	srcs = glob(["*.py"]) + [
 	     "haarcascade_frontalface_default.xml",
 	],
-	deps = [
-	     "@bazel_tools//tools/bash/runfiles",
-	],
 )
 
 pkg_tar(
diff --git a/apps/face_detection/Dockerfile b/apps/face_detection/Dockerfile
index befcba5..8c0996c 100644
--- a/apps/face_detection/Dockerfile
+++ b/apps/face_detection/Dockerfile
@@ -15,4 +15,5 @@
     python3-opencv
 
 WORKDIR /app
-COPY . /app
\ No newline at end of file
+COPY *.py /app/
+COPY *.xml /app/
diff --git a/apps/face_detection/push_to_dev.sh b/apps/face_detection/push_to_dev.sh
deleted file mode 100755
index 48342f9..0000000
--- a/apps/face_detection/push_to_dev.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-# --- begin runfiles.bash initialization ---
-# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
-set -euo pipefail
-if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
-    if [[ -f "$0.runfiles_manifest" ]]; then
-        export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
-    elif [[ -f "$0.runfiles/MANIFEST" ]]; then
-        export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
-    elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-        export RUNFILES_DIR="$0.runfiles"
-    fi
-fi
-if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-    source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
-elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
-    source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
-    	                 "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
-else
-    echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
-    exit 1
-fi
-# --- end runfiles.bash initialization ---
-
-DOCKERFILE="$(rlocation __main__/apps/face_detection/Dockerfile)"
-IMAGE="localhost:30500/giolekva/face-detector"
-
-docker build \
-       --tag=$IMAGE \
-       --file=$DOCKERFILE \
-       "$(dirname "$DOCKERFILE")"
-
-docker push $IMAGE
diff --git a/bazel_tools/docker.bzl b/bazel_tools/docker.bzl
new file mode 100644
index 0000000..1149497
--- /dev/null
+++ b/bazel_tools/docker.bzl
@@ -0,0 +1,55 @@
+__PUSH_TO_DEV_TMPL = """
+#!/bin/sh
+set -eE -o functrace
+# --- begin runfiles.bash initialization ---
+# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
+set -euo pipefail
+if [[ ! -d "\$${{RUNFILES_DIR:-/dev/null}}" && ! -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
+    if [[ -f "\$$0.runfiles_manifest" ]]; then
+        export RUNFILES_MANIFEST_FILE="\$$0.runfiles_manifest"
+    elif [[ -f "\$$0.runfiles/MANIFEST" ]]; then
+        export RUNFILES_MANIFEST_FILE="\$$0.runfiles/MANIFEST"
+    elif [[ -f "\$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+        export RUNFILES_DIR="\$$0.runfiles"
+    fi
+fi
+if [[ -f "\$${{RUNFILES_DIR:-/dev/null}}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+    source "\$${{RUNFILES_DIR}}/bazel_tools/tools/bash/runfiles/runfiles.bash"
+elif [[ -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
+    source "\$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
+    	                 "\$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
+else
+    echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
+    exit 1
+fi
+# --- end runfiles.bash initialization ---
+IMAGE="{registry}/{image}:{tag}"
+DOCKERFILE=\$$(rlocation __main__/{package}/{dockerfile})
+docker build \
+      --tag=\$$IMAGE \
+      --file=\$$DOCKERFILE \
+      \$$(dirname "\$$DOCKERFILE")
+docker push \$$IMAGE
+"""
+
+
+def docker_image(name, registry, image, tag, dockerfile, srcs, **kwargs):
+    native.genrule(
+	name = "%s.sh" % name,
+	executable = False,
+	outs = ["build_and_push.sh",],
+	cmd = """cat > $@ <<EOM
+%s
+EOM
+""" % __PUSH_TO_DEV_TMPL.format(
+	    registry = registry,
+	    image = image,
+	    tag = tag,
+	    dockerfile = dockerfile,
+	    package = native.package_name(),
+	))
+    native.sh_binary(
+	name = name,
+	srcs = ["build_and_push.sh",],
+	data = srcs + [dockerfile,],
+	deps = ["@bazel_tools//tools/bash/runfiles",])
diff --git a/controller/BUILD b/controller/BUILD
new file mode 100644
index 0000000..bfdf0b1
--- /dev/null
+++ b/controller/BUILD
@@ -0,0 +1,12 @@
+load("//:bazel_tools/docker.bzl", "docker_image")
+
+# TODO(lekva): figure out how to build py_binary with pip dependencies and
+# migrate off docker_image rule
+docker_image(
+	name = "push_to_dev",
+	registry = "localhost:30500",
+	image = "giolekva/pcloud-api-server",
+	tag = "latest",
+	dockerfile = "Dockerfile",
+	srcs = glob(["**"], exclude=["Dockerfile"]),
+)
diff --git a/dev/install_core_services.sh b/dev/install_core_services.sh
index c2d9a49..d1515c6 100755
--- a/dev/install_core_services.sh
+++ b/dev/install_core_services.sh
@@ -2,12 +2,11 @@
 
 ROOT="$(dirname -- $(pwd))"
 
-sh $ROOT/apps/dgraph/install.sh
+source $ROOT/apps/dgraph/install.sh
 
 # Knowledge Graph
 cd "$ROOT/controller"
-docker build --tag=localhost:30500/giolekva/pcloud-api-server .
-docker push localhost:30500/giolekva/pcloud-api-server
+bazel run //controller:push_to_dev
 kubectl create namespace pcloud
 helm --namespace=pcloud install init chart \
      --set image.name=localhost:30500/giolekva/pcloud-api-server \
@@ -15,8 +14,7 @@
 
 # Application Manager
 cd "$ROOT/appmanager"
-docker build --tag=localhost:30500/giolekva/pcloud-app-manager .
-docker push localhost:30500/giolekva/pcloud-app-manager
+bazel run //appmanager:push_to_dev
 kubectl create namespace pcloud-app-manager
 helm --namespace=pcloud-app-manager install init chart \
      --set image.name=localhost:30500/giolekva/pcloud-app-manager \
@@ -24,8 +22,7 @@
 
 # Event Processor
 cd "$ROOT/events"
-docker build --tag=localhost:30500/giolekva/pcloud-event-processor .
-docker push localhost:30500/giolekva/pcloud-event-processor
+bazel run //events:push_to_dev
 kubectl create namespace pcloud-event-processor
 helm --namespace=pcloud-event-processor install init chart \
      --set image.name=localhost:30500/giolekva/pcloud-event-processor \
diff --git a/events/BUILD b/events/BUILD
new file mode 100644
index 0000000..a53e460
--- /dev/null
+++ b/events/BUILD
@@ -0,0 +1,12 @@
+load("//:bazel_tools/docker.bzl", "docker_image")
+
+# TODO(lekva): figure out how to build py_binary with pip dependencies and
+# migrate off docker_image rule
+docker_image(
+	name = "push_to_dev",
+	registry = "localhost:30500",
+	image = "giolekva/pcloud-event-processor",
+	tag = "latest",
+	dockerfile = "Dockerfile",
+	srcs = glob(["**"], exclude=["Dockerfile"]),
+)