properator
properator manages launching in progress versions of your application using flux,
pull requests and the Github deployments API.
Usage
We'll assume properator is setup as a Github app and running as @properator-bot.
Comments are used to control properator.
For example, @properator-bot deploy on a PR, will launch an instance of flux
pointed to that PR's branch and create a GH deployment to track it.
When the PR is closed, that instance of flux and the launched manifests will be
removed.
Note: As more commits are pushed, github will say the deployment is "outdated".
This is a drawback of the deployments API; it doesn't let us update the commit
for a deployment, we can only create new ones.
However, the deployed version of the app really does track the PR branch because
flux is now watching that branch and will apply any changes.
URL annotations
Include annotations like the following on an Ingress resource:
metadata:
annotations:
deploy.properator.io/deployment: github-webhook # This should always be `github-webhook`
deploy.properator.io/url: https://2.pr.app.test # This should point to your deployment
to have the GH deployment point to https://2.pr.app.test.
Generation
Note: properator gives you access to the PR number
when manifests are generated on the file system at /etc/properator.
As a primitive example:
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-app
annotations:
deploy.properator.io/deployment: github-webhook
deploy.properator.io/url: http://${PR}.pr.app.test
.flux.yaml
version: 1
patchUpdated:
generators:
- command: sed -e "s/\${PR}/$(cat /etc/properator/pr)/g" ingress.yaml
Setup
We'll cover initializing a Github App for properator and then launching it
locally in minikube.
Note: requires kubernetes 1.16.
Initialization
properator is meant to be run as a GitHub app. To make setup easier, execute:
go run ./cmd/init
This will setup the app in your account or organization and write
the configuration and key to .env/id_rsa, which are later used to deploy properator.
Webhook
properator needs to listen to github webhook events. Visit
smee.io to get a publicly accessible webhook URL.
Enter this URL when initializing the app as above.
Launch
Install the manifests to the cluster with:
make deploy
At the moment, the images track the latest tag.
Testing
Using minikube, you can use make listen-webhook to use smee.io
to proxy events from the URL you created earlier to your local machine.
$ WEBHOOK_URL=https://smee.io/code make listen-github-webhook
./hack/listen.sh
Forwarding from 127.0.0.1:8080 -> 8080
npx: installed 40 in 4.406s
Forwarding https://smee.io/code to http://localhost:8080/webhook
Connected https://smee.io/code
Handling connection for 8080
POST http://localhost:8080/webhook - 200
Building
The images can also be built manually but remember they need to end up
accessible by the cluster.
For example with minikube:
eval $(minikube docker-env)
export TAG=dev # it's only important it's not latest so that the images aren't pulled
make docker-build && make deploy
How it works
See below for some information about how properator functions internally.
Deploy keys
For every repo, properator will create an SSH key and add it to the
repository. Every instance of flux started by properator will use this same key
to synchronize with that repo.
TODO
- Add configuration to repositories
--git-path for flux
- registry scanning
- How to measure "successful" deployment?
Right now it's just whether an
Ingress resource appears with a link to the
deployment.
- If we're not using
Ingress?
- Check responsiveness of ingress/service and set the deployment when it's
ready