Skip to content

A Kubernetes Operator for scheduled backup of Git repositories.

License

Notifications You must be signed in to change notification settings

ebiiim/gitbackup

Repository files navigation

Git Backup Operator

GitHub GitHub release (latest SemVer) CI GitHub go.mod Go version Go Report Card codecov

A Kubernetes Operator for scheduled backup of Git repositories.

Overview

  1. You create a Repository resource.
  2. The Operator creates a CronJob resource from it.
  3. The CronJob does the actual work.
apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Repository
metadata:
  name: repo1
spec:
  src: https://github.com/ebiiim/gitbackup
  dst: https://gitlab.com/ebiiim/gitbackup
  schedule: "0 6 * * *"
  gitCredentials:
    name: repo1-secret # specify a Secret resource in the same namespace

Getting Started

Supported Kubernetes versions: 1.21 or higher

Installation

Make sure you have cert-manager deployed, as it is used to generate webhook certificates.

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml

⚠️ You may have to wait a second for cert-manager to be ready.

Deploy the Operator with the following command. It creates gitbackup-system namespace and deploys CRDs, controllers and other resources.

kubectl apply -f https://github.com/ebiiim/gitbackup/releases/download/v0.2.1/gitbackup.yaml

Backup a Git repository with a Repository resource

First, create a Secret resource that contains .git-credentials.

kubectl create secret generic repo1-secret --from-file=$HOME/.git-credentials

Next, create a Repository resource.

apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Repository
metadata:
  name: repo1
spec:
  src: https://github.com/ebiiim/gitbackup
  dst: https://gitlab.com/ebiiim/gitbackup
  schedule: "0 6 * * *"
  gitCredentials:
    name: repo1-secret

Finally, confirm that resources has been created.

$ kubectl get repos
NAME    AGE
repo1   5s

$ kubectl get cronjobs
NAME              SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
gitbackup-repo1   0 6 * * *   False     0        <none>          5s

💡 You can test the CronJob by manually triggering it.

kubectl create job --from=cronjob/<name> <job-name>

Backup many Git repositories with a Collection resource

First, create a Secret resource that contains .git-credentials.

kubectl create secret generic coll1-secret --from-file=$HOME/.git-credentials

Next, create a Collection resource.

apiVersion: gitbackup.ebiiim.com/v1beta1
kind: Collection
metadata:
  name: coll1
spec:
  schedule: "0 6 * * *"
  gitCredentials:
    name: coll1-secret
  repos:
    - name: gitbackup
      src: https://github.com/ebiiim/gitbackup
      dst: https://gitlab.com/ebiiim/gitbackup
    - name: foo
      src: https://example.com/src/foo
      dst: https://example.com/dst/foo
    - name: bar
      src: https://example.com/src/bar
      dst: https://example.com/dst/bar

Finally, confirm that resources has been created.

$ kubectl get colls
NAME    AGE
coll1   5s

$ kubectl get repos
NAME                AGE
coll1-bar           5s
coll1-foo           5s
coll1-gitbackup     5s

$ kubectl get cronjobs
NAME                        SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
gitbackup-coll1-bar         2 6 * * *   False     0        <none>          5s
gitbackup-coll1-foo         1 6 * * *   False     0        <none>          5s
gitbackup-coll1-gitbackup   0 6 * * *   False     0        <none>          5s

💡 Each job runs one minute apart.

Uninstallation

Delete the Operator and resources with the following command.

kubectl delete -f https://github.com/ebiiim/gitbackup/releases/download/v0.2.1/gitbackup.yaml

Developing

This Operator uses Kubebuilder, so we basically follow the Kubebuilder way. See the Kubebuilder Documentation for details.

Prerequisites

Make sure you have the following tools installed:

  • Git
  • Make
  • Go
  • Docker

Run a development cluster with kind

./hack/dev-kind-reset-cluster.sh # create a K8s cluster `kind-gitbackup`
./hack/dev-kind-deploy.sh # build and deploy the Operator