github.com/koderover/helm@v2.17.0+incompatible/docs/developers.md (about)

     1  # Developers Guide
     2  
     3  This guide explains how to set up your environment for developing on
     4  Helm and Tiller.
     5  
     6  ## Prerequisites
     7  
     8  - The latest version of Go
     9  - The latest version of Glide
    10  - A Kubernetes cluster w/ kubectl (optional)
    11  - The gRPC toolchain
    12  - Git
    13  
    14  ## Building Helm/Tiller
    15  
    16  We use Make to build our programs. The simplest way to get started is:
    17  
    18  ```console
    19  $ make bootstrap build
    20  ```
    21  
    22  NOTE: This will fail if not running from the path `$GOPATH/src/k8s.io/helm`. The
    23  directory `k8s.io` should not be a symlink or `build` will not find the relevant
    24  packages.
    25  
    26  This will build both Helm and Tiller. `make bootstrap` will attempt to
    27  install certain tools if they are missing.
    28  
    29  To run all the tests (without running the tests for `vendor/`), run
    30  `make test`. To run all tests in a containerized environment, run `make
    31  docker-test`.
    32  
    33  To run Helm and Tiller locally, you can run `bin/helm` or `bin/tiller`.
    34  
    35  - Helm and Tiller are known to run on macOS and most Linux distributions, including
    36    Alpine.
    37  - Tiller must have access to a Kubernetes cluster. It learns about the
    38    cluster by examining the Kube config files that `kubectl` uses.
    39  
    40  ### Man pages
    41  
    42  Man pages and Markdown documentation are already pre-built in `docs/`. You may
    43  regenerate documentation using `make docs`.
    44  
    45  To expose the Helm man pages to your `man` client, you can put the files in your
    46  `$MANPATH`:
    47  
    48  ```
    49  $ export MANPATH=$GOPATH/src/k8s.io/helm/docs/man:$MANPATH
    50  $ man helm
    51  ```
    52  
    53  ## gRPC and Protobuf
    54  
    55  Helm and Tiller communicate using gRPC. To get started with gRPC, you will need to...
    56  
    57  - Install `protoc` for compiling protobuf files. Releases are
    58    [here](https://github.com/google/protobuf/releases)
    59  - Run Helm's `make bootstrap` to generate the `protoc-gen-go` plugin and
    60    place it in `bin/`.
    61  
    62  Note that you need to be on protobuf 3.2.0 (`protoc --version`). The
    63  version of `protoc-gen-go` is tied to the version of gRPC used in
    64  Kubernetes. So the plugin is maintained locally.
    65  
    66  While the gRPC and ProtoBuf specs remain silent on indentation, we
    67  require that the indentation style matches the Go format specification.
    68  Namely, protocol buffers should use tab-based indentation and rpc
    69  declarations should follow the style of Go function declarations.
    70  
    71  ### The Helm API (HAPI)
    72  
    73  We use gRPC as an API layer. See `pkg/proto/hapi` for the generated Go code,
    74  and `_proto` for the protocol buffer definitions.
    75  
    76  To regenerate the Go files from the protobuf source, `make protoc`.
    77  
    78  ## Docker Images
    79  
    80  To build Docker images, use `make docker-build`.
    81  
    82  Pre-build images are already available in the official Kubernetes Helm
    83  GCR registry.
    84  
    85  ## Running a Local Cluster
    86  
    87  For development, we highly recommend using the
    88  [Kubernetes Minikube](https://github.com/kubernetes/minikube)
    89  developer-oriented distribution. Once this is installed, you can use
    90  `helm init` to install into the cluster. Note that version of tiller you're using for
    91  development may not be available in Google Cloud Container Registry. If you're getting
    92  image pull errors, you can override the version of Tiller. Example:
    93  
    94  ```console
    95  helm init --tiller-image=ghcr.io/helm/tiller:2.17.0
    96  ```
    97  
    98  Or use the latest version:
    99  
   100  ```console
   101  helm init --canary-image
   102  ```
   103  
   104  For developing on Tiller, it is sometimes more expedient to run Tiller locally
   105  instead of packaging it into an image and running it in-cluster. You can do
   106  this by telling the Helm client to use a local instance.
   107  
   108  ```console
   109  $ make build
   110  $ bin/tiller
   111  ```
   112  
   113  And to configure the Helm client, use the `--host` flag or export the `HELM_HOST`
   114  environment variable:
   115  
   116  ```console
   117  $ export HELM_HOST=localhost:44134
   118  $ helm install foo
   119  ```
   120  
   121  (Note that you do not need to use `helm init` when you are running Tiller directly)
   122  
   123  Tiller should run on any >= 1.3 Kubernetes cluster.
   124  
   125  ## Contribution Guidelines
   126  
   127  We welcome contributions. This project has set up some guidelines in
   128  order to ensure that (a) code quality remains high, (b) the project
   129  remains consistent, and (c) contributions follow the open source legal
   130  requirements. Our intent is not to burden contributors, but to build
   131  elegant and high-quality open source code so that our users will benefit.
   132  
   133  Make sure you have read and understood the main CONTRIBUTING guide:
   134  
   135  https://github.com/helm/helm/blob/master/CONTRIBUTING.md
   136  
   137  ### Structure of the Code
   138  
   139  The code for the Helm project is organized as follows:
   140  
   141  - The individual programs are located in `cmd/`. Code inside of `cmd/`
   142    is not designed for library re-use.
   143  - Shared libraries are stored in `pkg/`.
   144  - The raw ProtoBuf files are stored in `_proto/hapi` (where `hapi` stands for
   145    the Helm Application Programming Interface).
   146  - The Go files generated from the `proto` definitions are stored in `pkg/proto`.
   147  - The `scripts/` directory contains a number of utility scripts. Most of these
   148    are used by the CI/CD pipeline.
   149  - The `rootfs/` folder is used for Docker-specific files.
   150  - The `docs/` folder is used for documentation and examples.
   151  
   152  Go dependencies are managed with
   153  [Glide](https://github.com/Masterminds/glide) and stored in the
   154  `vendor/` directory.
   155  
   156  ### Git Conventions
   157  
   158  We use Git for our version control system. The `master` branch is the
   159  home of the current development candidate. Releases are tagged.
   160  
   161  We accept changes to the code via GitHub Pull Requests (PRs). One
   162  workflow for doing this is as follows:
   163  
   164  1. Go to your `$GOPATH/src/k8s.io` directory and `git clone` the
   165     `github.com/helm/helm` repository.
   166  2. Fork that repository into your GitHub account
   167  3. Add your repository as a remote for `$GOPATH/src/k8s.io/helm`
   168  4. Create a new working branch (`git checkout -b feat/my-feature`) and
   169     do your work on that branch.
   170  5. When you are ready for us to review, sign your commit, push your branch to GitHub, and
   171     then open a new pull request with us.
   172  
   173  For Git commit messages, we follow the [Semantic Commit Messages](https://karma-runner.github.io/0.13/dev/git-commit-msg.html):
   174  
   175  ```
   176  fix(helm): add --foo flag to 'helm install'
   177  
   178  When 'helm install --foo bar' is run, this will print "foo" in the
   179  output regardless of the outcome of the installation.
   180  
   181  Closes #1234
   182  ```
   183  
   184  Common commit types:
   185  
   186  - fix: Fix a bug or error
   187  - feat: Add a new feature
   188  - docs: Change documentation
   189  - test: Improve testing
   190  - ref: refactor existing code
   191  
   192  Common scopes:
   193  
   194  - helm: The Helm CLI
   195  - tiller: The Tiller server
   196  - proto: Protobuf definitions
   197  - pkg/lint: The lint package. Follow a similar convention for any
   198    package
   199  - `*`: two or more scopes
   200  
   201  Read more:
   202  - The [Deis Guidelines](https://github.com/deis/workflow/blob/master/src/contributing/submitting-a-pull-request.md)
   203    were the inspiration for this section.
   204  - Karma Runner [defines](https://karma-runner.github.io/0.13/dev/git-commit-msg.html) the semantic commit message idea.
   205  
   206  ### Go Conventions
   207  
   208  We follow the Go coding style standards very closely. Typically, running
   209  `go fmt` will make your code beautiful for you.
   210  
   211  We also typically follow the conventions recommended by `go lint` and
   212  `gometalinter`. Run `make test-style` to test the style conformance.
   213  If you do not want to install all the linters from `gometalinter` into your
   214  global Go environment, you can run `make docker-test-style` which will
   215  run the same tests, but isolated within a docker container.
   216  
   217  Read more:
   218  
   219  - Effective Go [introduces formatting](https://golang.org/doc/effective_go.html#formatting).
   220  - The Go Wiki has a great article on [formatting](https://github.com/golang/go/wiki/CodeReviewComments).
   221  
   222  ### Protobuf Conventions
   223  
   224  Because this project is largely Go code, we format our Protobuf files as
   225  closely to Go as possible. There are currently no real formatting rules
   226  or guidelines for Protobuf, but as they emerge, we may opt to follow
   227  those instead.
   228  
   229  Standards:
   230  - Tabs for indentation, not spaces.
   231  - Spacing rules follow Go conventions (curly braces at line end, spaces
   232    around operators).
   233  
   234  Conventions:
   235  - Files should specify their package with `option go_package = "...";`
   236  - Comments should translate into good Go code comments (since `protoc`
   237    copies comments into the destination source code file).
   238  - RPC functions are defined in the same file as their request/response
   239    messages.
   240  - Deprecated RPCs, messages, and fields are marked deprecated in the comments (`// UpdateFoo
   241    DEPRECATED updates a foo.`).