Home

Awesome

GitHub release CI PkgGoDev Go Report Card Renovate enabled

website-operator

WebSite Operator allows easy deployment of web sites generated by static site generators such as HonKit, MkDocs, Gatsby and so on.

Installation

All resources (Namespace, CustomResourceDefinitions, Deployment and RBACs) are included in a single manifest file. You can just install the manifest as follows:

helm repo add website-operator https://zoetrope.github.io/website-operator
helm repo update
helm install --create-namespace --namespace website-operator-system website-operator website-operator/website-operator

Usage

First, you need to prepare a repository of the content you want to deploy.

Here's some examples:

To deploy a site to a Kubernetes cluster you can use the following CustomResource:

apiVersion: website.zoetrope.github.io/v1beta1
kind: WebSite
metadata:
  name: honkit-sample
  namespace: default
spec:
  buildImage: ghcr.io/zoetrope/node:18.12.1
  buildScript:
    rawData: |
        #!/bin/bash -ex
        cd $HOME
        rm -rf $REPO_NAME
        git clone $REPO_URL
        cd $REPO_NAME
        git checkout $REVISION
        npm install
        npm run build
        rm -rf $OUTPUT/*
        cp -r _book/* $OUTPUT/
  afterBuildScript: 
    rawData: |
        #!/bin/bash -ex
        curl -k -X POST https://elasticsearch:9200/test/_bulk -H 'Content-Type: application/json'  --data-binary @index.json

  repoURL: https://github.com/zoetrope/honkit-sample.git
  branch: main

You can specify the following fields:

NameRequiredDescription
buildImagetrueThe name of a container image to build your site
buildScripttrueA script to build your site
repoURLtrueThe URL of a repository that holds your site's content
branchtrueThe branch of the repository you want to deploy
deployKeySecretNamefalseThe name of a secret resource that holds a deploy key to access your private repository
extraResourcesfalseAny extra resources you want to deploy
replicasfalseThe number of nginx instances
afterBuildScriptfalseA script to execute in Job once after build (ex. registering search index)

In the build script, you have to copy your built output to $OUTPUT directory.

The following environment variables are available in the build script:

NameDescription
HOMEWorking directory
REPO_NAMEThe name of a repository
REPO_URLThe URL of a repository
REVISIONThe revision of a repository you will deploy
OUTPUTThe name of a directory to put your output

Build Script and After Build Script as ConfigMap resource

You can also define a build script and after build script as ConfigMap resource.

Prepare a build script like bellow:

#!/bin/bash -ex
cd $HOME
rm -rf $REPO_NAME
git clone $REPO_URL
cd $REPO_NAME
git checkout $REVISION
npm install
npm run build
rm -rf $OUTPUT/*
cp -r _book/* $OUTPUT/

Create a ConfigMap resource in the same namespace as website-operator by the following command:

kubectl create -n website-operator-system configmap build-scripts --from-file=/path/to/build.sh

You can specify buildScript field as follows:

apiVersion: website.zoetrope.github.io/v1beta1
kind: WebSite
metadata:
  name: honkit-sample
  namespace: default
spec:
  buildImage: ghcr.io/zoetrope/node:18.12.1
  buildScript:
    configMap:
      name: build-scripts
      key: build.sh
  repoURL: https://github.com/zoetrope/honkit-sample.git
  branch: main

You can setting afterBuildScript by above procedure

Build Images

The following containers are provided to build your sites.

If you want to customize a container image to generate your site, I recommend that you create a container image based on Ubuntu.

Private Repository

You can use deploy key to deploy a content of your private repository.

Follow the page to generate keys and configure your repository:

Managing deploy keys - GitHub Docs

Prepare a private key file (id_rsa) and config file like below:

Host github.com
  HostName github.com
  User git
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no

Create a secret resource in the same namespace as WebSite resource by the following command:

kubectl create -n default secret generic your-deploy-key --from-file=id_rsa=/path/to/.ssh/id_rsa --from-file=config=/path/to/.ssh/config

You can specify deployKeySecretName field as follows:

apiVersion: website.zoetrope.github.io/v1beta1
kind: WebSite
metadata:
  name: mkdocs-sample
  namespace: default
spec:
  buildImage: ghcr.io/zoetrope/python:3.9.5
  buildScript:
    configMap:
      name: build-scripts
      key: build-mkdocs.sh
  repoURL: git@github.com:zoetrope/mkdocs-sample.git
  branch: main
  deployKeySecretName: your-deploy-key

Extra Resource

You can deploy extra resources for your site. For example, it is useful if you want to deploy Contour's HTTPProxy resource to expose your site to a load balancer.

Prepare a extra resource template in go's text/template format:

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: {{.ResourceName}}
spec:
  virtualhost:
    fqdn: {{.ResourceName}}.{{.ResourceNamespace}}.example.com
  routes:
    - conditions:
        - prefix: /
      services:
        - name: {{.ResourceName}}
          port: 8080

In the template, you can use the following parameters:

NameDescription
ResourceNameThe name of the WebSite resource
ResourceNamespaceThe namespace of the WebSite resource

Create a ConfigMap resource in the same namespace as website-operator by the following command:

kubectl create -n website-operator-system configmap your-templates --from-file=/path/to/httpproxy.tmpl

You can specify extraResource field as follows:

apiVersion: website.zoetrope.github.io/v1beta1
kind: WebSite
metadata:
  name: honkit-sample
  namespace: default
spec:
  buildImage: ghcr.io/zoetrope/node:18.12.1
  buildScript:
    configMap:
      name: build-scripts
      key: build-honkit.sh
  repoURL: https://github.com/zoetrope/honkit-sample.git
  branch: main
  extraResources:
    - configMap:
        name: your-templates
        key: httpproxy.tmpl

Note: You need to add permission to website-operator to create extra resources. For example, to create httpproxy resources, you have to add the following RBACs.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: extra-resources-role
rules:
  - apiGroups:
      - projectcontour.io
    resources:
      - httpproxies
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - projectcontour.io
    resources:
      - httpproxies/status
    verbs:
      - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: extra-resources-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: extra-resources-role
subjects:
  - kind: ServiceAccount
    name: default
    namespace: website-operator-system

Web UI

Web UI provides view of status and build log.

Web UI

How to development

The tools for developing website-operator are managed by aqua. Please install aqua as described in the following page:

https://aquaproj.github.io/docs/reference/install

Then install the developer tools.

$ cd /path/to/website-operator
$ aqua i -l

You can start development with tilt.

$ make dev
$ tilt up