# 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