Skip to content

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

License

Notifications You must be signed in to change notification settings

zoetrope/website-operator

Repository files navigation

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:

Name Required Description
buildImage true The name of a container image to build your site
buildScript true A script to build your site
repoURL true The URL of a repository that holds your site's content
branch true The branch of the repository you want to deploy
deployKeySecretName false The name of a secret resource that holds a deploy key to access your private repository
extraResources false Any extra resources you want to deploy
replicas false The number of nginx instances
afterBuildScript false A 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:

Name Description
HOME Working directory
REPO_NAME The name of a repository
REPO_URL The URL of a repository
REVISION The revision of a repository you will deploy
OUTPUT The 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:

Name Description
ResourceName The name of the WebSite resource
ResourceNamespace The 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

About

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

Resources

License

Stars

Watchers

Forks

Packages 3

 
 
 

Contributors 4

  •  
  •  
  •  
  •