From 49d2316d71e8c315e0a8fd76008bc2920f56b3c3 Mon Sep 17 00:00:00 2001 From: Christie Wilson Date: Fri, 31 Aug 2018 17:15:35 -0700 Subject: [PATCH] Add pipeline strawman example @dlorenc @ImJasonH @tejal29 @aaron-prindle and I have been working on a strawman proposal for adding a Pipeline CRD and also for possibly envolving the Build CRD into a slightly more generic Task CRD. This PR demonstrates some paper prototype examples of what it could look like to define pipelines using the CRDs described in the README. --- README.md | 129 +++++++++++++++++- crds.png | Bin 0 -> 38224 bytes examples/README.md | 40 ++++++ examples/build_task.yaml | 25 ++++ examples/deploy_tasks.yaml | 47 +++++++ examples/invocations/kritis-pipeline-run.yaml | 45 ++++++ examples/invocations/run-kritis-test.yaml | 59 ++++++++ examples/pipelineparams.yaml | 55 ++++++++ examples/pipelines/guestbook-pipeline.png | Bin 0 -> 31630 bytes examples/pipelines/guestbook.yaml | 83 +++++++++++ examples/pipelines/kritis-pipeline.png | Bin 0 -> 33933 bytes examples/pipelines/kritis.yaml | 55 ++++++++ examples/test_tasks.yaml | 59 ++++++++ 13 files changed, 595 insertions(+), 2 deletions(-) create mode 100644 crds.png create mode 100644 examples/README.md create mode 100644 examples/build_task.yaml create mode 100644 examples/deploy_tasks.yaml create mode 100644 examples/invocations/kritis-pipeline-run.yaml create mode 100644 examples/invocations/run-kritis-test.yaml create mode 100644 examples/pipelineparams.yaml create mode 100644 examples/pipelines/guestbook-pipeline.png create mode 100644 examples/pipelines/guestbook.yaml create mode 100644 examples/pipelines/kritis-pipeline.png create mode 100644 examples/pipelines/kritis.yaml create mode 100644 examples/test_tasks.yaml diff --git a/README.md b/README.md index 43e03076574..e7b90d24790 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,127 @@ -# build-pipeline - A library of build pipelines +# Pipeline CRD + +This repo contains the API definition of the Pipeline CRD and an on cluster implementation of that API. +The goal of the Pipeline CRD is to provide k8s-style resources that allow the +declaration of CI/CD-style pipelines, which can be backed by any arbitrary impelmentation. + +Features the Pipeline CRD will support include: + +* Conditional, parallel and distributed execution +* Interaction with CI/CD resources such as source code, artifacts, resutls, deployments and clusters + +The goal of the Pipeline CRD is to fit into and cooperate with +[the knative ecosystem](https://github.com/knative/docs#welcome-knative), specifically: + +* [The Build CRD](https://github.com/knative/docs/blob/master/build/builds.md) +* [The Eventing APIs](https://github.com/knative/eventing/tree/master/docs/spec) + +_See [examples](./examples) for some examples of how this is intended to work._ + +![Overview of the 5 CRDs](./crds.png) + +The CRDs involved are: + +* [Task](#task) +* [Pipeline](#pipeline) +* [PipelineParams](#pipelineparams) +* [TaskRun](#taskrun) +* [PipelineRun](#pipelinerun) + +High level details of this design: + +* [Pipelines](#pipelines) do not know what will trigger them, they can be + triggered by events or by manually creating [PipelineRuns](#pipelinerun) +* [Tasks](#tasks) can exist and be invoked completely independently of + [pipelines](#pipelines); they are highly cohesive and loosely coupled +* Test results are a first class concept, being able to navigate test results + easily is powerful (e.g. see failures easily, dig into logs, e.g. like + [the Jenkins test analyzer plugin](https://wiki.jenkins.io/display/JENKINS/Test+Results+Analyzer+Plugin)) +* [Tasks](#tasks) can depend on artifacts, output and parameters created by other tasks. + +## Task + +`Task` is a CRD that knows how to instantiate a [Knative Build](https://github.com/knative/build), +either from a series of `steps` (i.e. [Builders](https://github.com/knative/docs/blob/master/build/builder-contract.md)) +or from a [`BuildTemplate`](https://github.com/knative/docs/blob/master/build/build-templates.md). +It takes Knative Build and adds inputs and outputs. Where these inputs and outputs are provided +from is not known to a task, so they can be provided by a Pipeline or by a user invoking a Task directly. + +`Tasks` are basically [knative BuildTemplates](https://github.com/knative/build-templates) +with additional input types and clearly defined outputs. + +## Pipeline + +`Pipeline` describes a graph of [Tasks](#task) to execute. It defines the DAG +and expresses how all inputs (including [PipelineParams](#pipelineparams) and outputs +from previous `Tasks`) feed into each `Task`. It allows for fan in and fan out, and +ordering can be expressed explicitly using `prev` and `next`, or it can be inferred +from a `Task’s` inputs. + +Dependencies between parameters or inputs/outputs are expressed as references to k8s objects. + +## PipelineParams + +`PipelineParams` contains parameters for a [Pipeline](#pipeline). One `Pipeline` +can be invoked with many different instances of `PipelineParams`, which can allow +for scenarios such as running against PRs and against a user’s personal setup. +`PipelineParams` can control: + +* What **sources** the `Pipeline` runs against +* Which **serviceAccount** to use (provided to all tasks) +* What **artifact** stores are used (e.g. Docker registries) +* Where **results** are stored (e.g. in GCS) + +## TaskRun + +Creating a `TaskRun` will invoke a [Task](#task), running all of the steps until completion +or failure. Creating a `TaskRun` will require satisfying all of the input requirements of the +`Task`. + +`TaskRuns` are basically [knative Builds](https://github.com/knative/build) with inputs and +outputs, and in the future we may want to transition `Builds` to become `Tasks`. + +`TaskRuns` can be created directly by a user or by a [PipelineRun](#pipelinerun). + +### TaskRun Status + +Once a `TaskRun` has been created, it will start excuting its steps +sequentially. The `conditions` field will be updated as the `TaskRun` +executes: + +* The `Started` condition will be added when the first step starts. +* The `Completed` condition will be added when the last step completes, + or after a non-zero exit code from a step. +* The `Successful` condition will be added after the `Completed` + condition and will indicate if the run succeeded or failed. + +When the `TaskRun` has completed, the `steps` field will indicate +the exit code of all steps that completed. + +## PipelineRun + +Creating a `PipelineRun` executes the pipeline, creating [TaskRuns](#taskrun) for each task +in the pipeline. + +`PipelineRuns` tie together a [Pipeline](#pipeline) and a [PipelineParam](#pipelineparam). +A `PipelineRun` could be created: + +* By a user manually +* In response to an event (e.g. in response to a Github event, possibly processed via + [knative eventing](https://github.com/knative/eventing)) + +### PipelineRun Status + +Once a `PipelineRun` has been created, it will start excuting the DAG +of its Tasks by creating a [`TaskRun`](#taskrun) for each of them. The +`conditions` field will be updated as the `PipelineRun` +executes: + +* The `Started` condition will be added when the first `TaskRun` is created. +* The `Completed` condition will be added when the last `TaskRun` +completes (or fails). +* The `Successful` condition will be added after the `Completed` + condition and will indicate if the `PipelineRun` succeeded or failed. + +When the `PipelineRun` has completed, the `taskRuns` field will contain +references to all `TaskRuns` which were executed and their next and +previous `TaskRuns`. diff --git a/crds.png b/crds.png new file mode 100644 index 0000000000000000000000000000000000000000..f37eaffb72faf9c03fc0a3272a6859a2ce3bd860 GIT binary patch literal 38224 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

_SFpn5$(p$(0_J>T> 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 + +### Example Runs + +The [runs](./runs/) dir contains an example [TaskRun](../README.md#taskrun) and an example [PipelineRun](../README.md#pipelinerun). + +[run-kritis-test.yaml](./invocations/run-kritis-test.yaml) shows an example of how to manually run kritis unit test off your development branch. + +[kritis-pipeline-run.yaml](./invocations/kritis-pipeline-run.yaml) shows an example of what it would look like to invoke the [kritis example pipeline](#example-pipelines) manually and have it fail on the second task (building and pushing the image). + +## Example Pipelines + +Finally, we have 2 example [Pipelines](../README.md#pipeline) in [./pipelines](./pipelines) + +1. [Kritis](./pipelines/kritis.yaml): This exmaple demonstrates how to configure a pipeline which runs unit test, build an image, deploys it to test and then run integration tests. (This is the pipeline for [kritis](https://github.com/grafeas/kritis).) + +![Pipeline Configuration](./pipelines/kritis-pipeline.png) + +2. [Guestbook](./pipelines/guestbook.yaml): This is pipeline which is based on example application in [Kubernetes example Repo](https://github.com/kubernetes/examples/tree/master/guestbook) +This pipeline demonstartes how to integrate frontend [guestbook app code](https://github.com/kubernetes/examples/tree/master/guestbook-go) with backed [redis-docker image](https://github.com/GoogleCloudPlatform/redis-docker/tree/master/4) provided by GCP. + +![Pipeline Configuration](./pipelines/guestbook-pipeline.png) diff --git a/examples/build_task.yaml b/examples/build_task.yaml new file mode 100644 index 00000000000..8a88a3da4b6 --- /dev/null +++ b/examples/build_task.yaml @@ -0,0 +1,25 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: Task +metadata: + name: build-push + namespace: default +spec: + inputs: + sources: + - name: workspace + params: + - name: pathToDockerFile + type: string + outputs: + artifacts: + - name: builtImage + type: image + storeKey: registry + buildSpec: + template: + name: kaniko + arguments: + - name: DOCKERFILE + value: ${pathToDockerFile} + - name: REGISTRY + value: ${registry} diff --git a/examples/deploy_tasks.yaml b/examples/deploy_tasks.yaml new file mode 100644 index 00000000000..c0261b20a08 --- /dev/null +++ b/examples/deploy_tasks.yaml @@ -0,0 +1,47 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: Task +metadata: + name: deploy-with-helm + namespace: default +spec: + inputs: + sources: + - name: workspace + params: + - name: pathToHelmCharts + type: string + - name: helmArgs + type: string + - name: image + type: string + cluster: + - name: clusterName + buildSpec: + steps: + - name: deploy + image: kubernetes-helm + args: ['deploy', '--path=${pathToHelmChart}', '--set image=${image}', '${helmArgs}'] + +--- +apiVersion: pipeline.knative.dev/v1beta1 +kind: Task +metadata: + name: deploy-with-kubectl + namespace: default +spec: + inputs: + sources: + - name: workspace + type: string + params: + - name: kubectlArgs + type: string + - name: pathToFiles + type: string + cluster: + - name: targetCluster + buildSpec: + steps: + - name: runKubectl + image: k8s-kubectl + args: ['--use-context', '${targetCluster}', '--namespace', '${targetCluster.namespace}', 'apply', '-c', '${pathToFiles}', '${kubectlArgs}'] diff --git a/examples/invocations/kritis-pipeline-run.yaml b/examples/invocations/kritis-pipeline-run.yaml new file mode 100644 index 00000000000..59364a7d763 --- /dev/null +++ b/examples/invocations/kritis-pipeline-run.yaml @@ -0,0 +1,45 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: PipelineRun +metadata: + name: kritis-pipeline-run-12321312984 + namespace: default +spec: + pipelineRef: + name: kritis-pipeline + pipelineParamsRef: + name: pipelineparams-sample + trigger: + triggerRef: + type: manual +# The status section will be filled in by the PipelineRun controller once it +# has started invoking the PipelineRun. +status: + taskRuns: + - taskRef: + name: unit-test-kritis-12321312984 + nextTasks: + - taskRef: + name: push-kritis-12321312984 + prevTasks: [] + - taskRef: + name: push-kritis-12321312984 + nextTasks: [] + prevTasks: + - taskRef: + name: unit-test-kritis-12321312984 + conditions: + - type: Started + status: True + lastTransitionTime: 1534204248 + reason: manualTrigger + message: "Pipeline has been triggered manually" + - type: Completed + status: True + lastTransitionTime: 1535000000 + reason: done + message: "Pipeline execution has finished" + - type: Successful + status: False + lastTransitionTime: 1535000000 + reason: taskFailure + message: "TaskRun `push-kritis-12321312984` had non-zero exit code" \ No newline at end of file diff --git a/examples/invocations/run-kritis-test.yaml b/examples/invocations/run-kritis-test.yaml new file mode 100644 index 00000000000..7c151699822 --- /dev/null +++ b/examples/invocations/run-kritis-test.yaml @@ -0,0 +1,59 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: TaskRun +metadata: + labels: + controller-tools.k8s.io: "1.0" + name: unit-test-kritis-feature-x +spec: + taskRef: + name: make + trigger: + triggerRef: + type: manual + inputs: + sources: + - name: 'kritis' + type: 'github' + url: 'github.com/grafeas/kritis' + branch: 'featureX' + commit: 'HEAD' + params: + - name: 'makeTarget' + type: 'string' + value: 'test' + results: + runs: + - name: 'runsBucket' + type: 'gcs' + url: 'gcs://somebucket/results/runs' + logs: + - name: 'logBucket' + type: 'gcs' + url: 'gcs://somebucket/results/logs' + tests: + - name: 'testBucket' + type: 'gcs' + url: 'gcs://somebucket/results/tests' +# The status section will be filled in by the TaskRun controller once it +# has started invoking the TaskRun. +status: + steps: + - name: make + logsURL: 'gcs://somebucket/results/tests/unit-test-kritis-feature-x/make' + exitCode: 0 + conditions: + - type: Started + status: True + lastTransitionTime: 1534204250 + reason: pipelineRun + message: "Task has been triggered by a Pipeline run" + - type: Completed + status: True + lastTransitionTime: 1534250000 + reason: done + message: "Pipeline execution has finished" + - type: Successful + status: True + lastTransitionTime: 1534250000 + reason: zeroExitCode + message: "All steps completed with an exit code of 0" diff --git a/examples/pipelineparams.yaml b/examples/pipelineparams.yaml new file mode 100644 index 00000000000..7cd02b964e7 --- /dev/null +++ b/examples/pipelineparams.yaml @@ -0,0 +1,55 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: PipelineParams +metadata: + name: pipelineparams-sample + namespace: default +spec: + serviceAccount: 'demoServiceAccount' + sources: + - name: 'guestbook' + type: 'github' + url: 'github.com/kubernetes/examples' + serviceAccount: 'githubServiceAccount' + branch: 'master' + commit: 'HEAD' + - name: 'redis-docker' + type: 'github' + url: 'github.com/GoogleCloudPlatform/redis-docker/blob/master/4/debian9/4.0/Dockerfile' + serviceAccount: 'githubServiceAccount' + branch: 'master' + commit: 'HEAD' + - name: 'kritis' + type: 'github' + url: 'github.com/grafeas/kritis' + branch: 'master' + commit: 'HEAD' + artifactStores: + - name: 'prodRegistry' + type: 'imageRegistry' + url: 'gcr.io/demo' + - name: 'stagingRegistry' + type: 'imageRegistry' + url: 'gcr.io/demo-staging' + clusters: + - name: 'testCluster' + type: 'gke' + endpoint: 'https://prod.gke.corp.com' + - name: 'stagingCluster' + type: 'gke' + endpoint: 'https://staging.gke.corp.com' + results: + runs: + - name: 'runsBucket' + type: 'gcs' + url: 'gcs://somebucket/results/runs' + token: 'todo' + logs: + - name: 'logBucket' + type: 'gcs' + url: 'gcs://somebucket/results/logs' + token: 'todo' + tests: + - name: 'testBucket' + type: 'gcs' + url: 'gcs://somebucket/results/tests' + token: 'todo' diff --git a/examples/pipelines/guestbook-pipeline.png b/examples/pipelines/guestbook-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..b4459a915bb6d45d904b21704f77f4b4dcab521f GIT binary patch literal 31630 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 U-iEK)#=(()sQ94Z{%fEA0`S#-J^%m! literal 0 HcmV?d00001 diff --git a/examples/pipelines/guestbook.yaml b/examples/pipelines/guestbook.yaml new file mode 100644 index 00000000000..2a3b5087375 --- /dev/null +++ b/examples/pipelines/guestbook.yaml @@ -0,0 +1,83 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: Pipeline +metadata: + name: guestbook-example + namespace: default +spec: + tasks: + - name: build-guestbook # 1.a Build guestbook go sample code. + taskRef: + name: build-push + sourceBindings: + - inputName: workspace + sourceKey: guestbook + artifactStoreBindings: + - storeName: registry + storeKey: stagingRegistry + builtImage: gb-frontend # TODO Add Commit SHA + params: + - name: pathToDockerfile + value: guestbook-go/Dockerfile + - name: build-redis # 1.b Build and push redis docker image. + taskRef: + name: build-push + sourceBindings: + - inputName: workspace + sourceKey: redis-docker # TODO Add Commit SHA + artifactStoreBindings: + - storeName: registry + storeKey: stagingRegistry + builtImage: redis4 + params: + - name: pathToDockerfile + value: 4/debian9/4.0/Dockerfile + - name: deploy-bundle-test # 2. Deploy GuestBook and Redis to test cluster + taskRef: + name: deploy-with-kubectl + sourceBindings: + - inputName: workspace + sourceKey: guestbook + params: + - name: pathToFiles + value: guestbook/all-in-one/guestbook-all-in-one.yaml + clusterBindings: + - clusterName: test + prevTasks: + - build-redis4 + - build-guestbook + - name: int-test-osx # 3.a Run Integration tests for osx + taskRef: + name: integrationTestInDocker + sourceBindings: + - inputName: workspace + sourceKey: guestbook + params: + - name: dockerBuildFile + value: guestbook-int/Dockerfile + prevTasks: + - deploy-test + - name: int-test-linux # 3.b Run Integration tests for linux + taskRef: + name: integration-test-in-docker + sourceBindings: + - inputName: workspace + sourceKey: guestbook + params: + - name: dockerBuildFile + value: guestbook-int/Dockerfile + prevTasks: + - deploy-test + - name: deploy-bundle-staging # 4. Deploy GuestBook and Redis to staging cluster + taskRef: + name: deploy-with-kubectl + sourceBindings: + - inputName: workspace + sourceKey: guestbook + params: + - name: pathToFiles + value: guestbook/all-in-one/guestbook-all-in-one.yaml + clusterBindings: + - clusterName: staging + prevTasks: + - int-test-osx + - int-test-linux diff --git a/examples/pipelines/kritis-pipeline.png b/examples/pipelines/kritis-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..b85359496c1417281ae4a184b32714284e74491c GIT binary patch literal 33933 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 G!2btY|5eWb literal 0 HcmV?d00001 diff --git a/examples/pipelines/kritis.yaml b/examples/pipelines/kritis.yaml new file mode 100644 index 00000000000..dbed6c603c5 --- /dev/null +++ b/examples/pipelines/kritis.yaml @@ -0,0 +1,55 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: Pipeline +metadata: + name: kritis-pipeline + namespace: default +spec: + tasks: + - name: unit-test-kritis # 1. Run unit Tests + taskRef: + name: make + sourceBindings: + - inputName: workspace + sourceKey: kritis + params: + - name: makeTarget + value: test + - name: push-kritis # 2. Build And Push Tests + taskRef: + name: build-push + sourceBindings: + - inputName: workspace + sourceKey: kritis + artifactStoreBindings: + - storeName: registry + storeKey: stagingRegistry + builtImage: kritis # TODO Add Commit SHA + params: + - name: pathToDockerfile + value: deploy/Dockerfile + prevTasks: ['unit-test-kritis'] + - name: deploy-test-env # 3. Finally Deploy to Test environment + taskRef: + name: deploy-with-helm + sourceBindings: + - inputName: workspace + sourceKey: kritis + paramBindings: # Implicit dependency on buildPush task. + - inputName: testImage + taskName: buildPush + taskOutputName: builtImage + params: + - name: pathToHelmCharts + value: kritis-charts + clusterBindings: + - clusterName: test + nextTasks: ['integration-test'] + - name: integration-test # 4. Run Integration Tests in test cluster + taskRef: + name: integration-test-in-docker + sourceBindings: + - inputName: workspace + sourceKey: kritis + params: + - name: testArgs + value: "-e REMOTE_INTEGRATION=true" diff --git a/examples/test_tasks.yaml b/examples/test_tasks.yaml new file mode 100644 index 00000000000..93d834c9f63 --- /dev/null +++ b/examples/test_tasks.yaml @@ -0,0 +1,59 @@ +apiVersion: pipeline.knative.dev/v1beta1 +kind: Task +metadata: + name: make + namespace: default +spec: + inputs: + sources: + - name: workspace + params: + - name: makeTarget + type: string + outputs: + results: + - name: testResults + format: junit + path: logs/tests.xml + buildSpec: + steps: + - name: runMake + image: ubuntu + args: ['make', '${makeTarget}'] + +--- +apiVersion: pipeline.knative.dev/v1beta1 +kind: Task +metadata: + name: integration-test-in-docker + namespace: default +spec: + inputs: + sources: + - name: workspace + params: + - name: testImage + type: string + - name: testArgs + type: string + outputs: + results: + - name: testResults + format: junit + path: integration/logs/tests.xml + buildSpec: + steps: + - name: runTests + image: '${testImage}' + args: ['${testArgs}'] + volumes: + - name: gac + source: ${workspace}/config/gac.json + destination: gac.json + - name: cloudconfig + source: ${workspace}/config/gcloud + destination: /root/.config/gcloud + - name: dockerSocket + source: /var/run/docker.sock + destination: /var/run/docker.sock +