From 13bf11e71364011c2bef1026196ff3756ee2d1fa Mon Sep 17 00:00:00 2001 From: Enrique Encalada Date: Wed, 24 Mar 2021 15:24:02 +0100 Subject: [PATCH 1/8] Refactor main README Simplify the flow for users Minimize the Try It! section Provide a tutorial after the Try It! Add logo to the main README --- .docs/shipwright-logo-lightbg-512.png | Bin 0 -> 77093 bytes README.md | 165 ++++++++++++-------------- 2 files changed, 78 insertions(+), 87 deletions(-) create mode 100644 .docs/shipwright-logo-lightbg-512.png diff --git a/.docs/shipwright-logo-lightbg-512.png b/.docs/shipwright-logo-lightbg-512.png new file mode 100644 index 0000000000000000000000000000000000000000..72eabddb29b436528a791e1f35180c9344720367 GIT binary patch literal 77093 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 95632fcc8..8949908ef 100644 --- a/README.md +++ b/README.md @@ -13,153 +13,144 @@ SPDX-License-Identifier: Apache-2.0

-# Shipwright - a framework for building container images on Kubernetes +# ![shipwright-logo](.docs/shipwright-logo-lightbg-512.png) -Shipwright is an extensible framework for building container images on Kubernetes. With Shipwright, -developers can define and reuse build strategies that build container images for their CI/CD -pipelines. Any tool that builds images within a container can be supported, such -as [Kaniko](https://github.com/GoogleContainerTools/kaniko), -[Cloud Native Buildpacks](https://buildpacks.io/), and [Buildah](https://buildah.io/). +Shipwright is an extensible framework for building container images on Kubernetes. -## Dependencies +## Why? -| Dependency | Supported versions | -| -------------------------------------| ---------------------------- | -| [Kubernetes](https://kubernetes.io/) | v1.17.\*, v1.18.\*, v1.19.\* | -| [Tekton](https://tekton.dev) | v0.21.0 | - -## Build Strategies - -The following [Build Strategies](docs/buildstrategies.md) are installed by default: - -* [Source-to-Image](docs/buildstrategies.md#source-to-image) -* [Buildpacks-v3](docs/buildstrategies.md#buildpacks-v3) -* [Buildah](docs/buildstrategies.md#buildah) -* [Kaniko](docs/buildstrategies.md#kaniko) -* [ko](docs/buildstrategies.md#ko) - -Users have the option to define their own `BuildStrategy` or `ClusterBuildStrategy` resources and make them available for consumption via the `Build` resource. - -## Custom Resources - -Shipwright defines four CRDs: - -* The `BuildStrategy` CRD and the `ClusterBuildStrategy` CRD is used to register a strategy. -* The `Build` CRD is used to define a build configuration. -* The `BuildRun` CRD is used to start the actually image build using a registered strategy. - -## Read the Docs - -| Version | Docs | Examples | -| ------- | ------------------------------ | --------------------------- | -| HEAD | [Docs @ HEAD](/docs/README.md) | [Examples @ HEAD](/samples) | -| [v0.3.0](https://github.com/shipwright-io/build/releases/tag/v0.3.0) | [Docs @ v0.3.0](https://github.com/shipwright-io/build/tree/v0.3.0/docs) | [Examples @ v0.3.0](https://github.com/shipwright-io/build/tree/v0.3.0/samples) | -| [v0.2.0](https://github.com/shipwright-io/build/releases/tag/v0.2.0) | [Docs @ v0.2.0](https://github.com/shipwright-io/build/tree/v0.2.0/docs) | [Examples @ v0.2.0](https://github.com/shipwright-io/build/tree/v0.2.0/samples) | -| [v0.1.1](https://github.com/shipwright-io/build/releases/tag/v0.1.1) | [Docs @ v0.1.1](https://github.com/shipwright-io/build/tree/v0.1.1/docs) | [Examples @ v0.1.1](https://github.com/shipwright-io/build/tree/v0.1.1/samples) | -| [v0.1.0](https://github.com/shipwright-io/build/releases/tag/v0.1.0) | [Docs @ v0.1.0](https://github.com/shipwright-io/build/tree/v0.1.0/docs) | [Examples @ v0.1.0](https://github.com/shipwright-io/build/tree/v0.1.0/samples) | +With Shipwright developers get a simplified approach for building container images, by defining a minimal YAML that does not require +any previous knowledge of containers or container tooling. All you need is your source code in git and access to a container registry. -## Examples +Shipwright supports any tool that can build container images in Kubernetes clusters, such as: -Examples of `Build` resource using the example strategies installed by default. +- [Kaniko](https://github.com/GoogleContainerTools/kaniko) +- [Cloud Native Buildpacks](https://buildpacks.io/) +- [Buildah](https://buildah.io/) -* [`buildah`](samples/build/build_buildah_cr.yaml) -* [`buildpacks-v3-heroku`](samples/build/build_buildpacks-v3-heroku_cr.yaml) -* [`buildpacks-v3`](samples/build/build_buildpacks-v3_cr.yaml) -* [`kaniko`](samples/build/build_kaniko_cr.yaml) -* [`source-to-image`](samples/build/build_source-to-image_cr.yaml) +## Try It! -## Try it! +* We assume you already have a Kubernetes cluster (v1.18+). If you don't, you can use [Kind](/hack/install-kind.sh). -* Get a [Kubernetes](https://kubernetes.io/) cluster and [`kubectl`](https://kubernetes.io/docs/reference/kubectl/overview/) set up to connect to your cluster. -* Clone this repository from GitHub at the v0.3.0 tag: +* We also require a Tekton installation (v1.19+). To install the latest version, run: ```bash - $ git clone --branch v0.3.0 https://github.com/shipwright-io/build.git - ... - $ cd build/ + $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.20.1/release.yaml ``` - _Coming soon - install Shipwright Build via kubectl!_ - -* Install [Tekton](https://cloud.google.com/tekton) by running [hack/install-tekton.sh](hack/install-tekton.sh), it installs v0.21.0. +* Install the Shipwright deployment. To install the latest version, run: ```bash - $ hack/install-tekton.sh + $ kubectl apply --filename https://github.com/shipwright-io/build/releases/download/nightly/nightly-2021-03-24-1616591545.yaml ``` -* Install Shipwright and sample strategies via `make`: +* Install the Shipwright strategies. To install the latest version, run:: ```bash - $ make install + $ kubectl apply --filename https://github.com/shipwright-io/build/releases/download/nightly/default_strategies.yaml ``` -* Add a push secret to your container image repository, such as one on Docker Hub or quay.io: +* Generate a secret to access your container registry, such as one on [Docker Hub](https://hub.docker.com/) or [Quay.io](https://quay.io/): - ```yaml - $ kubectl create secret generic push-secret \ - --from-file=.dockerconfigjson=$HOME/.docker/config.json \ - --type=kubernetes.io/dockerconfigjson + ```bash + $ REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER= REGISTRY_PASSWORD= + $ kubectl create secret docker-registry push-secret --docker-server=$REGISTRY_SERVER --docker-username=$REGISTRY_USER --docker-password=$REGISTRY_PASSWORD --docker-email=me@here.com ``` -* Create a [Cloud Native Buildpacks](samples/build/build_buildpacks_v3_cr.yaml) build, replacing - `//` with the registry hostname, username, and repository your - cluster has access to and that you have permission to push images to. +* Create a Build object, replacing `` with the registry username your `push-secret` secret have access to: ```bash - $ kubectl apply -f - < + $ cat <//:latest + image: docker.io/${REGISTRY_ORG}/nodejs:latest credentials: name: push-secret EOF ``` -* Run your build: + ```bash + $ kubectl get builds + NAME REGISTERED REASON BUILDSTRATEGYKIND BUILDSTRATEGYNAME CREATIONTIME + buildpack-nodejs-build True Succeeded ClusterBuildStrategy buildpacks-v3 68s + ``` + +* Submit your buildrun: ```bash - $ kubectl apply -f - < Date: Wed, 24 Mar 2021 15:25:56 +0100 Subject: [PATCH 2/8] Add tutorials directory Introduce a tutorial.md landing document --- docs/tutorials/tutorial.md | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 docs/tutorials/tutorial.md diff --git a/docs/tutorials/tutorial.md b/docs/tutorials/tutorial.md new file mode 100644 index 000000000..2f2850995 --- /dev/null +++ b/docs/tutorials/tutorial.md @@ -0,0 +1,60 @@ +# Shipwright Build Tutorial + +So you just successfully build a container image via the [`Try It!`](/README.md#Try_It!) section and you want to know more? + +At Shipwright, we´ve spent a lot of time trying to figure out the best ways to simplify the experience when +building container images. For those Kubernetes users, Shipwright presents an alternative to build securely +container images in-cluster. + +What if we could + +- Support any existing tooling for building container images in Kubernetes clusters. +- Minimize the burden of learning a new tool for building images, by abstracting it from users. +- Simplify the user experience when building images via a standardize minimal API. +- Allow users to re-use their existing cluster for building and deploying container images. + +## Concepts + +| Concept | Description | +| ----------- | ----------- | +| **`Strategy`** | Refers to a particular tool that will be used when building a container image, such as Kaniko, Buildah, ko, etc. | +| **`Build`** | Resource used to define a build configuration. | +| **`BuildRun`** | Resource used to start the image build mechanism. | +| **`BuildStrategy/ClusterBuildStrategy`** | Resource that holds a template that dictates how to build via a particular strategy. | +| **`Dockerfile-less strategy`** | Is a category given to strategies that can build container images from source code, without the notion of a Dockerfile. | +| **`Dockerfile-based strategy`** | Is a category given to strategies that can build container images from source code, with a reference to a Dockerfile. | + +With the above concepts in mind, lets see how they all play together. + +## Strategies + +Shipwright ships with a set of strategies that are available across the cluster. + +The default installation includes these [buildstrategies](/docs/buildstrategies.md): + +* [Source-to-Image](docs/buildstrategies.md#source-to-image) +* [Buildpacks-v3](docs/buildstrategies.md#buildpacks-v3) +* [Buildah](docs/buildstrategies.md#buildah) +* [Kaniko](docs/buildstrategies.md#kaniko) +* [ko](docs/buildstrategies.md#ko) + +For more information about strategies see the related [docs](/docs/buildstrategies.md). + +## Examples + +### [Example with Kaniko](/docs/tutorials/building_with_kaniko.md) + +### [Example with Paketo](/docs/tutorials/building_with_paketo.md) + +Depending on your source code you might want to try a specific example. The following table serves as a guide to help you understand which +strategy to choose: + +| Sample code | Repository | ContextDir | Strategy Type | Strategy to use | +| ----------- | ----------- | ------------- | ------------- | ------------- | +| A go app with a Dockerfile | [shipwright-io/sample-go](https://github.com/shipwright-io/sample-go) | `/docker-build` | Dockerfile-based | Kaniko, Buildah | +| A go app | [shipwright-io/sample-go](https://github.com/shipwright-io/sample-go) | `/source-build` | Dockerfile-less | Paketo,Heroku | +| A ruby app | [shipwright-io/sample-ruby](https://github.com/shipwright-io/sample-ruby) | `/source-build` | Dockerfile-less | Paketo,Heroku | +| A java app with a Dockerfile | [hipwright-io/sample-jave](https://github.com/shipwright-io/sample-java) | `/docker-build` | Dockerfile-based | Kaniko, Buildah | +| Shipwright/Build | [shipwright-io/build](https://github.com/shipwright-io/build) | `/cmd/manager` | Dockerfile-less | Paketo,Heroku, Ko | + +_Note_: `ContextDir` is the path under the repository where the source code is located. From bef0594b0c690e50e1e01c82fc9f03c64d5bd7dc Mon Sep 17 00:00:00 2001 From: Enrique Encalada Date: Wed, 24 Mar 2021 15:27:06 +0100 Subject: [PATCH 3/8] Add Kaniko tutorial Drives users on how to use Kaniko for building a container image. --- docs/tutorials/building_with_kaniko.md | 127 +++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/tutorials/building_with_kaniko.md diff --git a/docs/tutorials/building_with_kaniko.md b/docs/tutorials/building_with_kaniko.md new file mode 100644 index 000000000..3bb045e36 --- /dev/null +++ b/docs/tutorials/building_with_kaniko.md @@ -0,0 +1,127 @@ + +# Building with Kaniko + +Before starting, make sure you have a running: + +- Tekton deployment +- Build deployment + +See the [`Try It!`](/README.md#Try_It!) section for more information. + +## Getting Started + +### Registry Authentication + +For this tutorial, we will require to create a `tutorial-secret` Kubernetes secret to access a [DockerHub](https://hub.docker.com/) registry, as follows: + +```sh +$ REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER= REGISTRY_PASSWORD= +$ kubectl create secret docker-registry tutorial-secret --docker-server=$REGISTRY_SERVER --docker-username=$REGISTRY_USER --docker-password=$REGISTRY_PASSWORD --docker-email=me@here.com +``` + +_Note_: For more information about authentication, please refer to the related [docs](/docs/development/authentication.md). + +## Create the strategy + +Ensure all strategies are in place, see the [`Try It!`](/README.md#Try_It!) section for more information. + +```sh +$ kubectl get cbs +NAME AGE +buildah 2m +buildpacks-v3 2m +kaniko 2m +ko 2m +source-to-image 2m +``` + +_Note_: For more information about strategies, please refer to the related [docs](/docs/buildstrategies.md). + +## Creating a Build + +For the Build definition, we will require the following: + +- A github repository containing a go [application](https://github.com/shipwright-io/sample-go/tree/main/docker-build) that requires a `Dockerfile`. +- The `tutorial-secret` we just created. +- The `kaniko` ClusterBuildStrategy. + +Let´s apply our Build and wait for it to be ready: + +```bash +$ export REGISTRY_ORG= +$ cat < Date: Wed, 24 Mar 2021 15:28:02 +0100 Subject: [PATCH 4/8] Remove obsolete docs for strategies Remove a Try It! section for buildstrategies docs, not longer needed. We have now a single Try It! in the main README --- docs/buildstrategies.md | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/docs/buildstrategies.md b/docs/buildstrategies.md index f52b3e72d..7b8368520 100644 --- a/docs/buildstrategies.md +++ b/docs/buildstrategies.md @@ -90,42 +90,6 @@ To install the namespaced scope strategy, use: kubectl apply -f samples/buildstrategy/buildpacks-v3/buildstrategy_buildpacks-v3-heroku_namespaced_cr.yaml ``` -### Try it - -To use this strategy follow this steps: - -- Create the Kubernetes secret that host the configuration to access the container registry. - -- Create a `Build` resource that uses `quay.io` or `DockerHub` image repository for pushing the image. Also, provide credentials to access it. - - ```yaml - apiVersion: shipwright.io/v1alpha1 - kind: Build - metadata: - name: buildpack-nodejs-build - spec: - source: - url: https://github.com/sclorg/nodejs-ex - strategy: - name: buildpacks-v3 - kind: ClusterBuildStrategy - output: - image: quay.io/yourorg/yourrepo - credentials: - ``` - -- Start a `BuildRun` resource. - - ```yaml - apiVersion: shipwright.io/v1alpha1 - kind: BuildRun - metadata: - name: buildpack-nodejs-buildrun - spec: - buildRef: - name: buildpack-nodejs-build - ``` - --- ## Kaniko From 67d5fdbd04d412b60ce33fb768adf623995113fb Mon Sep 17 00:00:00 2001 From: Enrique Encalada Date: Wed, 24 Mar 2021 16:04:14 +0100 Subject: [PATCH 5/8] Add tutorial on using Paketo Buildpacks Doc that explains how to interact with the buildpacks stratey in order to build a container image. --- docs/tutorials/building_with_paketo.md | 135 +++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 docs/tutorials/building_with_paketo.md diff --git a/docs/tutorials/building_with_paketo.md b/docs/tutorials/building_with_paketo.md new file mode 100644 index 000000000..badb884ff --- /dev/null +++ b/docs/tutorials/building_with_paketo.md @@ -0,0 +1,135 @@ + +# Building with Paketo + +Before starting, make sure you have a running: + +- Tekton deployment +- Build deployment + +See the [`Try It!`](/README.md#Try_It!) section for more information. + +## Getting Started + +### Registry Authentication + +For this tutorial, we will require to create a `tutorial-secret` Kubernetes secret to access a [DockerHub](https://hub.docker.com/) registry, as follows: + +```sh +$ REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER= REGISTRY_PASSWORD= +$ kubectl create secret docker-registry tutorial-secret --docker-server=$REGISTRY_SERVER --docker-username=$REGISTRY_USER --docker-password=$REGISTRY_PASSWORD --docker-email=me@here.com +``` + +_Note_: For more information about authentication, please refer to the related [docs](/docs/development/authentication.md). + +## Create the strategy + +Ensure all strategies are in place, see the [`Try It!`](/README.md#Try_It!) section for more information. + +```sh +$ kubectl get cbs +NAME AGE +buildah 2m +buildpacks-v3 2m +kaniko 2m +ko 2m +source-to-image 2m +``` + +Verify that the strategy exists in the cluster: + +```sh +$ kubectl get cbs +NAME AGE +buildpacks-v3 23m +``` + +_Note_: For more information about strategies, please refer to the related [docs](/docs/buildstrategies.md). + +## Creating a Build + +For the Build definition, we will require the following: + +- A github repository containing a ruby [application](https://github.com/shipwright-io/sample-ruby). +- The `tutorial-secret` we just created. +- The `buildpacks-v3` ClusterBuildStrategy. + +Let´s apply our Build and wait for it to be ready: + +```bash +$ export REGISTRY_ORG= +$ cat < Date: Mon, 29 Mar 2021 17:46:34 +0200 Subject: [PATCH 6/8] Apply suggestions from code review into README.md Co-authored-by: Jason Hall Co-authored-by: Matthias Diester Co-authored-by: Sascha Schwarze --- README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8949908ef..93d2ba8ea 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ SPDX-License-Identifier: Apache-2.0

-# ![shipwright-logo](.docs/shipwright-logo-lightbg-512.png) +# ![shipwright-logo](./docs/shipwright-logo-lightbg-512.png) Shipwright is an extensible framework for building container images on Kubernetes. ## Why? -With Shipwright developers get a simplified approach for building container images, by defining a minimal YAML that does not require +With Shipwright, developers get a simplified approach for building container images, by defining a minimal YAML that does not require any previous knowledge of containers or container tooling. All you need is your source code in git and access to a container registry. Shipwright supports any tool that can build container images in Kubernetes clusters, such as: @@ -30,7 +30,7 @@ Shipwright supports any tool that can build container images in Kubernetes clust ## Try It! -* We assume you already have a Kubernetes cluster (v1.18+). If you don't, you can use [Kind](/hack/install-kind.sh). +* We assume you already have a Kubernetes cluster (v1.18+). If you don't, you can use [KinD](https://kind.sigs.k8s.io), which you can install by running [`./hack/install-kind.sh`](./hack/install-kind.sh). * We also require a Tekton installation (v1.19+). To install the latest version, run: @@ -44,7 +44,7 @@ Shipwright supports any tool that can build container images in Kubernetes clust $ kubectl apply --filename https://github.com/shipwright-io/build/releases/download/nightly/nightly-2021-03-24-1616591545.yaml ``` -* Install the Shipwright strategies. To install the latest version, run:: +* Install the Shipwright strategies. To install the latest version, run: ```bash $ kubectl apply --filename https://github.com/shipwright-io/build/releases/download/nightly/default_strategies.yaml @@ -54,7 +54,11 @@ Shipwright supports any tool that can build container images in Kubernetes clust ```bash $ REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER= REGISTRY_PASSWORD= - $ kubectl create secret docker-registry push-secret --docker-server=$REGISTRY_SERVER --docker-username=$REGISTRY_USER --docker-password=$REGISTRY_PASSWORD --docker-email=me@here.com + $ kubectl create secret docker-registry push-secret \ + --docker-server=$REGISTRY_SERVER \ + --docker-username=$REGISTRY_USER \ + --docker-password=$REGISTRY_PASSWORD \ + --docker-email=me@here.com ``` * Create a Build object, replacing `` with the registry username your `push-secret` secret have access to: @@ -74,7 +78,7 @@ Shipwright supports any tool that can build container images in Kubernetes clust name: buildpacks-v3 kind: ClusterBuildStrategy output: - image: docker.io/${REGISTRY_ORG}/nodejs:latest + image: docker.io/${REGISTRY_ORG}/sample-nodejs:latest credentials: name: push-secret EOF @@ -120,7 +124,7 @@ Shipwright supports any tool that can build container images in Kubernetes clust Depending on your source code, you might want to build it differently with Shipwright. -To find out more on what´s the best strategy or what else can Shipwright do for you, please visit our [tutorial](/docs/tutorials/tutorial.md)! +To find out more on what's the best strategy or what else can Shipwright do for you, please visit our [tutorial](./docs/tutorials/tutorial.md)! ## More information @@ -145,7 +149,7 @@ To find out more on what´s the best strategy or what else can Shipwright do for ### Community meetings -We host weekly meetings for contributors, maintainers and anyone interested in the project. The weekly meetings take place on Monday´s at 2pm UTC. +We host weekly meetings for contributors, maintainers and anyone interested in the project. The weekly meetings take place on Mondays at 2pm UTC. * Meeting [minutes](https://github.com/shipwright-io/build/issues?q=is%3Aissue+label%3Acommunity+label%3Ameeting+is%3Aopen) * Public calendar [invite](https://calendar.google.com/calendar/u/1?cid=Y19iMWVndjc3anUyczJkbWNkM2R1ZnAxazhuNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t) From 68b980b627d0e914d3f325a2b9e69efd0683a363 Mon Sep 17 00:00:00 2001 From: Enrique Encalada Date: Mon, 29 Mar 2021 17:59:21 +0200 Subject: [PATCH 7/8] Apply suggestions from code review into tutorial samples Co-authored-by: Jason Hall --- docs/tutorials/building_with_kaniko.md | 13 +++++-------- docs/tutorials/building_with_paketo.md | 13 +++++-------- docs/tutorials/tutorial.md | 10 +++++----- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/docs/tutorials/building_with_kaniko.md b/docs/tutorials/building_with_kaniko.md index 3bb045e36..f68785651 100644 --- a/docs/tutorials/building_with_kaniko.md +++ b/docs/tutorials/building_with_kaniko.md @@ -1,12 +1,9 @@ # Building with Kaniko -Before starting, make sure you have a running: +Before starting, make sure you have Tekton and Shipwright Build installed. -- Tekton deployment -- Build deployment - -See the [`Try It!`](/README.md#Try_It!) section for more information. +See the [Try It!](../../README.md#try-it) section for more information. ## Getting Started @@ -23,7 +20,7 @@ _Note_: For more information about authentication, please refer to the related [ ## Create the strategy -Ensure all strategies are in place, see the [`Try It!`](/README.md#Try_It!) section for more information. +Ensure all strategies are in place, see the [Try It!](../../README.md#try-it) section for more information. ```sh $ kubectl get cbs @@ -41,11 +38,11 @@ _Note_: For more information about strategies, please refer to the related [docs For the Build definition, we will require the following: -- A github repository containing a go [application](https://github.com/shipwright-io/sample-go/tree/main/docker-build) that requires a `Dockerfile`. +- A GitHub repository containing a Go [application](https://github.com/shipwright-io/sample-go/tree/main/docker-build) that requires a `Dockerfile`. - The `tutorial-secret` we just created. - The `kaniko` ClusterBuildStrategy. -Let´s apply our Build and wait for it to be ready: +Let's apply our Build and wait for it to be ready: ```bash $ export REGISTRY_ORG= diff --git a/docs/tutorials/building_with_paketo.md b/docs/tutorials/building_with_paketo.md index badb884ff..b2e8e7b8d 100644 --- a/docs/tutorials/building_with_paketo.md +++ b/docs/tutorials/building_with_paketo.md @@ -1,12 +1,9 @@ # Building with Paketo -Before starting, make sure you have a running: +Before starting, make sure you have Tekton and Shipwright Build installed. -- Tekton deployment -- Build deployment - -See the [`Try It!`](/README.md#Try_It!) section for more information. +See the [Try It!](../../README.md#try-it) section for more information. ## Getting Started @@ -23,7 +20,7 @@ _Note_: For more information about authentication, please refer to the related [ ## Create the strategy -Ensure all strategies are in place, see the [`Try It!`](/README.md#Try_It!) section for more information. +Ensure all strategies are in place, see the [Try It!](../../README.md#try-it) section for more information. ```sh $ kubectl get cbs @@ -49,11 +46,11 @@ _Note_: For more information about strategies, please refer to the related [docs For the Build definition, we will require the following: -- A github repository containing a ruby [application](https://github.com/shipwright-io/sample-ruby). +- A GitHub repository containing a Ruby [application](https://github.com/shipwright-io/sample-ruby). - The `tutorial-secret` we just created. - The `buildpacks-v3` ClusterBuildStrategy. -Let´s apply our Build and wait for it to be ready: +Let's apply our Build and wait for it to be ready: ```bash $ export REGISTRY_ORG= diff --git a/docs/tutorials/tutorial.md b/docs/tutorials/tutorial.md index 2f2850995..15cd12bf9 100644 --- a/docs/tutorials/tutorial.md +++ b/docs/tutorials/tutorial.md @@ -1,10 +1,10 @@ # Shipwright Build Tutorial -So you just successfully build a container image via the [`Try It!`](/README.md#Try_It!) section and you want to know more? +So you just successfully built a container image via the [Try It!](../../README.md#try-it) section and you want to know more? + +At Shipwright, we've spent a lot of time trying to figure out the best ways to simplify the experience when +building container images. Shipwright provides an alternative for securely building container images in your Kubernetes cluster. -At Shipwright, we´ve spent a lot of time trying to figure out the best ways to simplify the experience when -building container images. For those Kubernetes users, Shipwright presents an alternative to build securely -container images in-cluster. What if we could @@ -20,7 +20,7 @@ What if we could | **`Strategy`** | Refers to a particular tool that will be used when building a container image, such as Kaniko, Buildah, ko, etc. | | **`Build`** | Resource used to define a build configuration. | | **`BuildRun`** | Resource used to start the image build mechanism. | -| **`BuildStrategy/ClusterBuildStrategy`** | Resource that holds a template that dictates how to build via a particular strategy. | +| **`BuildStrategy` / `ClusterBuildStrategy`** | Resource that holds a template that dictates how to build via a particular strategy. | | **`Dockerfile-less strategy`** | Is a category given to strategies that can build container images from source code, without the notion of a Dockerfile. | | **`Dockerfile-based strategy`** | Is a category given to strategies that can build container images from source code, with a reference to a Dockerfile. | From 7688e4f40be8c326c1f7718e9c30c64132b4743b Mon Sep 17 00:00:00 2001 From: Enrique Encalada Date: Mon, 29 Mar 2021 18:09:40 +0200 Subject: [PATCH 8/8] More Enhancements Rename tutorial.md to README.md When listing strategies, follow an order of prio, based on Other minor enhance around versions. --- README.md | 12 ++++++------ docs/tutorials/{tutorial.md => README.md} | 16 +++++++++------- ...ith_paketo.md => building_with_buildpacks.md} | 0 3 files changed, 15 insertions(+), 13 deletions(-) rename docs/tutorials/{tutorial.md => README.md} (84%) rename docs/tutorials/{building_with_paketo.md => building_with_buildpacks.md} (100%) diff --git a/README.md b/README.md index 93d2ba8ea..ef4bf5a5f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ SPDX-License-Identifier: Apache-2.0

-# ![shipwright-logo](./docs/shipwright-logo-lightbg-512.png) +# ![shipwright-logo](./.docs/shipwright-logo-lightbg-512.png) Shipwright is an extensible framework for building container images on Kubernetes. @@ -30,9 +30,9 @@ Shipwright supports any tool that can build container images in Kubernetes clust ## Try It! -* We assume you already have a Kubernetes cluster (v1.18+). If you don't, you can use [KinD](https://kind.sigs.k8s.io), which you can install by running [`./hack/install-kind.sh`](./hack/install-kind.sh). +* We assume you already have a Kubernetes cluster (v1.17+). If you don't, you can use [KinD](https://kind.sigs.k8s.io), which you can install by running [`./hack/install-kind.sh`](./hack/install-kind.sh). -* We also require a Tekton installation (v1.19+). To install the latest version, run: +* We also require a Tekton installation (v0.19+). To install the latest version, run: ```bash $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.20.1/release.yaml @@ -124,7 +124,7 @@ Shipwright supports any tool that can build container images in Kubernetes clust Depending on your source code, you might want to build it differently with Shipwright. -To find out more on what's the best strategy or what else can Shipwright do for you, please visit our [tutorial](./docs/tutorials/tutorial.md)! +To find out more on what's the best strategy or what else can Shipwright do for you, please visit our [tutorial](./docs/tutorials/README.md)! ## More information @@ -143,13 +143,13 @@ To find out more on what's the best strategy or what else can Shipwright do for | Dependency | Supported versions | | -------------------------------------| ---------------------------- | | [Kubernetes](https://kubernetes.io/) | v1.17.\*, v1.18.\*, v1.19.\* | -| [Tekton](https://tekton.dev) | v0.21.0 | +| [Tekton](https://tekton.dev) | v0.19.0, v0.20.\*, v0.21.0 | ## Want to get involved? ### Community meetings -We host weekly meetings for contributors, maintainers and anyone interested in the project. The weekly meetings take place on Mondays at 2pm UTC. +We host weekly meetings for contributors, maintainers and anyone interested in the project. The weekly meetings take place on Mondays at 1pm UTC. * Meeting [minutes](https://github.com/shipwright-io/build/issues?q=is%3Aissue+label%3Acommunity+label%3Ameeting+is%3Aopen) * Public calendar [invite](https://calendar.google.com/calendar/u/1?cid=Y19iMWVndjc3anUyczJkbWNkM2R1ZnAxazhuNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t) diff --git a/docs/tutorials/tutorial.md b/docs/tutorials/README.md similarity index 84% rename from docs/tutorials/tutorial.md rename to docs/tutorials/README.md index 15cd12bf9..4c05b88ed 100644 --- a/docs/tutorials/tutorial.md +++ b/docs/tutorials/README.md @@ -32,19 +32,19 @@ Shipwright ships with a set of strategies that are available across the cluster. The default installation includes these [buildstrategies](/docs/buildstrategies.md): -* [Source-to-Image](docs/buildstrategies.md#source-to-image) * [Buildpacks-v3](docs/buildstrategies.md#buildpacks-v3) -* [Buildah](docs/buildstrategies.md#buildah) * [Kaniko](docs/buildstrategies.md#kaniko) +* [Source-to-Image](docs/buildstrategies.md#source-to-image) +* [Buildah](docs/buildstrategies.md#buildah) * [ko](docs/buildstrategies.md#ko) For more information about strategies see the related [docs](/docs/buildstrategies.md). ## Examples -### [Example with Kaniko](/docs/tutorials/building_with_kaniko.md) +* [Example with Kaniko](/docs/tutorials/building_with_kaniko.md) -### [Example with Paketo](/docs/tutorials/building_with_paketo.md) +* [Example with Buildpacks](/docs/tutorials/building_with_buildpacks.md) Depending on your source code you might want to try a specific example. The following table serves as a guide to help you understand which strategy to choose: @@ -52,9 +52,11 @@ strategy to choose: | Sample code | Repository | ContextDir | Strategy Type | Strategy to use | | ----------- | ----------- | ------------- | ------------- | ------------- | | A go app with a Dockerfile | [shipwright-io/sample-go](https://github.com/shipwright-io/sample-go) | `/docker-build` | Dockerfile-based | Kaniko, Buildah | -| A go app | [shipwright-io/sample-go](https://github.com/shipwright-io/sample-go) | `/source-build` | Dockerfile-less | Paketo,Heroku | -| A ruby app | [shipwright-io/sample-ruby](https://github.com/shipwright-io/sample-ruby) | `/source-build` | Dockerfile-less | Paketo,Heroku | +| A go app | [shipwright-io/sample-go](https://github.com/shipwright-io/sample-go) | `/source-build` | Dockerfile-less | buildpacks-v3, buildpacks-v3-heroku | +| A ruby app | [shipwright-io/sample-ruby](https://github.com/shipwright-io/sample-ruby) | `/source-build` | Dockerfile-less | buildpacks-v3, buildpacks-v3-heroku | | A java app with a Dockerfile | [hipwright-io/sample-jave](https://github.com/shipwright-io/sample-java) | `/docker-build` | Dockerfile-based | Kaniko, Buildah | -| Shipwright/Build | [shipwright-io/build](https://github.com/shipwright-io/build) | `/cmd/manager` | Dockerfile-less | Paketo,Heroku, Ko | +| Shipwright/Build | [shipwright-io/build](https://github.com/shipwright-io/build) | `/cmd/manager` | Dockerfile-less | ko | _Note_: `ContextDir` is the path under the repository where the source code is located. + +_Note_: `Buildpacks-v3` support is provided via Paketo and Heroku. Paketo is our default tool, so any reference to buildpacks-v3 usually implies the usage of [Paketo](https://paketo.io/). diff --git a/docs/tutorials/building_with_paketo.md b/docs/tutorials/building_with_buildpacks.md similarity index 100% rename from docs/tutorials/building_with_paketo.md rename to docs/tutorials/building_with_buildpacks.md