From 5038fa905bc5b91a40a9bc0a20c55b856712cdc8 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Tue, 1 Mar 2016 17:18:26 -0700 Subject: [PATCH 1/2] docs(workflow): re-adding workflow after rebase This supercedes #263. --- docs/workflow/developer-workflows.md | 760 +++++++++++++++++++++++ docs/workflow/helm-dm-diagrams.src.md | 84 +++ docs/workflow/helm-official-workflow.png | Bin 0 -> 30322 bytes docs/workflow/private-chart-no-repo.png | Bin 0 -> 18297 bytes docs/workflow/private-chart-repo.png | Bin 0 -> 45502 bytes docs/workflow/public-chart-repo.png | Bin 0 -> 22859 bytes 6 files changed, 844 insertions(+) create mode 100644 docs/workflow/developer-workflows.md create mode 100644 docs/workflow/helm-dm-diagrams.src.md create mode 100644 docs/workflow/helm-official-workflow.png create mode 100644 docs/workflow/private-chart-no-repo.png create mode 100644 docs/workflow/private-chart-repo.png create mode 100644 docs/workflow/public-chart-repo.png diff --git a/docs/workflow/developer-workflows.md b/docs/workflow/developer-workflows.md new file mode 100644 index 000000000..8f4c700ae --- /dev/null +++ b/docs/workflow/developer-workflows.md @@ -0,0 +1,760 @@ +# Helm/DM Developer Experience Workflows + +The purpose of this document is to outline the various workflows used in +our target use cases. It is broken into three major sections: + +- A section on the anticipated workflow patterns for the `helm` command line tool. This walks through every command. +- A section on development workflow models +- A section providing sample workflow implementations for the workflow + models + +The document is designed to address user experience, not the +implementation of the tools. + +## tl;dr: The Workflows + +Helm and DM expose tools for creating, managing, and deploying charts. +This document outlines those tools, and then provides several possible +high-level workflows. + +We envision four high-level workflows, each satisfying different organizational needs. + +- Helm Official: The workflow used for contributing to the official Helm charts repository. +- Public Unofficial: A public workflow used by another org +- Private: Non-public repository +- Private Development: Charts without repositories + +## Helm Workflows and User Experience + +In this section we examine several workflows that we feel are central to +the experience of deploying, managing, and building applications using +Helm. Each workflow is followed by a basic model of where the processing +of commands occurs. + +### User Workflow + +The user workflow is the common case. This answers stories for the "tire +kicker" and "standard user" personas. + +#### Installation + +Currently, the client can be used with no installation. However, installing the server side component is done like this: + +``` +$ helm dm install +``` + +- Client uses existing `kubectl` configuration to install built-in manifests. + +General pattern: +``` +helm dm install +``` + +#### Searching + +``` +$ helm search bar +helm:example.com/foo/bar - A basic chart +helm:example.com/foo/barracuda - A fishy chart +helm:example.com/foo/barbecue - A smoky chart +``` + +- Client submits the query to the manager +- Server searches the available chart repos + +General pattern: +``` +helm search PATTERN +``` + + +#### Simple deployment: + +``` +$ helm deploy helm:example.com/foo/bar +Created wonky-panda +``` + +- The client sends the server a request to deploy `helm:example.com/foo/bar`. +- The server assigns a random name `wonky-panda`, fetches the chart from + object storage, and goes about the deployment process. + +General patterns: +``` +helm deploy [-f CONFIG] [-n NAME] [CHART] +``` + + +#### Find out about params: + +In this operation, helm reads a chart and returns the list of parameters +that can be supplied in a template: + +``` +$ helm chart show helm:example.com/foo/bar +Params: +- bgcolor: The background color for the home page (hex code or HTML colors) +- title: The title of the app +``` + +- The client sends the request to the API server +- The API server fetches the chart, analyzes it, and returns the list of + parameters. + +General pattern: +``` +helm chart show CHART +``` + + +#### Generate the params for me: + +In this operation, helm generates a parameter values file for the user. + +``` +$ helm chart params helm:example.com/foo/bar +Created: values.yaml +$ edit values.yaml +``` + +- The client sends the request to the server +- The server returns a stub file +- The client writes the file to disk + +General pattern: +``` +helm chart params CHART [CHART...] +``` + +#### Deploy with params: + +In this operation, the user deploys a chart with an associated values +file. + +``` +$ helm deploy -f values.yaml helm:example.com/foo/bar +Created taco-tuesday +``` + +- The client sends a request with the name of the chart and the values + file. +- The API server generates a name (`taco-tuesday`) +- The API server fetches the request chart, sends the chart and values + through the template resolution phase, and deploys the results. + +If we allow the user to pass in a name (overriding the generated name), +then the server must first guarantee that this name is unique. + +Alternately, just the values file may be specified, since it contains a reference to the base chart. + +``` +$ helm deploy -f values.yaml +Created taco-wednesday +``` + +#### Get the info about named deployment. + +A deployment, as we have seen, is a named instance of a chart. +Operations that operate on these instances use the name to refer to the +instance. + +``` +$ helm status taco-tuesday +OK +Located at: 10.10.10.77:8080 +``` + +- The client sends the API server a request for the status of + `taco-tuesday`. +- The API server looks up pertinent data and returns it. +- The client displays the data. + +General pattern: +``` +helm status NAME +``` + +#### Edit and redeploy: + +Redeployment is taking an existing _instance_ and changing its template +values, and then re-deploying it. + +``` +$ edit values.yaml +$ helm redeploy -f values.yaml taco-tuesday +Redeployed taco-tuesday +``` + +- The client sends the instance name and the new values to the server +- The server coalesces the values into the existing instance and then + restarts. + +General pattern: +``` +helm redeploy [-f CONFIG] NAME +``` + + +#### Delete: + +``` +$ helm delete taco-tuesday +Destroyed taco-tuesday +``` + +- The client sends the DELETE instance name command +- The API server destroys the resource + +General pattern: +``` +helm uninstall NAME [NAME...] +``` + + +### Power User Features + +Users familiar with the system may desire additional tools. + +#### Name a deploy + +``` +$ helm deploy -name skinny-pigeon example.com/foo/bar +``` + +This follows the deployment process above. The server _must_ ensure that +the name is unique. + +#### Get values for an app: +``` +$ helm deployment params taco-tuesday +Stored in values.yaml +$ helm redeploy taco-tuesday values.yaml +``` + +- The client sends the instance name to the values endpoint +- The server returns the values file used to generate the instance. +- The client writes this to a file (or, perhaps, to STDOUT) + +General pattern: +``` +helm deployment params NAME [NAME...] +``` + +When more than one name is specified, the resulting file will contain configs for all names. + +#### Get fully generated manifest files + +``` +$ helm deployment manifest taco-tuesday +Created manifest.yaml +``` + +- The client sends the instance name to the manifests endpoint +- The server returns the manifests, as generated during the + deploy/redeploy cycle done prior. + +General pattern: +``` +helm deployment manifest NAME [NAME...] +``` + +#### Auto-detecting helm problems + +``` +$ helm doctor +``` + +- The client performs local diagnostics and diagnostics of Kubernetes and the DM server. + +General pattern: +``` +helm doctor +``` + +#### Listing all installed charts + +``` +$ helm chart list +helm:example.com/foo/bar#1.1.1 +helm:example.com/foo/bar#1.1.2 +helm:example.com/foo/barbecue#0.1.0 +``` + +- The client sends the server a request for all charts installed +- The server computes and responds + +General pattern: +``` +helm chart list +``` + +#### Get instances of a chart + +NB: We might rename this `helm chart instances`, as that is less vague. + +``` +$ helm chart get helm:example.com/foo/bar +taco-tuesday +taco-wednesday +``` + +- The client sends a request to the API server. +- The server responds with a list of deployment instance names. + +This retrieves a shallow list, and does not inspect instances for ancestor charts. + +General pattern: +``` +helm chart get CHART +``` + +### Listing deployments + +``` +$ helm deployment list +skinny-pigeon +taco-tuesday +taco-wednesday +``` + +- The client requests a list from the server +- The server returns the list + +General pattern: +``` +helm deployment list +``` + +### Getting details of a deployment + +_NB: Might not need this._ + +``` +$ helm deployment show skinny-pigeon +DETAILS +``` + +### Developer Workflow + +This section covers the experience of the chart developer. + +In this case, when the client detects that it is working with a local +chart, it bundles the chart, and sends the entire chart, not just the +values. + +``` +$ helm create mychart +Created mychart/Chart.yaml +$ helm lint mychart +OK +$ helm deploy . +Uploading ./mychart as localchart/mychart-0.0.1.tgz +Created skinny-pigeon +$ helm status skinny-pigeon +OK +$ edit something +$ helm redeploy skinny-pigeon +Redeployed skinny-pigeon +``` + +- `helm create` and `helm lint` are client side operations +- `helm deploy`, `helm status`, and `helm redeploy` are explained above. + +General pattern for create: +``` +helm create [--from NAME] CHARTNAME +``` + +Where `NAME` will result in fetching the generated values from the cluster. + +General pattern for lint: +``` +helm lint PATH +``` + +#### Packaging and Releasing packages + +Package a chart: + +``` +$ helm package . +Created foo-1.1.2.tgz +``` + +Releasing a chart: + +``` +$ helm release -u https://example.com/bucket ./foo-1.1.2.tgz +Uploaded to https://example.com/bucket/foo-1.1.2.tgz +``` + +General pattern: +``` +helm package PATH +helm release [-u destination] PATH|FILE +``` + + +### Helm Cluster Management Commands + +#### Install +``` +$ helm dm install +``` +- Client installs using the current kubectl configuration + +General pattern: +``` +helm dm install +``` + +#### Uninstall + +``` +$ helm dm uninstall +``` + +- The client interacts with the Kubernetes API server + +General pattern: +``` +helm dm uninstall +``` + +#### Check which cluster is the current target for helm + +``` +$ helm dm target +API Endpoint: https://10.21.21.21/ +``` + +- The client interacts with the local Kubernetes config and the Kubernetes API server + +General pattern: +``` +helm search PATTERN +``` + +#### View status of DM service + +``` +$ helm dm status +OK +``` + +- The client interacts with the Kubernetes API server + +General pattern: +``` +helm dm status +``` + +### Repository Configuration + +#### Listing repositories + +``` +$ helm repo list +``` + +- The client request info from the server +- The server provides information about which repositories it is aware of + +General pattern: +``` +helm repo list +``` + +#### Adding credentials + +``` +$ helm credential add aff34... 89897a... +Created token-foo +``` + +- The client sends a request to the server +- The server creates a new token and returns a name + +General pattern: +``` +helm credential add TOKEN SECRET +``` + +#### Adding a repository with credentials + +``` +$ helm repo add -c token-foo https://example.com/charts +``` + +The URL is of the form `PROTO://HOST[:PORT]/BUCKET`. + +General pattern: +``` +helm repo add [-c TOKEN_NAME] REPO_URL +``` + +#### Removing repositories + +``` +$ helm repo rm https://example.com/charts +``` + +- The client sends a request to the server +- The server removes the repo from the known list + +General pattern: +``` +helm repo rm REPO_URL +``` + +#### Listing Credentials + +``` +$ helm credential list +token-foo: TOKEN +``` + +- The client requests a list of tokens +- The server returns the name and the token, but not the secret + +General pattern: +``` +helm credential list [PATTERN] +``` + +#### Removing credentials + +``` +$ helm credential rm token-foo +``` + +- The client sends a request to the server +- The server deletes the credential + +General pattern: +``` +helm credential rm CREDENTIAL_NAME +``` + +## An Overview of Four Team Workflows + +The remainder of this document is broken into two major sections: The Overview covers the +broad characteristics of the four workflows. The Development Cycle +section covers how the developer cycle plays out for each of the four +workflows. + +This section provides an introduction to the four workflows outlined +above, calling out characteristics of each workflow that define it +against other workflows. + +### Helm Official + +The _Helm Official_ project focuses on maintaining a repository of high-quality production-ready charts. Charts may be contributed by anyone in the broad community, and they are vetted and maintained by the Helm Official core contributors. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Developer | Us | Us | Us | Anyone +How? | Dev PR | We review | We release and sign | We upload to managed storage | Chart is public + +Characteristics of the Helm Official workflow: + +- Source code for charts is maintained in a GitHub repository +- Chart source is linted and tested by automated tools and human beings +- Charts are released by core contributors to the project +- All Charts are made available under the Apache 2 license +- When a chart is released, an official binary distribution is uploaded to the official chart repository in Google Cloud Storage. In addition, Helm Official charts have the following characteristics: + - They released by community members + - They are versioned independently (each chart has its own version) + - They are signed/provenanced by one of the official Helm GPG keys + - They are made available with no authentication or registration requirements + +### Public Unofficial + +The Helm project need not be the only repository available to users. Other organizations may wish to host their own repositories, and load whatever charts they so choose. + +We attempt to provide flexibility that allows such organizations to build repositories as they see fit, but keep the end user's experience roughly similar. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Developer | Org? | Org? | Org | Anyone +How? | Dev Contribution | Org defines this | Org defines this | Org hosts | Chart is public + + +A public unofficial chart repository is free to structure the development cycle as they see fit. + +- We have no opinions about the source control (if any) used for chart development +- We provide `helm release` as a tool for releasing a chart + - We strongly advise public repository maintainers to use provenance files + - We strongly advise public repository maintainers to make public keys available to the general public. +- Charts must be stored in one of the supported object storage repositories, including Google Cloud Storage and S3 compatible storage +- Helm/DM provides the following tools for working with such repositories: + - `helm release` takes local source and builds a chart. + - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. + - `helm repo push` allows new charts to be pushed to a remote server + + +### Private Chart Repositories + +We anticipate that some Helm users will desire to have private repositories over which they have control over both the development cycle and the availability of the released charts. + +Similar to our approach to unofficial chart repositories, we attempt to provide a tool general enough that it can be used for private chart repositories. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Org | Org | Org | Org | Org +How? | Org defines this | Org defines this | Org defines this | Org hosts | Org controls access + + +We assume the following about this workflow: + +- We have no opinions about the source control (if any) used for chart development +- We provide `helm release` as a tool for releasing a chart + - While we suggest signing charts, this is a discretionary exercise for private repositories +- Charts may be stored in private GCS, S3, or compatible object storage. Helm is tested on Minio (an S3 compatible server for private hosting) to ensure a viable private cloud mechanism. + - Private repositories may require authentication via token/secret, as well as access controls. +- Helm/DM provides the following tools for working with such repositories: + - `helm release` takes local source and builds a chart. + - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. + - `helm repo push` allows new charts to be pushed to a remote server + + +### Private Charts without Repositories + +In some cases, an organization may wish to create charts, but not store them in a chart repository. While this is not the preferred Helm workflow, we support tooling for this method. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Org | Org | Org | N/A | Org +How? | Org defines this | Org defines this | Org defines this | N/A | Org defines this + +We operate on a different set of assumptions for this workflow. + +- We have no opinions about the source code control (if any) used. +- We have no opinions about access control when repositories are not involved. +- Charts must be pushed into the cluster (the cluster will not pull from a non-repository location) +- Helm/DM provides the following tools for this workflow: + - `helm release` builds a package + - `helm deploy` pushes a package into a cluster + +## Development Cycles for Each Workflow + +In this section, we explain the developer cycle for each of the four workflows above. + +### 0. Pre-Submission Workflow (aka Local Development) + +Prior to submitting a chart for release, developers may use the following workflow. This workflow is assumed in all four sections below. + +1. Create a chart with `helm create MYCHART` (or manually) +2. Edit the chart +3. Test the chart's standards conformance with `helm lint MYCHART` +4. Run a test deployment using `helm deploy MYCHART` + +### 1. The Helm Official Development Cycle + +The Helm Official project maintains source code in a location that is readily available to all of the community. Source code is stored on GitHub in the official (`github.com/helm/charts` or `github.com/kubernetes/charts`) repository. GitHub facilitates a development workflow that this project uses for chart maintenance. + +There are two general classes of user that are important to this workflow: + +- Core Contributors: Core contributors are developers that have been given special stewardship responsibilities over the repository. They have the following responsibilities: + - Review submissions to the repository + - Approve charts for release + - Respond to issues with existing charts +- Community Members: Any user of the Helm Official project who is not a core contributor. + +![Helm Official Workflow](helm-official-workflow.png) + +1. PULL REQUEST: A new chart (or an update to an existing chart) is contributed by a core maintainer or community member. This is done using GitHub pull requests. +2. AUTOMATED TESTING: Automated testing tools evaluate the contribution for the following: + - CLA approval of the submitter + - Style/format adherence + - Unit, functional, and/or integration tests pass +3. DISCUSSION: Any discussion on the pull request may happen using GitHub's commentary features +3. CODE REVIEW: Two or more core contributors must review the code and sign off on it. +4. RELEASE APPROVAL: If a chart is approved for release, a core maintainer may mark it as such +5. AUTOMATED RELEASE: Once a chart is approved for release, an automated tool will bundle the chart, sign it using an official signature, and upload it into the Helm Official repository + +### 2. Unofficial Public Repositories + +Unofficial repositories do not have a well-defined development workflow, but have a semi-rigid release workflow. + +- The public repository must use a supported object storage system +- Charts must be in the same format + +#### A Hypothetical Dev Workflow + +An organization has a Bazaar (bzr) project maintained at _launchpad.net_, and has no automated tooling around the project. + +![Unofficial Public Repo](public-chart-repo.png) + +1. Developers work off of copies of the Bazaar code base +2. Developers push branches into the code review system when ready +2. A central maintainer approves and merges reviewed code +3. At a fixed point in time, the project administrator releases a new version of the entire repository +4. During this process, all charts are version, packaged/signed, and uploaded to the project's S3 repository, where they are made available to users + +The above workflow illustrates how a development team may conduct public shared development, and release to a public repository, but with a workflow that diverges substantially from the model of the Helm Official repository. + +### 3. Private Chart Repository + +In this model, the entire process is managed by an organization. + +#### A Hypothetical Dev Workflow + +The organization uses an internally hosted Git server, Gerrit for code review, and Jenkins for automation. They host an internal repository on Minio. This repository has a combination of pre-approved Helm Official packages (copied from upstream) and internal packages. + +In this workflow, charts are not stored together. Instead, each chart is stored alongside the Docker image source code. For example, the repository named `corpcalendar.git` is laid out as follows: + +``` +corpcalendar/ + Dockerfile + src/ + ... # corpcalendar source code + chart/ + corpcalendar + Chart.yaml + ... # Helm Chart files +``` + +Each separate project is structured in this way. + +![Private Repo](private-chart-repo.png) + +1. Developers clone a desired repo (`git clone .../corpcalendar.git`) +2. Developers work on the code and chart together +3. Upon each commit, Jenkins does the following: + - Project tests are run + - A snapshot Docker image is built and stored in a snapshot Docker registry + - A snapshot chart is built and stored on a snapshot Helm repository + - Integration tests are run +4. When the developer is ready for a release, she tags the repository (`git tag v1.2.3`) and pushes the tag +5. Upon a tag commit, Jenkins does the following: + - Runs tests + - Creates a final Docker image and uploads to the internal release Docker registry + - Creates a final chart and uploads to the internal Helm repository +6. Internal users may then access the chart at the internal Helm repository + +This workflow represents a method common in enterprises, and also illustrates how chart development need not occur in one aggregated repository. + +### 4. Private Charts without Repositories + +This model is used in cases where an organization chooses not to host a Chart repository. While we don't advise using this method, a workflow exists. + +While we don't offer an opinionated VCS workflow, we also suggest that one is used. In our example below, we draw on VCS usage. + +#### A Hypothetical Dev Workflow + +A small development team uses Subversion (SVN) to host their internal projects. They do not use a chart repository, nor do they employ any automated testing tools outside of Helm. + +![Private Charts with No Repo](private-chart-no-repo.png) + +1. Developer Andy checks out a copy of the SVN repository (`svn co ...`) +2. Developer Andy edits charts locally, and test locally +3. When a chart is ready for sharing, the developer checks in the revised chart (`svn ci ...`) +4. Developer Barb updates her local copy (`svn up`) +5. Developer Barb then uses `helm deploy ./localchart` to deploy this chart into production + diff --git a/docs/workflow/helm-dm-diagrams.src.md b/docs/workflow/helm-dm-diagrams.src.md new file mode 100644 index 000000000..03c3ecb9a --- /dev/null +++ b/docs/workflow/helm-dm-diagrams.src.md @@ -0,0 +1,84 @@ +# Helm-DM Workflow Diagrams + +# Helm Official +@startuml helm-official-workflow.png +autonumber +actor Member +actor Core +participant GitHub +participant CI +database Repository +Member->GitHub: PR New Chart +GitHub->CI: Run automated tests +CI->GitHub: Tests pass +GitHub-->Member: Tests pass +GitHub-->Core: Tests pass +Core<->Member: Discussion about chart +Core->GitHub: Code review +Core->GitHub: Release approval +GitHub->CI: Issue release +CI->Repository: Push release +Member->Repository: Get release +@enduml + +# Public Chart Repository +An example workflow using Launchpad and BZR. +@startuml public-chart-repo.png +autonumber +actor Developer +actor Maintainer +participant Launchpad +Developer->Launchpad: Push branch with chart +Maintainer->Launchpad: Fetch branch +Maintainer->Maintainer: Locally test +Maintainer->Launchpad: Merge branch +... later ... +Maintainer->Launchpad: Create global release +Maintainer->Maintainer: Regenerate all versioned charts +Maintainer->Repository: Push charts +@enduml + +# Private chart repository +An example workflow using an internal Gerrit Git repo and Jenkins. +@startuml private-chart-repo.png +autonumber +actor "Developer A" as A +actor "Developer B" as B +actor "Internal user" as Internal +participant Gerrit +participant Jenkins +participant "Docker registry" as Docker +participant "Chart repository" as Chart +A->Gerrit: Clone repo +A->A: Local development +A->Gerrit: Push branch +Gerrit->Jenkins: Test branch +Jenkins->Jenkins: Build and test +Jenkins->Docker: Snapshot image push +Jenkins->Chart: Snapshot chart +Jenkins->Jenkins: Integration tests +Jenkins-->A: Build OK +B->Gerrit: Code review +B->A: Code approval +A->Gerrit: Tag the new chart +Gerrit->Jenkins: Release +Jenkins->Jenkins: Build and test +Jenkins->Docker: Production image push +Jenkins->Chart: Production chart +Internal->Chart: Get production chart +@enduml + +# Private Charts without repository +An example using SVN for local dev, and no chart repository. +@startuml private-chart-no-repo.png +autonumber +actor "Developer A" as A +actor "Developer B" as B +participant SVN +participant Kubernetes +A->SVN: Checkout code +A->A: Develop locally +A->SVN: Check in code +B<->SVN: Update local +B->Kubernetes: Run helm deploy on local chart +@enduml diff --git a/docs/workflow/helm-official-workflow.png b/docs/workflow/helm-official-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..049c9f68b30bdca46729752a66657e07a4088e91 GIT binary patch literal 30322 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 literal 0 HcmV?d00001 diff --git a/docs/workflow/private-chart-no-repo.png b/docs/workflow/private-chart-no-repo.png new file mode 100644 index 0000000000000000000000000000000000000000..4919d63bc701e807e76154b778dd86af6beff67b GIT binary patch literal 18297 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 WQ%2sM2cOirB_pXQQ6^>>@c#fg70wL+ literal 0 HcmV?d00001 diff --git a/docs/workflow/private-chart-repo.png b/docs/workflow/private-chart-repo.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9d17e8927bc56fe2649dc351f0c65e3cc0f0c1 GIT binary patch literal 45502 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

^1s@TU(MamA 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 K{Ke@DfBt{=^%Kqj literal 0 HcmV?d00001 diff --git a/docs/workflow/public-chart-repo.png b/docs/workflow/public-chart-repo.png new file mode 100644 index 0000000000000000000000000000000000000000..31c9f73a86166b93163b5cb19a0d542283777747 GIT binary patch literal 22859 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 xfFqdY3HePnqG#osMO|V&&HkRc~7Jd literal 0 HcmV?d00001 From 0e980f401d5d8ce3d147c963d0af52be16e06d27 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Thu, 3 Mar 2016 18:10:33 -0700 Subject: [PATCH 2/2] doc(workflow): split workflow document in two This splits the one large document into two smaller documents. --- docs/workflow/developer-workflows.md | 251 +-------------------------- docs/workflow/team-workflows.md | 226 ++++++++++++++++++++++++ 2 files changed, 229 insertions(+), 248 deletions(-) create mode 100644 docs/workflow/team-workflows.md diff --git a/docs/workflow/developer-workflows.md b/docs/workflow/developer-workflows.md index 8f4c700ae..238837fd8 100644 --- a/docs/workflow/developer-workflows.md +++ b/docs/workflow/developer-workflows.md @@ -1,32 +1,9 @@ # Helm/DM Developer Experience Workflows -The purpose of this document is to outline the various workflows used in -our target use cases. It is broken into three major sections: +This document outlines the individual workflows that Helm is designed to +solve. -- A section on the anticipated workflow patterns for the `helm` command line tool. This walks through every command. -- A section on development workflow models -- A section providing sample workflow implementations for the workflow - models - -The document is designed to address user experience, not the -implementation of the tools. - -## tl;dr: The Workflows - -Helm and DM expose tools for creating, managing, and deploying charts. -This document outlines those tools, and then provides several possible -high-level workflows. - -We envision four high-level workflows, each satisfying different organizational needs. - -- Helm Official: The workflow used for contributing to the official Helm charts repository. -- Public Unofficial: A public workflow used by another org -- Private: Non-public repository -- Private Development: Charts without repositories - -## Helm Workflows and User Experience - -In this section we examine several workflows that we feel are central to +In this document we examine several workflows that we feel are central to the experience of deploying, managing, and building applications using Helm. Each workflow is followed by a basic model of where the processing of commands occurs. @@ -536,225 +513,3 @@ General pattern: ``` helm credential rm CREDENTIAL_NAME ``` - -## An Overview of Four Team Workflows - -The remainder of this document is broken into two major sections: The Overview covers the -broad characteristics of the four workflows. The Development Cycle -section covers how the developer cycle plays out for each of the four -workflows. - -This section provides an introduction to the four workflows outlined -above, calling out characteristics of each workflow that define it -against other workflows. - -### Helm Official - -The _Helm Official_ project focuses on maintaining a repository of high-quality production-ready charts. Charts may be contributed by anyone in the broad community, and they are vetted and maintained by the Helm Official core contributors. - -Stage | Devel | Review | Release | Store | Use -------|-------|--------|---------|-------|----- -Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use -Who? | Developer | Us | Us | Us | Anyone -How? | Dev PR | We review | We release and sign | We upload to managed storage | Chart is public - -Characteristics of the Helm Official workflow: - -- Source code for charts is maintained in a GitHub repository -- Chart source is linted and tested by automated tools and human beings -- Charts are released by core contributors to the project -- All Charts are made available under the Apache 2 license -- When a chart is released, an official binary distribution is uploaded to the official chart repository in Google Cloud Storage. In addition, Helm Official charts have the following characteristics: - - They released by community members - - They are versioned independently (each chart has its own version) - - They are signed/provenanced by one of the official Helm GPG keys - - They are made available with no authentication or registration requirements - -### Public Unofficial - -The Helm project need not be the only repository available to users. Other organizations may wish to host their own repositories, and load whatever charts they so choose. - -We attempt to provide flexibility that allows such organizations to build repositories as they see fit, but keep the end user's experience roughly similar. - -Stage | Devel | Review | Release | Store | Use -------|-------|--------|---------|-------|----- -Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use -Who? | Developer | Org? | Org? | Org | Anyone -How? | Dev Contribution | Org defines this | Org defines this | Org hosts | Chart is public - - -A public unofficial chart repository is free to structure the development cycle as they see fit. - -- We have no opinions about the source control (if any) used for chart development -- We provide `helm release` as a tool for releasing a chart - - We strongly advise public repository maintainers to use provenance files - - We strongly advise public repository maintainers to make public keys available to the general public. -- Charts must be stored in one of the supported object storage repositories, including Google Cloud Storage and S3 compatible storage -- Helm/DM provides the following tools for working with such repositories: - - `helm release` takes local source and builds a chart. - - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. - - `helm repo push` allows new charts to be pushed to a remote server - - -### Private Chart Repositories - -We anticipate that some Helm users will desire to have private repositories over which they have control over both the development cycle and the availability of the released charts. - -Similar to our approach to unofficial chart repositories, we attempt to provide a tool general enough that it can be used for private chart repositories. - -Stage | Devel | Review | Release | Store | Use -------|-------|--------|---------|-------|----- -Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use -Who? | Org | Org | Org | Org | Org -How? | Org defines this | Org defines this | Org defines this | Org hosts | Org controls access - - -We assume the following about this workflow: - -- We have no opinions about the source control (if any) used for chart development -- We provide `helm release` as a tool for releasing a chart - - While we suggest signing charts, this is a discretionary exercise for private repositories -- Charts may be stored in private GCS, S3, or compatible object storage. Helm is tested on Minio (an S3 compatible server for private hosting) to ensure a viable private cloud mechanism. - - Private repositories may require authentication via token/secret, as well as access controls. -- Helm/DM provides the following tools for working with such repositories: - - `helm release` takes local source and builds a chart. - - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. - - `helm repo push` allows new charts to be pushed to a remote server - - -### Private Charts without Repositories - -In some cases, an organization may wish to create charts, but not store them in a chart repository. While this is not the preferred Helm workflow, we support tooling for this method. - -Stage | Devel | Review | Release | Store | Use -------|-------|--------|---------|-------|----- -Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use -Who? | Org | Org | Org | N/A | Org -How? | Org defines this | Org defines this | Org defines this | N/A | Org defines this - -We operate on a different set of assumptions for this workflow. - -- We have no opinions about the source code control (if any) used. -- We have no opinions about access control when repositories are not involved. -- Charts must be pushed into the cluster (the cluster will not pull from a non-repository location) -- Helm/DM provides the following tools for this workflow: - - `helm release` builds a package - - `helm deploy` pushes a package into a cluster - -## Development Cycles for Each Workflow - -In this section, we explain the developer cycle for each of the four workflows above. - -### 0. Pre-Submission Workflow (aka Local Development) - -Prior to submitting a chart for release, developers may use the following workflow. This workflow is assumed in all four sections below. - -1. Create a chart with `helm create MYCHART` (or manually) -2. Edit the chart -3. Test the chart's standards conformance with `helm lint MYCHART` -4. Run a test deployment using `helm deploy MYCHART` - -### 1. The Helm Official Development Cycle - -The Helm Official project maintains source code in a location that is readily available to all of the community. Source code is stored on GitHub in the official (`github.com/helm/charts` or `github.com/kubernetes/charts`) repository. GitHub facilitates a development workflow that this project uses for chart maintenance. - -There are two general classes of user that are important to this workflow: - -- Core Contributors: Core contributors are developers that have been given special stewardship responsibilities over the repository. They have the following responsibilities: - - Review submissions to the repository - - Approve charts for release - - Respond to issues with existing charts -- Community Members: Any user of the Helm Official project who is not a core contributor. - -![Helm Official Workflow](helm-official-workflow.png) - -1. PULL REQUEST: A new chart (or an update to an existing chart) is contributed by a core maintainer or community member. This is done using GitHub pull requests. -2. AUTOMATED TESTING: Automated testing tools evaluate the contribution for the following: - - CLA approval of the submitter - - Style/format adherence - - Unit, functional, and/or integration tests pass -3. DISCUSSION: Any discussion on the pull request may happen using GitHub's commentary features -3. CODE REVIEW: Two or more core contributors must review the code and sign off on it. -4. RELEASE APPROVAL: If a chart is approved for release, a core maintainer may mark it as such -5. AUTOMATED RELEASE: Once a chart is approved for release, an automated tool will bundle the chart, sign it using an official signature, and upload it into the Helm Official repository - -### 2. Unofficial Public Repositories - -Unofficial repositories do not have a well-defined development workflow, but have a semi-rigid release workflow. - -- The public repository must use a supported object storage system -- Charts must be in the same format - -#### A Hypothetical Dev Workflow - -An organization has a Bazaar (bzr) project maintained at _launchpad.net_, and has no automated tooling around the project. - -![Unofficial Public Repo](public-chart-repo.png) - -1. Developers work off of copies of the Bazaar code base -2. Developers push branches into the code review system when ready -2. A central maintainer approves and merges reviewed code -3. At a fixed point in time, the project administrator releases a new version of the entire repository -4. During this process, all charts are version, packaged/signed, and uploaded to the project's S3 repository, where they are made available to users - -The above workflow illustrates how a development team may conduct public shared development, and release to a public repository, but with a workflow that diverges substantially from the model of the Helm Official repository. - -### 3. Private Chart Repository - -In this model, the entire process is managed by an organization. - -#### A Hypothetical Dev Workflow - -The organization uses an internally hosted Git server, Gerrit for code review, and Jenkins for automation. They host an internal repository on Minio. This repository has a combination of pre-approved Helm Official packages (copied from upstream) and internal packages. - -In this workflow, charts are not stored together. Instead, each chart is stored alongside the Docker image source code. For example, the repository named `corpcalendar.git` is laid out as follows: - -``` -corpcalendar/ - Dockerfile - src/ - ... # corpcalendar source code - chart/ - corpcalendar - Chart.yaml - ... # Helm Chart files -``` - -Each separate project is structured in this way. - -![Private Repo](private-chart-repo.png) - -1. Developers clone a desired repo (`git clone .../corpcalendar.git`) -2. Developers work on the code and chart together -3. Upon each commit, Jenkins does the following: - - Project tests are run - - A snapshot Docker image is built and stored in a snapshot Docker registry - - A snapshot chart is built and stored on a snapshot Helm repository - - Integration tests are run -4. When the developer is ready for a release, she tags the repository (`git tag v1.2.3`) and pushes the tag -5. Upon a tag commit, Jenkins does the following: - - Runs tests - - Creates a final Docker image and uploads to the internal release Docker registry - - Creates a final chart and uploads to the internal Helm repository -6. Internal users may then access the chart at the internal Helm repository - -This workflow represents a method common in enterprises, and also illustrates how chart development need not occur in one aggregated repository. - -### 4. Private Charts without Repositories - -This model is used in cases where an organization chooses not to host a Chart repository. While we don't advise using this method, a workflow exists. - -While we don't offer an opinionated VCS workflow, we also suggest that one is used. In our example below, we draw on VCS usage. - -#### A Hypothetical Dev Workflow - -A small development team uses Subversion (SVN) to host their internal projects. They do not use a chart repository, nor do they employ any automated testing tools outside of Helm. - -![Private Charts with No Repo](private-chart-no-repo.png) - -1. Developer Andy checks out a copy of the SVN repository (`svn co ...`) -2. Developer Andy edits charts locally, and test locally -3. When a chart is ready for sharing, the developer checks in the revised chart (`svn ci ...`) -4. Developer Barb updates her local copy (`svn up`) -5. Developer Barb then uses `helm deploy ./localchart` to deploy this chart into production - diff --git a/docs/workflow/team-workflows.md b/docs/workflow/team-workflows.md new file mode 100644 index 000000000..8fcb7b342 --- /dev/null +++ b/docs/workflow/team-workflows.md @@ -0,0 +1,226 @@ +# Team Workflows + +This document explains the four team workflows that Helm is designed to +solve. + +## An Overview of Four Team Workflows + +The remainder of this document is broken into two major sections: The Overview covers the +broad characteristics of the four workflows. The Development Cycle +section covers how the developer cycle plays out for each of the four +workflows. + +This section provides an introduction to the four workflows outlined +above, calling out characteristics of each workflow that define it +against other workflows. + +### Helm Official + +The _Helm Official_ project focuses on maintaining a repository of high-quality production-ready charts. Charts may be contributed by anyone in the broad community, and they are vetted and maintained by the Helm Official core contributors. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Developer | Us | Us | Us | Anyone +How? | Dev PR | We review | We release and sign | We upload to managed storage | Chart is public + +Characteristics of the Helm Official workflow: + +- Source code for charts is maintained in a GitHub repository +- Chart source is linted and tested by automated tools and human beings +- Charts are released by core contributors to the project +- All Charts are made available under the Apache 2 license +- When a chart is released, an official binary distribution is uploaded to the official chart repository in Google Cloud Storage. In addition, Helm Official charts have the following characteristics: + - They released by community members + - They are versioned independently (each chart has its own version) + - They are signed/provenanced by one of the official Helm GPG keys + - They are made available with no authentication or registration requirements + +### Public Unofficial + +The Helm project need not be the only repository available to users. Other organizations may wish to host their own repositories, and load whatever charts they so choose. + +We attempt to provide flexibility that allows such organizations to build repositories as they see fit, but keep the end user's experience roughly similar. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Developer | Org? | Org? | Org | Anyone +How? | Dev Contribution | Org defines this | Org defines this | Org hosts | Chart is public + + +A public unofficial chart repository is free to structure the development cycle as they see fit. + +- We have no opinions about the source control (if any) used for chart development +- We provide `helm release` as a tool for releasing a chart + - We strongly advise public repository maintainers to use provenance files + - We strongly advise public repository maintainers to make public keys available to the general public. +- Charts must be stored in one of the supported object storage repositories, including Google Cloud Storage and S3 compatible storage +- Helm/DM provides the following tools for working with such repositories: + - `helm release` takes local source and builds a chart. + - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. + - `helm repo push` allows new charts to be pushed to a remote server + + +### Private Chart Repositories + +We anticipate that some Helm users will desire to have private repositories over which they have control over both the development cycle and the availability of the released charts. + +Similar to our approach to unofficial chart repositories, we attempt to provide a tool general enough that it can be used for private chart repositories. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Org | Org | Org | Org | Org +How? | Org defines this | Org defines this | Org defines this | Org hosts | Org controls access + + +We assume the following about this workflow: + +- We have no opinions about the source control (if any) used for chart development +- We provide `helm release` as a tool for releasing a chart + - While we suggest signing charts, this is a discretionary exercise for private repositories +- Charts may be stored in private GCS, S3, or compatible object storage. Helm is tested on Minio (an S3 compatible server for private hosting) to ensure a viable private cloud mechanism. + - Private repositories may require authentication via token/secret, as well as access controls. +- Helm/DM provides the following tools for working with such repositories: + - `helm release` takes local source and builds a chart. + - `helm repo add|list|rm` allows users to add, list, and remove repositories from the recognized list. + - `helm repo push` allows new charts to be pushed to a remote server + + +### Private Charts without Repositories + +In some cases, an organization may wish to create charts, but not store them in a chart repository. While this is not the preferred Helm workflow, we support tooling for this method. + +Stage | Devel | Review | Release | Store | Use +------|-------|--------|---------|-------|----- +Operations | Create/modify chart | Code review | Sign, version, package | Store releases | Get, Use +Who? | Org | Org | Org | N/A | Org +How? | Org defines this | Org defines this | Org defines this | N/A | Org defines this + +We operate on a different set of assumptions for this workflow. + +- We have no opinions about the source code control (if any) used. +- We have no opinions about access control when repositories are not involved. +- Charts must be pushed into the cluster (the cluster will not pull from a non-repository location) +- Helm/DM provides the following tools for this workflow: + - `helm release` builds a package + - `helm deploy` pushes a package into a cluster + +## Development Cycles for Each Workflow + +In this section, we explain the developer cycle for each of the four workflows above. + +### 0. Pre-Submission Workflow (aka Local Development) + +Prior to submitting a chart for release, developers may use the following workflow. This workflow is assumed in all four sections below. + +1. Create a chart with `helm create MYCHART` (or manually) +2. Edit the chart +3. Test the chart's standards conformance with `helm lint MYCHART` +4. Run a test deployment using `helm deploy MYCHART` + +### 1. The Helm Official Development Cycle + +The Helm Official project maintains source code in a location that is readily available to all of the community. Source code is stored on GitHub in the official (`github.com/helm/charts` or `github.com/kubernetes/charts`) repository. GitHub facilitates a development workflow that this project uses for chart maintenance. + +There are two general classes of user that are important to this workflow: + +- Core Contributors: Core contributors are developers that have been given special stewardship responsibilities over the repository. They have the following responsibilities: + - Review submissions to the repository + - Approve charts for release + - Respond to issues with existing charts +- Community Members: Any user of the Helm Official project who is not a core contributor. + +![Helm Official Workflow](helm-official-workflow.png) + +1. PULL REQUEST: A new chart (or an update to an existing chart) is contributed by a core maintainer or community member. This is done using GitHub pull requests. +2. AUTOMATED TESTING: Automated testing tools evaluate the contribution for the following: + - CLA approval of the submitter + - Style/format adherence + - Unit, functional, and/or integration tests pass +3. DISCUSSION: Any discussion on the pull request may happen using GitHub's commentary features +3. CODE REVIEW: Two or more core contributors must review the code and sign off on it. +4. RELEASE APPROVAL: If a chart is approved for release, a core maintainer may mark it as such +5. AUTOMATED RELEASE: Once a chart is approved for release, an automated tool will bundle the chart, sign it using an official signature, and upload it into the Helm Official repository + +### 2. Unofficial Public Repositories + +Unofficial repositories do not have a well-defined development workflow, but have a semi-rigid release workflow. + +- The public repository must use a supported object storage system +- Charts must be in the same format + +#### A Hypothetical Dev Workflow + +An organization has a Bazaar (bzr) project maintained at _launchpad.net_, and has no automated tooling around the project. + +![Unofficial Public Repo](public-chart-repo.png) + +1. Developers work off of copies of the Bazaar code base +2. Developers push branches into the code review system when ready +2. A central maintainer approves and merges reviewed code +3. At a fixed point in time, the project administrator releases a new version of the entire repository +4. During this process, all charts are version, packaged/signed, and uploaded to the project's S3 repository, where they are made available to users + +The above workflow illustrates how a development team may conduct public shared development, and release to a public repository, but with a workflow that diverges substantially from the model of the Helm Official repository. + +### 3. Private Chart Repository + +In this model, the entire process is managed by an organization. + +#### A Hypothetical Dev Workflow + +The organization uses an internally hosted Git server, Gerrit for code review, and Jenkins for automation. They host an internal repository on Minio. This repository has a combination of pre-approved Helm Official packages (copied from upstream) and internal packages. + +In this workflow, charts are not stored together. Instead, each chart is stored alongside the Docker image source code. For example, the repository named `corpcalendar.git` is laid out as follows: + +``` +corpcalendar/ + Dockerfile + src/ + ... # corpcalendar source code + chart/ + corpcalendar + Chart.yaml + ... # Helm Chart files +``` + +Each separate project is structured in this way. + +![Private Repo](private-chart-repo.png) + +1. Developers clone a desired repo (`git clone .../corpcalendar.git`) +2. Developers work on the code and chart together +3. Upon each commit, Jenkins does the following: + - Project tests are run + - A snapshot Docker image is built and stored in a snapshot Docker registry + - A snapshot chart is built and stored on a snapshot Helm repository + - Integration tests are run +4. When the developer is ready for a release, she tags the repository (`git tag v1.2.3`) and pushes the tag +5. Upon a tag commit, Jenkins does the following: + - Runs tests + - Creates a final Docker image and uploads to the internal release Docker registry + - Creates a final chart and uploads to the internal Helm repository +6. Internal users may then access the chart at the internal Helm repository + +This workflow represents a method common in enterprises, and also illustrates how chart development need not occur in one aggregated repository. + +### 4. Private Charts without Repositories + +This model is used in cases where an organization chooses not to host a Chart repository. While we don't advise using this method, a workflow exists. + +While we don't offer an opinionated VCS workflow, we also suggest that one is used. In our example below, we draw on VCS usage. + +#### A Hypothetical Dev Workflow + +A small development team uses Subversion (SVN) to host their internal projects. They do not use a chart repository, nor do they employ any automated testing tools outside of Helm. + +![Private Charts with No Repo](private-chart-no-repo.png) + +1. Developer Andy checks out a copy of the SVN repository (`svn co ...`) +2. Developer Andy edits charts locally, and test locally +3. When a chart is ready for sharing, the developer checks in the revised chart (`svn ci ...`) +4. Developer Barb updates her local copy (`svn up`) +5. Developer Barb then uses `helm deploy ./localchart` to deploy this chart into production +