diff --git a/docs/gitbook/dev-guide.md b/docs/gitbook/dev-guide.md new file mode 100644 index 00000000..511d4432 --- /dev/null +++ b/docs/gitbook/dev-guide.md @@ -0,0 +1,182 @@ +# Flagger Development Guide + +This document describes how to build, test and run Flagger from source. + +### Setup dev environment + +Flagger is written in Go and uses Go modules for dependency management. + +On your dev machine install the following tools: +* go >= 1.13 +* git >= 2.20 +* bash >= 5.0 +* make >= 3.81 +* kubectl >= 1.16 +* kustomize >= 3.5 +* helm >= 3.0 +* docker >= 19.03 + +You'll also need a Kubernetes cluster for testing Flagger. +You can use Minikube, Kind, Docker desktop or any remote cluster +(AKS/EKS/GKE/etc) Kubernetes version 1.14 or newer. + +### Build + +To start contributing to Flagger, fork the repository and clone it locally: + +```bash +git clone https://github.com//flagger +cd flagger +``` + +Download Go modules: + +```bash +go mod download +``` + +Build Flagger binary: + +```bash +CGO_ENABLED=0 go build -o ./bin/flagger ./cmd/flagger/ +``` + +Build Flagger container image: + +```bash +make build +``` + +### Unit testing + +Make a change to the source code and run the linter and unit tests: + +```bash +make test +``` + +If you made changes to `go.mod` run: + +```bash +go mod tidy +``` + +If you made changes to `pkg/apis` regenerate Kubernetes client sets with: + +```bash +./hack/update-codegen.sh +``` + +### Manual testing + +Install a service mesh and/or an ingress controller on your cluster and deploy Flagger +using one of the install options [listed here](https://docs.flagger.app/install/flagger-install-on-kubernetes). + +If you made changes to the CRDs, apply your local copy with: + +```bash +kubectl apply -f artifacts/flagger/crd.yaml +``` + +Shutdown the Flagger instance installed on your cluster (replace the namespace with your mesh/ingress one): + +```bash +kubectl -n istio-system scale deployment/flagger --replicas=0 +``` + +Port forward to your Prometheus instance: + +```bash +kubectl -n istio-system port-forward svc/prometheus 9090:9090 +``` + +Run Flagger locally against your remote cluster by specifying a kubeconfig path: + +```bash +go run cmd/flagger/ -kubeconfig=$HOME/.kube/config \ +-log-level=info \ +-mesh-provider=istio \ +-metrics-server=http://localhost:9090 +``` + +Another option to manually test your changes is to build and push the image to your container registry: + +```bash +make build +docker tag weaveworks/flagger:latest /flagger: +docker push /flagger: +``` + +Deploy your image on the cluster and scale up Flagger: + +```bash +kubectl -n istio-system set image deployment/flagger flagger=/flagger: +kubectl -n istio-system scale deployment/flagger --replicas=1 +``` + +Now you can use one of the [tutorials]() to manually test your changes. + +### Integration testing + +Flagger end-to-end tests can be run locally with [Kubernetes Kind](https://github.com/kubernetes-sigs/kind). + +Create a Kind cluster: + +```bash +kind create cluster +``` + +Install a service mesh and/or an ingress controller in Kind. + +Linkerd example: + +```bash +linkerd install | kubectl apply -f - +linkerd check +``` + +Build Flagger container image and load it on the cluster: + +```bash +make build +docker tag weaveworks/flagger:latest test/flagger:latest +kind load docker-image test/flagger:latest +``` + +Install Flagger on the cluster and set the test image: + +```bash +kubectl apply -k ./kustomize/linkerd +kubectl -n linkerd set image deployment/flagger flagger=test/flagger:latest +kubectl -n linkerd rollout status deployment/flagger +``` + +Run the Linkerd e2e tests: + +```bash +./test/e2e-linkerd-tests.sh +``` + +For each service mesh and ingress controller there is a dedicated e2e test suite, +chose one that matches your changes from this [list](https://github.com/weaveworks/flagger/tree/master/test). + +When you open a pull request on Flagger repo, the unit and integration tests will be run in CI. + +### Release + +To release a new Flagger version (e.g. `2.0.0`) follow these steps: +* create a branch `git checkout -b prep-2.0.0` +* set the version in code and manifests `TAG=2.0.0 make version-set` +* commit changes and merge PR +* checkout master `git checkout master && git pull` +* tag master `make release` + +After the tag has been pushed to GitHub, the CI release pipeline does the following: +* creates a GitHub release +* pushes the Flagger binary and change log to GitHub release +* pushes the Flagger container image to Docker Hub +* pushes the Helm chart to github-pages branch +* GitHub pages publishes the new chart version on the Helm repository + + +