aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/docs/BUILD2
-rw-r--r--scripts/docs/Dockerfile2
-rw-r--r--scripts/docs/cloudbuild.yaml11
-rw-r--r--scripts/docs/jekyll.bzl83
-rw-r--r--scripts/docs/jekyll_build.sh.tpl48
5 files changed, 146 insertions, 0 deletions
diff --git a/scripts/docs/BUILD b/scripts/docs/BUILD
index 53452e22e0..f3bb798195 100644
--- a/scripts/docs/BUILD
+++ b/scripts/docs/BUILD
@@ -15,3 +15,5 @@ py_binary(
visibility = ["//site:__pkg__"],
deps = [":dot-converter"],
)
+
+exports_files(["jekyll_build.sh.tpl"])
diff --git a/scripts/docs/Dockerfile b/scripts/docs/Dockerfile
new file mode 100644
index 0000000000..6ee4e5a9c7
--- /dev/null
+++ b/scripts/docs/Dockerfile
@@ -0,0 +1,2 @@
+FROM gcr.io/cloud-builders/bazel
+RUN apt-get upgrade && apt-get install -y jekyll
diff --git a/scripts/docs/cloudbuild.yaml b/scripts/docs/cloudbuild.yaml
new file mode 100644
index 0000000000..5bd121457d
--- /dev/null
+++ b/scripts/docs/cloudbuild.yaml
@@ -0,0 +1,11 @@
+steps:
+- name: gcr.io/cloud-builders/docker
+ args: ['build', '--tag=gcr.io/$PROJECT_ID/bazel-jekyll', 'scripts']
+- name: gcr.io/$PROJECT_ID/bazel-jekyll
+ args: ['build', '//site']
+- name: gcr.io/cloud-builders/gsutil
+ args: ['-m', 'rsync', '-r', '-c', '-d', '/workspace/bazel-bin/site/site-build', 'gs://docs.bazel.build']
+- name: gcr.io/cloud-builders/gsutil
+ args: ['web', 'set', '-m', 'index.html', '-e', '404.html', 'gs://docs.bazel.build']
+- name: gcr.io/cloud-builders/gsutil
+ args: ['-m', 'acl', 'ch', '-R', '-u', 'AllUsers:R', 'gs://docs.bazel.build']
diff --git a/scripts/docs/jekyll.bzl b/scripts/docs/jekyll.bzl
new file mode 100644
index 0000000000..3552f4a23b
--- /dev/null
+++ b/scripts/docs/jekyll.bzl
@@ -0,0 +1,83 @@
+# Copyright 2017 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Quick rule to build a Jekyll site."""
+
+def _bucket_from_workspace_name(wname):
+ """Try to assert the bucket name from the workspace name.
+
+ E.g. it will answer www.bazel.build if the workspace name is build_bazel_www.
+
+ Args:
+ wname: workspace name
+
+ Returns:
+ the guessed name of the bucket for this workspace.
+ """
+ revlist = []
+ for part in wname.split("_"):
+ revlist.insert(0, part)
+ return ".".join(revlist)
+
+def _impl(ctx):
+ """Quick and non-hermetic rule to build a Jekyll site."""
+ source = ctx.actions.declare_directory(ctx.attr.name + "-srcs")
+ output = ctx.actions.declare_directory(ctx.attr.name + "-build")
+
+ ctx.actions.run_shell(inputs = ctx.files.srcs,
+ outputs = [source],
+ command = ("mkdir -p %s\n" % (source.path)) +
+ "\n".join([
+ "tar xf %s -C %s" % (src.path, source.path) for src in ctx.files.srcs])
+ )
+ ctx.actions.run(
+ inputs = [source],
+ outputs = [output],
+ executable = "jekyll",
+ use_default_shell_env = True,
+ arguments = ["build", "-q", "-s", source.path, "-d", output.path]
+ )
+ ctx.actions.run(
+ inputs = [output],
+ outputs = [ctx.outputs.out],
+ executable = "tar",
+ arguments = ["cf", ctx.outputs.out.path, "-C", output.path, "."]
+ )
+
+ # Create a shell script to serve the site locally or push with the --push
+ # flag.
+ bucket = ctx.attr.bucket if ctx.attr.bucket else _bucket_from_workspace_name(ctx.workspace_name)
+
+ ctx.actions.expand_template(
+ template=ctx.file._jekyll_build_tpl,
+ output=ctx.outputs.executable,
+ substitutions={
+ "%{workspace_name}": ctx.workspace_name,
+ "%{source_dir}": source.short_path,
+ "%{prod_dir}": output.short_path,
+ "%{bucket}": bucket,
+ },
+ is_executable=True)
+ return [DefaultInfo(runfiles=ctx.runfiles(files=[source, output]))]
+
+jekyll_build = rule(
+ implementation = _impl,
+ executable = True,
+ attrs = {
+ "srcs": attr.label_list(allow_empty=False),
+ "bucket": attr.string(),
+ "_jekyll_build_tpl": attr.label(
+ default=":jekyll_build.sh.tpl",
+ allow_files=True,
+ single_file=True)},
+ outputs = {"out": "%{name}.tar"})
diff --git a/scripts/docs/jekyll_build.sh.tpl b/scripts/docs/jekyll_build.sh.tpl
new file mode 100644
index 0000000000..0528794920
--- /dev/null
+++ b/scripts/docs/jekyll_build.sh.tpl
@@ -0,0 +1,48 @@
+#!/bin/sh
+HOST="${HOST-localhost}"
+PORT="${PORT-12345}"
+RUNFILES=$(cd ${JAVA_RUNFILES-$0.runfiles}/%{workspace_name} && pwd -P)
+SOURCE_DIR="$RUNFILES/%{source_dir}"
+prod_dir="$RUNFILES/%{prod_dir}"
+bucket="%{bucket}"
+
+function serve() {
+ TDIR=$(mktemp -d)
+ RDIR=$(mktemp -d)
+ trap "rm -fr $RDIR $TDIR" EXIT
+ (cd $RDIR && \
+ jekyll serve --host "$HOST" --port "$PORT" -s "$SOURCE_DIR" -d "$TDIR")
+}
+
+function push() {
+ # Get gsutil
+ gs="${GSUTIL:-$(which gsutil 2>/dev/null || : )}"
+ if [ ! -x "${gs}" ]; then
+ echo "Please set GSUTIL to the path the gsutil binary." >&2
+ echo "gsutil (https://cloud.google.com/storage/docs/gsutil/) is the" >&2
+ echo "command-line interface to google cloud." >&2
+ exit 1
+ fi
+
+ # Rsync:
+ # -r: recursive
+ # -c: compute checksum even though the input is from the filesystem
+ # -d: remove deleted files
+ cd "${prod_dir}"
+ "${gs}" -m rsync -r -c -d . "gs://${bucket}"
+ "${gs}" web set -m index.html -e 404.html "gs://${bucket}"
+ "${gs}" -m acl ch -R -u AllUsers:R "gs://${bucket}"
+}
+
+case "${1-}" in
+ --push)
+ push
+ ;;
+ --serve|"")
+ serve
+ ;;
+ *)
+ echo "Usage: $0 [--push|--serve]" >&2
+ exit 1
+ ;;
+esac