diff --git a/build.Dockerfile b/build.Dockerfile
new file mode 100644
index 0000000..d35512c
--- /dev/null
+++ b/build.Dockerfile
@@ -0,0 +1,20 @@
+FROM golang:latest
+
+# Docs deps
+RUN apt-get update && apt-get install -y \
+ python3-pip
+
+ADD lazy.sh /tmp/lazy.sh
+
+RUN /tmp/lazy.sh builddep
+
+ADD docs/requirements.txt /tmp/requirements.txt
+ENV ZREPL_LAZY_DOCS_REQPATH=/tmp/requirements.txt
+RUN /tmp/lazy.sh docdep
+
+RUN mkdir -p /go/src/github.com/zrepl
+RUN ln -sf /zrepl /go/src/github.com/zrepl/zrepl
+
+WORKDIR /go/src/github.com/zrepl/zrepl
+
+
diff --git a/docs/installation.rst b/docs/installation.rst
index 892a8e4..6d87610 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -1,3 +1,5 @@
+.. _binary releases: https://github.com/zrepl/zrepl/releases
+
.. _installation:
Installation
@@ -18,8 +20,9 @@ However, until we get around documenting those setups, you will have to run zrep
Packages
--------
-zrepl releases are signed & tagged by the author in the git repository.
+zrepl source releases are signed & tagged by the author in the git repository.
Your OS vendor may provide binary packages of zrepl through the package manager.
+Additionally, `binary releases`_ are provided on GitHub.
The following list may be incomplete, feel free to submit a PR with an update:
.. list-table::
@@ -33,45 +36,45 @@ The following list may be incomplete, feel free to submit a PR with an update:
- ``_
* - Others
-
- - Install from source, see below
+ - Use `binary releases`_ or build from source.
Compile From Source
~~~~~~~~~~~~~~~~~~~
-Go 1.9 or newer and a configured ``$GOPATH`` environment variable and a few build dependencies are required to build zrepl.
-A tutorial is available over at `golang.org `_.
-If Go 1.9 is not available on your distro consider build in Docker (see below).
+Producing a release requires **Go 1.9** or newer and **Python 3** + **pip3** + ``docs/requirements.txt`` for the Sphinx documentation.
+A tutorial to install Go is available over at `golang.org `_.
+Python and pip3 should probably be installed via your distro's package manager.
-The following shell script checks out the zrepl project into your ``$GOPATH``,
-installs the build dependencies, installs dependencies using ``dep ensure`` and does a ``make release``.
-Build artifacts are placed into ``$GOPATH/github.com/zrepl/zrepl/artifacts/``.
-
-When doing builds afterwards, it should be sufficient to checkout the new revision, run ``dep ensure`` and ``make release``.
-You may want to switch to a tagged commit (we use `semver `_) but master should generally be considered stable.
-
-**Note**: it is your job to install the apropriate binary in the zrepl users's ``$PATH``, e.g. ``/usr/local/bin/zrepl``.
-Otherwise, the examples in the :ref:`tutorial` may need to be adjusted.
-
-**You are encouraged to understand what happens by auditing the script.**
-
-::
-
- curl 'https://raw.githubusercontent.com/zrepl/zrepl/master/lazy.sh' | sh
-
-You can also build in a Docker container if you want an isolated build environment or don't have a compatible Go version.
+Alternatively, you can use the Docker build process:
+it is used to produce the official zrepl `binary releases`_
+and serves as a reference for build dependencies and procedure:
::
git clone https://github.com/zrepl/zrepl.git
cd zrepl
+ sudo docker build -t zrepl_build -f build.Dockerfile .
sudo docker run -it --rm \
-v "${PWD}:/zrepl" \
--user "$(id -u):$(id -g)" \
- golang:latest bash -c 'export CLONEPATH=/go/src/github.com/zrepl; mkdir -p "$CLONEPATH" && ln -s /zrepl $CLONEPATH/zrepl && ${CLONEPATH}/zrepl/lazy.sh'
+ zrepl_build make release
-.. literalinclude:: ../lazy.sh
- :language: sh
+Alternatively, you can install build dependencies on your local system and then build in your ``$GOPATH``:
+::
+
+ mkdir -p "${GOPATH}/src/github.com/zrepl/zrepl"
+ git clone https://github.com/zrepl/zrepl.git "${GOPATH}/src/github.com/zrepl/zrepl"
+ cd "${GOPATH}/src/github.com/zrepl/zrepl"
+ ./lazy.sh devsetup
+ make release
+
+Build results are located in the ``artifacts/`` directory.
+
+.. NOTE::
+
+ It is your job to install the apropriate binary in the zrepl users's ``$PATH``, e.g. ``/usr/local/bin/zrepl``.
+ Otherwise, the examples in the :ref:`tutorial` may need to be adjusted.
.. _mainconfigfile:
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..76cd9e3
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,28 @@
+Babel==2.5.1
+certifi==2017.11.5
+chardet==3.0.4
+click==6.7
+colorclass==2.2.0
+cryptography==1.7.1
+docutils==0.14
+idna==2.6
+imagesize==0.7.1
+Jinja2==2.10
+keyring==10.1
+keyrings.alt==1.3
+MarkupSafe==1.0
+pyasn1==0.1.9
+pycrypto==2.6.1
+Pygments==2.2.0
+pygobject==3.22.0
+pytz==2017.3
+pyxdg==0.25
+requests==2.18.4
+SecretStorage==2.3.1
+six==1.10.0
+snowballstemmer==1.2.1
+Sphinx==1.6.5
+sphinx-rtd-theme==0.2.4
+sphinxcontrib-versioning==2.2.1
+sphinxcontrib-websupport==1.0.1
+urllib3==1.22
diff --git a/lazy.sh b/lazy.sh
index fd28f68..8000ad9 100755
--- a/lazy.sh
+++ b/lazy.sh
@@ -1,7 +1,7 @@
-#!/bin/sh
+#!/bin/bash
set -e
-if [ ! -z "$TERM" ]; then
+if tty -s; then
bold=$(tput bold)
normal=$(tput sgr0)
else
@@ -13,39 +13,91 @@ step() {
echo "${bold}$1${normal}"
}
+if ! type go; then
+ step "go binary not installed or not in \$PATH" 1>&2
+ exit 1
+fi
+
if [ -z "$GOPATH" ]; then
step "Make sure you have your GOPATH configured correctly" 1>&2
exit 1
fi
-step "Checkout sources to \$GOPATH/github.com/zrepl/zrepl"
CHECKOUTPATH="${GOPATH}/src/github.com/zrepl/zrepl"
-if [ -e "$CHECKOUTPATH" ]; then
- echo "${CHECKOUTPATH} already exists"
- if [ ! -d "$CHECKOUTPATH" ]; then
- echo "${CHECKOUTPATH} is not a directory, aborting" 1>&2
+
+clone() {
+ step "Checkout sources to \$GOPATH/github.com/zrepl/zrepl"
+ if [ -e "$CHECKOUTPATH" ]; then
+ echo "${CHECKOUTPATH} already exists"
+ if [ ! -d "$CHECKOUTPATH" ]; then
+ echo "${CHECKOUTPATH} is not a directory, aborting" 1>&2
+ else
+ cd "$CHECKOUTPATH"
+ fi
else
- cd "$CHECKOUTPATH"
+ mkdir -p "$GOPATH/src/github.com/zrepl"
+ cd "$GOPATH/src/github.com/zrepl"
+ git clone https://github.com/zrepl/zrepl.git
+ cd zrepl
fi
-else
- mkdir -p "$GOPATH/src/github.com/zrepl"
- cd "$GOPATH/src/github.com/zrepl"
- git clone https://github.com/zrepl/zrepl.git
- cd zrepl
-fi
+}
-step "Install build depdencies using 'go get' to \$GOPATH/bin"
-go get -u golang.org/x/tools/cmd/stringer
-go get -u github.com/golang/dep/cmd/dep
-if ! type stringer || ! type dep; then
- echo "Installed dependencies but can't find them in \$PATH, adjust it to contain \$GOPATH/bin" 1>&2
- exit 1
-fi
+builddep() {
+ step "Install build depdencies using 'go get' to \$GOPATH/bin"
+ go get -u golang.org/x/tools/cmd/stringer
+ go get -u github.com/golang/dep/cmd/dep
+ if ! type stringer || ! type dep; then
+ echo "Installed dependencies but can't find them in \$PATH, adjust it to contain \$GOPATH/bin" 1>&2
+ exit 1
+ fi
+}
-step "Fetching dependencies using 'dep ensure'"
-dep ensure
+godep() {
+ step "Fetching dependencies using 'dep ensure'"
+ dep ensure
+}
-step "Making release"
-make release-bins
+docdep() {
+ if ! type pip3; then
+ step "pip3 binary not installed or not in \$PATH" 1>&2
+ exit 1
+ fi
+ step "Installing doc build dependencies"
+ local reqpath="${CHECKOUTPATH}/docs/requirements.txt"
+ if [ ! -z "$ZREPL_LAZY_DOCS_REQPATH" ]; then
+ reqpath="$ZREPL_LAZY_DOCS_REQPATH"
+ fi
+ pip3 install -r "$reqpath"
+}
+
+release() {
+ step "Making release"
+ make release
+}
+
+# precheck
+for cmd in "$@"; do
+ case "$cmd" in
+ clone|builddep|godep|docdep|release_bins|docs)
+ continue
+ ;;
+ devsetup)
+ step "Installing development dependencies"
+ builddep
+ godep
+ docdep
+ step "Development dependencies installed"
+ continue
+ ;;
+ *)
+ step "Invalid command ${cmd}, exiting"
+ exit 1
+ ;;
+ esac
+done
+
+for cmd in "$@"; do
+ step "Step ${cmd}"
+ eval $cmd
+done
-step "Release artifacts are available in $(pwd)/artifacts"