# docsyserver

An application that serves up documentation stored in a git repository rendered
via Hugo using the Docsy template.

The application checks out the designated repository and renders all the
documentation that it then serves over HTTP.

It checks for updates to the repo every five minutes, pulling and re-rendering
the documentation.

In addition it understands the Gerrit code review system and allows for
previewing changes to documentation by visiting any URL into the documentation
with a `cl` query parameter, e.g. `?cl=NNNNN` and the documentation with that
reviews most recent changes to the documentation patched in and rendered.

The detailed design doc is at http://go/docsyserver.

## Directory Structure

- `BUILD.bazel` - Builds a Docker container that contains a checkout of the
  Docsy example repo, along with all the dependencies needed to build it,
  including Hugo and npm. All third-party dependencies are contained in the
  gcr.io/skia-public/docsyserver-base base container, which is also built with
  rules in this file.

- `go/docsyserver` - The application.

- `go/codereview` - An abstraction of the functionality used from Gerrit. In
  theory a new implementation of CodeReview could be made that supports GitHub
  or other code review systems.

- `go/docsy` - An abstraction of running the `hugo` executable over the source
  documentation using the Docsy template.

- `go/docset` - Manages checking out the repo, patching CLs for documentation
  under code review, and cleaning up after code review issues are closed.

- `images/head-end.html` - If there are script sources that need to be added to
  each page those should go in this file, which will be placed in the right
  directory in the docsy template.

## Building

To build a local docker image run:

        $ make

This will build the executable and store it at `$GOPATH/bin/docsyserver`.

## Running locally with docker

First build the docker image, which only needs to be done once:

      $ make build-local-image

Then run a local instance, changing `$(SKIA)` to the local checkout of Skia:

      docker run --entrypoint=/serve.sh -ti -p 1313:1313 --user=root -v $(SKIA)/site:/input bazel/docsyserver:docsyserver_container

The content will now be available at [localhost:1313](http://localhost:1313/).
The server will automatically re-render the HTML and refresh the page as the
source documents are edited, there's no need to restart the server after you
make documentation changes.

## Running locally

To run, execute the docker image and supply the following flags:

        $ docsyserver --local [flags]

```
  -alsologtostderr
        log to standard error as well as files
  -doc_path string
        The relative directory, from the top of the repo, where the documents are located. (default "site")
  -doc_repo string
        The repo to check out. (default "https://skia.googlesource.com/skia")
  -gerrit_url string
        The gerrit URL. (default "https://skia-review.googlesource.com")
  -hugo string
        The absolute path to the hugo executable. (default "hugo")
  -port string
        HTTP service address (e.g., ':8000') (default ":8000")
```

You must have the `gcloud` command line tool installed and authorized, as that's
how docsyserver with the `--local` flag will create an OAuth 2.0 bearer token to
access Gerrit. You will also need a local checkout of the Docsy example project
and Hugo installed. See the
[Docsy docs](https://www.docsy.dev/docs/getting-started/) for installation
instructions.

The full set of flags are:

```
  -alsologtostderr
        log to standard error as well as files
  -doc_path string
        The relative directory, from the top of the repo, where the documents are located. (default "site")
  -doc_repo string
        The repo to check out. (default "https://skia.googlesource.com/skia")
  -docsy_dir string
        The directory where docsy is found. (default "../../docsy-example")
  -gerrit_url string
        The gerrit URL. (default "https://skia-review.googlesource.com")
  -hugo string
        The absolute path to the hugo executable. (default "hugo")
  -local
        Running locally if true. As opposed to in production.
  -log_backtrace_at value
        when logging hits line file:N, emit a stack trace
  -log_dir string
        If non-empty, write log files in this directory
  -logtostderr
        log to standard error instead of files
  -port string
        HTTP service address (e.g., ':8000') (default ":8000")
  -prom_port string
        Metrics service address (e.g., ':10110') (default ":20000")
  -stderrthreshold value
        logs at or above this threshold go to stderr
  -v value
        log level for V logs
  -vmodule value
        comma-separated list of pattern=N settings for file-filtered logging
  -work_dir string
        The directory to check out the doc repo into. (default "/tmp")
```
