-
Notifications
You must be signed in to change notification settings - Fork 221
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TEP 0002: Custom Tasks #128
Conversation
Prototype code going on here: https://github.com/tektoncd/pipeline/compare/master...ImJasonH:run?expand=1 This will be split up and proposed as separate PRs after this TEP is accepted. |
|
||
Supporting cancellation is optional but recommended. | ||
|
||
### Timeout |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel like another thing we need to plumb through in general is identity e.g. serviceAccountName
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's one we'd need to plumb through for any Custom Task that intends to end up running Pod-based workflows (e.g., MatrixTask, GroupTask), but not the general case.
In the meantime a MatrixTask config can specify and use serviceAccountName
and it just won't be overrideable from a Pipeline. Perhaps it should just be a param? (e.g., serviceAccountName: $(params.serviceAccountName)
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is a usability issue. Users now have to maintain the service account name setting in multiple places (the existing PR serviceAccountName keys and now separate task parameters which could be custom-task specific). People will question why the pipelinerun's configured service account name can't just be passed down.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we have a specific header serviceAccount
and related subject then ? 🙃
|
||
### CLI and Dashboard Support | ||
|
||
At the very least, the `tkn` CLI and Tekton Dashboard should have some way to display basic information about Custom Tasks, even if it's just a dump of the YAML. Solving a complete holistic plugin model for Go binaries and web front-ends expands the scope of this work too broadly, but at least providing Custom Task authors some basic support in Tekton's native tooling is better than nothing. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about a run
subcommand for listing runs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BTW the bit about surfacing the children runs
was thinking forward to tkn run logs
for Pipeline/Task/Matrix/Custom/...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Blegh, I kind of just don't want to think about CLI support at all, let alone plumbing through tkn logs
support, which would insinuate some way to tell the CLI that you do end up running Pods. Blegh.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is why I tagged @n3wscott elsewhere, since he's trying to motivate custom subresources in K8s and /logs
is one that I believe has come up.
b8ebf5b
to
e157b10
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for this, it's looking good!
I've not finished the review yet, but I wanted to share feedback so far.
|
||
## Requirements | ||
|
||
* Add a new CRD type, `Run`, which will be instantiated when a `Pipeline` is run that contains `taskRef`s which have an `apiVersion` that is not `tekton.dev/*` -- `taskRefs` that reference `Task`s and `ClusterTask`s (the only valid values today) will be unaffected. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It doesn't seem to me that how custom tasks are identified in a pipeline is a requirement per se, more a design decision or implementation detail - or is there a special reason you wanted to call that out specifically here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I think I just didn't know what to put as a "requirement" -- there isn't really any other work that needs to be done that blocks this work, so maybe there are no "requirements"?
If "requirements" means "things that must be done before this TEP is considered 'complete'", then I think how it integrates with Pipelines is in-scope, that's all I was trying to say.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
at a high level, we're proposing something to solve a problem. i think we're using the goals section to capture what problem we're solving in general. requirements are constraints on how the problem needs to be solved, e.g. something like "requests must not take > 500 ms to respond" or "it must be possible to do this with by running one command"
for something like this it might be things like (mostly just making things up, dont feel like you have to use thes)
- adding support for new custom tasks must not require changes to the tekton pipelines controller
- it must be possible to release custom tasks completely separately from tekton pipelines
- it must be possible to use something other than a kubernetes controller to realize custom tasks
i think some of the things you listed here work, like providing docs, samples, helper functions + template repo, you could reword that if you wanted into something like "someone who wants to implement their own custom task controller has the xyz that they need to get started"
i agree that the CRD type part is more of an implementation detail
message: Oh no bad times | ||
``` | ||
|
||
The `Run` type's `.status` will also allow controllers to report other fields, such as `startTime`, `completionTime`, `results` (see below), and arbitrary context-dependent fields the Custom Task author wants to report. A fully-specified `Run` status might look like: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same for the dashboard. It would be really useful for custom tasks to be able to expose their logs with no extra work on CLI/dashboard.
|
||
### Cancellation | ||
|
||
To support cancellation of `Run`s, when a `PipelineRun` is cancelled, the `PipelineRun` controller will attempt to update any ongoing `Run`s' `.spec.status` to `"Cancelled"`, and update `.status.conditions` to signal unsuccessful execution. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this mean that the PipelineRun
controller will set a condition on he Run
resource?
I think setting Cancelled
to the spec should be enough, and it would be responsibility of the custom task controller to set the condition accordingly.
What will be the behaviour in case of cancellation not supported or delayed or failed for the custom task?
The implementation for TaskRun
is quite optimistic: we apply the patch to the spec of all TaskRuns
. If that goes well we assume everything is done and set the completion time.
I wonder if we should wait for the TaskRun
to actually report that they stopped running - and similarly for custom tasks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same question as @afrittoli, updating the .status.conditions
is the "custom task" controller reponsaility isn't it ?
I think it comes from the fact that this cancellation support would be optional. How can a Custom Task give that information ("I support cancellation", or "I do not support cancellation") to the controller ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a bit tricky. If a custom task controller doesn't handle cancellation (i.e., doesn't respond in any way when .spec.status
is set to Cancelled
), then the PipelineRun should Do The Right Thing, which I think is to set all sub-task .status
es to conditions[@type=Succeeded].status=False
and reason:RunCancelled
.
Maybe we could specify that PipelineRun controller is responsible for all of this, and custom task authors can optionally detect that case and propagate cancellation however that makes sense for them, or we can say that the PipelineRun controller will set .spec.status=Cancelled
and then wait to see if anything responds, and then force-cancel the Run? That's sort of how initial update timeout would work, but that means more complex logic in the PipelineRun controller and more nodes on the state diagram -- what happens if the PipelineRun controller restarts while it's waiting to see if a cancellation has been acted upon? Gross.
Ideas welcome. I don't think this specific question should block overall approval of the proposal though, since it only affects a fairly narrow interaction between Run
s and PipelineRun
s.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, we can get this TEP in with still some element to be discussed 😉
|
||
Today, users can specify a timeout for a component `Task` of a `Pipeline` (see [`PipelineTask.Timeout`](https://godoc.org/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1#PipelineTask)). The `Run` type will specify a `Timeout` field to hold this value when created as part of a `PipelineRun` (or when `Run`s are created directly). Custom Task authors can read and propagate this field if desired, but a Tekton-owned controller will be responsible for tracking this timeout and updating timed out `Run`s to signal unsuccessful execution. | ||
|
||
A Custom Task author can watch for this status update and take any corresponding actions (e.g., cancel a cloud build, stop the waiting timer, tear down the approval listener). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to the cancel
case, I think that the custom controller should be the sole responsible to write the "Succeeded" condition of the custom task. The pipeline run controller should have a mechanism to tell the custom task controller to stop the execution of a custom task.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a reasonable stance. How would you like the PipelineRun controller to signal that to custom task controllers? Just treat timeout as a type of cancellation? Set .spec.status=TimedOut
and handle that differently?
Is there any situation where a custom task controller would care to know that it was cancelled due to timeout specifically? 🤔
|
||
In order to test correct handling of Custom Tasks in the PipelineRun controller, simple e2e tests could install a simple Wait type and controller (**only used for testing**), and assert that a Pipeline that references that Wait type runs component Tasks with some approriate period of time between them. | ||
|
||
Other future experimental types and controllers (e.g., in `tektoncd/experimental`) should be accompanied by unit tests and e2e tests along the same lines. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will images be published for the controllers is tektoncd/experimental? I'm not sure how that process would work, i.e. would it have releases?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's up to the custom task author. If they're in tektoncd/experimental
there's probably a higher bar of support than if it's just a random personal repo on GitHub, especially because that repo already has Prow set up.
For now I've been envisioning myself writing most custom task controllers in my own repos, just to avoid having to find someone else to review them as required by tektoncd/experimental
😈
|
||
1. Provide any Custom Task implementations as "official" or "first-party" | ||
integrations. Some may be added in a future change, but for now the goal | ||
is just to support _any_ third-party integrations, and let the user install them themselves, or let distributors provide them if they prefer to. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you saying that you don't want "official" custom tasks built on top of this support in the near future by anybody, or just in the scope of this TEP? I ask because I've been looking at implementing task looping using custom tasks and @jerop is looking at implementing conditions using custom tasks. I would expect those items be assessed by the community on their own as to whether they should be official or experimental -- unless you are stating a position that it's premature to implement any custom tasks officially?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@GregDritschler only as part of this TEP. This TEP focuses on adding support for custom tasks. Doesn't mean, we won't ship built-in custom task, … but it would need another TEP (aka the idea is to create focus TEP).
So it's not premature to implement any custom task officially, but it's not in the scope of this particular TEP.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@GregDritschler what @vdemeester said. This TEP should only cover being able to write a custom task, and not expand to include any official custom tasks.
I can definitely see a future where the tektoncd/pipeline
repo includes some custom task controllers for commonly requested features, maintained and supported by Tekton contributors. But, in the future a Tekton platform/distribution (e.g., Openshift Pipelines) might decide not to install some that they don't need, or install their own versions, or install new ones by default, etc. -- that's up to them.
Anyway that we can vote on that ? And we accept the drawback as we already have some specific CRD |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@imjasonh nice TEP 😍
Few comments and questions.
I also think the TEP would benefit from a little bit more examples (maybe in User Stories) based on what is in the initial design doc 👼 🙏
|
||
1. Provide any Custom Task implementations as "official" or "first-party" | ||
integrations. Some may be added in a future change, but for now the goal | ||
is just to support _any_ third-party integrations, and let the user install them themselves, or let distributors provide them if they prefer to. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@GregDritschler only as part of this TEP. This TEP focuses on adding support for custom tasks. Doesn't mean, we won't ship built-in custom task, … but it would need another TEP (aka the idea is to create focus TEP).
So it's not premature to implement any custom task officially, but it's not in the scope of this particular TEP.
|
||
This references an `Example` CRD type defined by the custom task author, an instance of which is named `my-example`. | ||
|
||
When a `Run` object is created, Tekton will validate that the `ref` is specified, and that the specified CRD type is defined, using webhook validation. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit/impl. detail: this means the validation webhook will need to "discuss" with the k8s api right ? (which it does not as of today)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, true. I don't actually feel strongly that the ref is validated synchonously. The custom task controller will reconcile it to failure soon after.
|
||
Supporting cancellation is optional but recommended. | ||
|
||
### Timeout |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we have a specific header serviceAccount
and related subject then ? 🙃
|
||
A Custom Task author can watch for this status update and take any corresponding actions (e.g., cancel a cloud build, stop the waiting timer, tear down the approval listener). | ||
|
||
Supporting timeouts is optional but recommended. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we are covering for cases where the Custom Task should inhibit the default / set timeout on a PipelineRun. The approval case is one such example, we may want to inhibit the timeout of the execution (which is 1h by default), to let approvers time to do their thing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a good point. I'm not sure whether a person specifying a Pipeline-wide timeout of 24h
would expect time spent waiting for approval to count toward that time or not. On the one hand, I might want my Pipeline to always be guaranteed to finish today. On the other hand, it means I can grant approval .1s before the Pipeline's timeout elapses, which isn't terribly helpful. I guess that could already happen either way 🤔
|
||
Under this proposal, the user could fork a template GitHub repo, define a type describing their intended behavior, and implement a controller that performs that behavior. In this example, the controller would react to creations of `Run<Approval>` objects by setting up a service that listens for approval events, and updates the `Run`'s `.status` to signal that the pipeline should proceed. | ||
|
||
Other users who want to use this approval mechanism in their own pipelines could install the task author's type and controller to get the same behavior. The task author could release and distribute their controller using the Tekton [catalog](https://github.com/tektoncd/catalog) and/or (someday) Tekton Hub, or their own GitHub repo. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't though of that, very interesting thought
/cc @sthaha
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm excited! I have an alternative that id like to include in the alternatives section but I approve of this overall and want to go ahead.
I was initially skeptical about Runs but after talking with @imjasonh im convinced that Runs (vs instantiating arbitrary custom CRDs directly) has the advantage of nicely reducing and simplifying the responsibilities of the tekton controller itself. You can still do whatever crazy stuff you want to do, but you have to do it in your own controller.
* enable looping execution of sub-Tasks -- e.g., express that a Task should be repeatedly run until some state is reached (signalled at run-time) | ||
* ...and in general, support a model where integrators can implement their own execution types without modifying Tekton Pipelines code directly | ||
|
||
This mechanism can also be used by Tekton core contributors to prototype and experiment with new execution modes, even other forms of Pod-based Tasks, before possibly integrating that functionality into Tekton Pipelines directly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎉
|
||
## Requirements | ||
|
||
* Add a new CRD type, `Run`, which will be instantiated when a `Pipeline` is run that contains `taskRef`s which have an `apiVersion` that is not `tekton.dev/*` -- `taskRefs` that reference `Task`s and `ClusterTask`s (the only valid values today) will be unaffected. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
at a high level, we're proposing something to solve a problem. i think we're using the goals section to capture what problem we're solving in general. requirements are constraints on how the problem needs to be solved, e.g. something like "requests must not take > 500 ms to respond" or "it must be possible to do this with by running one command"
for something like this it might be things like (mostly just making things up, dont feel like you have to use thes)
- adding support for new custom tasks must not require changes to the tekton pipelines controller
- it must be possible to release custom tasks completely separately from tekton pipelines
- it must be possible to use something other than a kubernetes controller to realize custom tasks
i think some of the things you listed here work, like providing docs, samples, helper functions + template repo, you could reword that if you wanted into something like "someone who wants to implement their own custom task controller has the xyz that they need to get started"
i agree that the CRD type part is more of an implementation detail
|
||
### Parameter Passing | ||
|
||
Custom Task authors should support parameter passing, by supporting a `.spec.params` field (of type [`[]Param`](https://godoc.org/github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1#Param)), and by resolving any `$(params.foo)` placeholders in the CRD type when a `Run` of that type is first reconciled -- this functionality should be implemented by a Go package provided by Tekton, which should be the same one that Tekton itself uses when resolving placeholders in `TaskRun`s and `PipelineRun`s. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sounds like it could make sense to have a repo that is dedicated to code that makes it easier to write these custom task controllers - instead of calling it something generic like pkg
, maybe we could call it controller
or even customtask
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@imjasonh i added some suggested edits to try to capture what we discussed!
1. Provide first-party support for things like long waits, approvals, Pipelines-in-Pipelines, in an ad-hoc tightly-coupled manner. This requires these integrations to be implemented "in-tree", by Tekton contributors, which could harm team velocity and focus. By exposing a plug-in mechanism, the community is more fully enabled to experiment and contribute to the ecosystem. | ||
|
||
1. As in previous iterations of this design (documented more fully in the Google Doc), require implementors to define and support two CRD types, instead of one. See the doc for full explanation of the trade-offs. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1. Allow users to instantiate arbitrary kubernetes objects by providing their entire content inline. In this approach, users would be create instances of their own custom CRDs, e.g. `CELRun`, by providing the entire body inline, much like [triggertemplates](https://github.com/tektoncd/triggers/blob/master/docs/triggertemplates.md). | |
* pros: ultimiate flexibility | |
* cons: requires the tekton pipelines controller to be able to create and monitor arbitrary objects. it would need to have additional permissions to create these types, and it wouldn't be able to tell until after it instantiated the types if the type actually compiled with the required interface (i.e. [status reporting](#status-reporting)). Out of the box this would mean a user could try to instantiate a pod in a pipeline (the controller would have permissions to do this). Keeping these responsibilities in a separate controller reduced the existing controller's responsibilities. Arbitrary types will still be reported, but they must be created by the custom controller. |
|
||
When a `Run` object is created, Tekton will validate that the `ref` is specified, and that the specified CRD type is defined, using webhook validation. | ||
|
||
After that, Tekton Pipelines expects a custom task author to implement a controller for `Run` objects that reference their type (annotated throughout this proposal with the shorthand `Run<Example>`) to take some action, and eventually update its `.status` to signal completion, either successfully or unsuccessfully, using the `conditions` model used by Tekton PipelineRuns and TaskRuns. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After that, Tekton Pipelines expects a custom task author to implement a controller for `Run` objects that reference their type (annotated throughout this proposal with the shorthand `Run<Example>`) to take some action, and eventually update its `.status` to signal completion, either successfully or unsuccessfully, using the `conditions` model used by Tekton PipelineRuns and TaskRuns. | |
After that, Tekton Pipelines expects a custom task author to implement a controller for `Run` objects that reference their type (annotated throughout this proposal with the shorthand `Run<Example>`) to take some action, and eventually update its `.status` to signal completion, either successfully or unsuccessfully, using the `conditions` model used by Tekton PipelineRuns and TaskRuns. | |
Adding a new Tekton supported type (`Run`) and requiring the author to create a custom controller provides a useful division of responsibilities: | |
* The existing Tekton controller will only need to know how to instantiate and monitor `Run` objects. It will need no additional privileges or client libraries. | |
* In the custom controller, the author has the flexibility to do whatever they need to do - any privileges or dependencies required to do this are restricted to the custom controller only | |
This gives custom task authors complete flexibility without significantly increasing the scope of the existing Tekton controller's responsibilities and permissions. |
taskRef: | ||
apiVersion: example.dev/v0 | ||
kind: Example | ||
name: my-example |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@imjasonh and i were talking about a situation where there is no type to refer to, for example say i want to make a custom controller that evaluates CEL expressions, but I don't need a CEL CRD type to refer to - all I really need is for a run to be created with a param with the expression (not saying this is the final design, just a possibility for this feature or any other). in that case i need to indicate in the Run what type of thing we're running so my controller can filter for it, but there is no instance to refer to
@imjasonh suggested we could do this by making "name" an optional field
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@imjasonh i tried to think of syntax tweaks and i have nothing super compelling but here are my thoughts:
- it's interesting in the definition of an instance of a type, that apiversion and kind are at a different level than name, which is a field of metadata, maybe we could separate them also somehow:
apiVersion: tekton.dev/v1beta1
kind: ClusterTask
metadata:
name: clustertask-v1beta1
-
instead of overloading taskRef, adding a new section called
run
which is used when a Run is supposed to be created, makes me less confused. but it pretty much has the same fields astaskRef
and defeats the whole purpose of includingkind
in there in the first place -
instead of a
ref
section inRun
maybe these values could be top level fields
anyway none of these ideas are great, feel free to ignore them
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Our TaskRef
type is based on corev1.ObjectReference
(and possibly should just reuse that type directly?). I think adding/indenting metadata
is just more verbose and makes it seem like you're about to define a whole object, when it's just a reference.
Re (3), it's currently stuffed into ref
to allow the possibility to add a sibling field that's the full custom task spec in the future. I agree it looks sort of unnecessary now, hopefully it won't be lonely for long 😄
Making name
not required sounds fine by me, I think I need to think/experiment more with a CELTask
specifically to see how that looks. 🤔
Re: helper package: I had been envisioning them going in
I do think we should add a new GitHub template repo to hold a sample Custom Task controller, like I just really don't want to end up supporting something like |
Sounds great to me!
💯 i like the idea of having shared code that is used among projects but what I really don't like about knative/pkg is that everything is thrown together into a grab bag; but the fact is that by separating the code out into its own repo, you're making it so that changes to code in that repo have implications to all the projects that depend on them. given that i think it's important that when we do this, we start treating the shared code the way we do code that is relied on by external projects: single responsibility, well documented, versioned projects with clear release processes and compatibility guarantees |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can merge it as is, aka proposed
and take the nitty/gritty detail in a follow-up PR to make it implementable
(and be able to merge things in projects)
/cc @afrittoli
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: vdemeester The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
Looks like we can merge this with proposed status! And it feels like we're on the cusp of going from proposed to approved? /lgtm |
…g in the repo (tektoncd#128) Signed-off-by: cpanato <[email protected]> Signed-off-by: cpanato <[email protected]>
Relates to: tektoncd#128 Signed-off-by: Luke Hinds <[email protected]>
Based on the Google Doc, now with 1000% more Markdown! 😄
Rendered here
/assign @bobcatfish
/assign @vdemeester
/assign @afrittoli
/cc @jlpettersson @mattmoor @n3wscott