Skip to content
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

Add support for taskRun to expose digest of built images #721

Merged
merged 6 commits into from
May 21, 2019

Conversation

nader-ziada
Copy link
Member

Changes

Part of #216 - once we agree on the digest part, I can add the image validation in this or another PR

  • This features requires the builder used to build the image to export
    an oci standard layout file index.json
    https://github.com/opencontainers/image-spec/blob/master/image-layout.md
  • If the index.json file is not present, the digest will not be
    exposed in the taskRun
  • add a field in the image resource to indicate the location of the
    index.json file -> indexpath
  • add a field in the taskRun status to include the image name and
    digest -> resourcesResult
  • add a container step to collect the digest from all the files
  • the taskRun controller will collect the output from the
    image-digest-exporter container and update the taskRun status

Submitter Checklist

These are the criteria that every PR should meet, please check them off as you
review them:

See the contribution guide
for more details.

Release Notes

If an taskRun produces a container image with `index.json` file with the oci standard layout format, the digest of this built image will be exported in the taskRun status under resourcesResult

@googlebot googlebot added the cla: yes Trying to make the CLA bot happy with ppl from different companies work on one commit label Apr 4, 2019
@tekton-robot tekton-robot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Apr 4, 2019
@nader-ziada
Copy link
Member Author

/test pull-tekton-pipeline-integration-tests

@nader-ziada
Copy link
Member Author

@bobcatfish the YAML tests are failing because getting latest from github.com/GoogleContainerTools/skaffold and running the unit tests fails, seems a problem upstream. This happens in the pipeline: https://github.com/tektoncd/pipeline/blob/master/examples/pipelineruns/pipelinerun.yaml

@nader-ziada
Copy link
Member Author

/test pull-tekton-pipeline-integration-tests

@nader-ziada
Copy link
Member Author

/test pull-tekton-pipeline-integration-tests

@imjasonh
Copy link
Member

imjasonh commented Apr 9, 2019

So after each step we'll inject a container that checks for contents in indexpath, and if it sees that, it will write it to its logs, where the controller will read from and parse accordingly. Is that correct?

A requested step like this:

- image: gcr.io/kaniko-project/executor
  args: ['--destination', 'gcr.io/foo/bar']

will end up as a pair of containers:

- image: gcr.io/kaniko-project/executor
  args: ['--destination', 'gcr.io/foo/bar']
- image: our-exporter
  args: ['--images=[...json...]'] # places to look for indexes

This requires the task author to know where the builder will write its index.json, and requires the controller to request 2 containers for every container the user requested. It would require the controller to link those two pods with all the volume mounts specifed in the initial container too, right?


I wonder if we can (ab)use termination message paths to specify a path in original container where it should write output data, then this will be directly available via the pod's status, without having to inject more containers or parse container logs.

This frees us from having to inject containers after each step, and from having to scrape logs, which might become brittle. It also means the controller tells the builder where it expects to read logs, rather than requiring the task author to know where the builder typically writes logs.

So a step defined as:

- image: gcr.io/kaniko-project/executor
  args: ['--destination', 'gcr.io/foo/bar']

will end up as a pod container like:

- image: gcr.io/kaniko-project/executor
  args: ['--destination', 'gcr.io/foo/bar']
  terminationMessagePath: '/tmp/r4nd0ms7r1ng'
  env:
  - name: BUILDER_OUTPUT
    value: /tmp/r4nd0ms7r1ng

If the builder sees that $BUILDER_OUTPUT is set, it will write to that path, and it will be bubbled up to the controller watching the pod via automatically-collected termination message. That path doesn't have to persist past the context of that single container.


One downside: docs for termination messages says:

The log output is limited to 2048 bytes or 80 lines, whichever is smaller.

Though elsewhere it says:

Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log.

It might be possible to increase this limitation, or we might need to compress output or strip out unnecessary fields, or else risk only collecting partial data.


Am I understanding your approach correctly? Let me know if you'd prefer to chat over video, either at the next WG or ad-hoc. Sorry it's taken me so long to review this.

@nader-ziada
Copy link
Member Author

@imjasonh
There will be only one container added at the end of the task to collect all the info from all the steps and add it to log output, the controller will loop on all of files and add them to the the taskRun output.

I added a field for the indexpath location in the resource, so users can specify where the builder they are using will output this file.

I thought about using the termination messages but was worried it would be considered the wrong usage.

Copy link
Collaborator

@bobcatfish bobcatfish left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work, I'm very excited about this functionality @nader-ziada !! 🎉 ❤️ 🎉

I left some miscellaneous feedback but it sounds like you and @imjasonh have a solid design in general!

My only question, and if this is something you're planning to address in a future iteration which is totally cool, but it's not clear to me how the pipelinerun controller is going to take the digest of the built image and make it available for downstream tasks (which can be using it in their templating e.g. "${inputs.resources.image.url}@${inputs.resources.image.digest}") ?

docs/resources.md Show resolved Hide resolved
cmd/imagedigestexporter/main.go Show resolved Hide resolved
ii, err := layout.ImageIndexFromPath(imageResource.IndexPath)
if err != nil {
// if this image doesn't have a builder that supports index.josn file,
// then it will be skipped
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe log something in this case?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bumping this! :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't want to log something here because the controller will be trying to parse the output of that container, also because not all builder will support this, I want it to be optional without errors.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hm okay :( too bad it looks like you couldn't have the controller only grab only stdout :(

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me give that a try :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bobcatfish as far as I understand you have to attach to the pod to get the Stdout only, which would not work if the pod is completed. I think the get logs would be a safer bet in that case, wdyt?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand the issue with using log here, however silently skipping the image if the builder is not supported will make things easier to troubleshoot. You may also have the case of a supported image builder which is malfunctioning in a specific case and not producing the index.json.

Would it be an option to use the digest field itself to output a standard string e.g. "builder did not produce index.json" or so?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the controller could be aware of that error and not try to parse if it sees the error?

cmd/imagedigestexporter/main.go Show resolved Hide resolved
pkg/apis/pipeline/v1alpha1/image_resource.go Outdated Show resolved Hide resolved
pkg/reconciler/v1alpha1/taskrun/taskrun.go Show resolved Hide resolved
pkg/reconciler/v1alpha1/taskrun/taskrun.go Outdated Show resolved Hide resolved
nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request Apr 25, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
@nader-ziada
Copy link
Member Author

/hold

pushed some changes but still work in progress

@tekton-robot tekton-robot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Apr 25, 2019
nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request Apr 26, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request Apr 29, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests
@nader-ziada
Copy link
Member Author

/hold cancel

@tekton-robot tekton-robot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Apr 29, 2019
@nader-ziada
Copy link
Member Author

@bobcatfish @imjasonh ready for another look,

I made the following changes:

  • Run the image digest exporter after each step
  • Move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
  • Rename indexpath to outputimagepath
  • Add example yaml
  • Refactor image exporter code and add more unit tests
  • Add more documentation

nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request Apr 29, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests

Signed-off-by: Nader Ziada <nziada@pivotal.io>
@imjasonh imjasonh mentioned this pull request May 3, 2019
2 tasks
nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request May 6, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests

Signed-off-by: Nader Ziada <nziada@pivotal.io>
Copy link
Collaborator

@bobcatfish bobcatfish left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left a bunch of miscellaneous comments, generally looking great tho and the approach is solid imo!

/approve
/meow space

docs/resources.md Outdated Show resolved Hide resolved
docs/resources.md Outdated Show resolved Hide resolved
docs/resources.md Outdated Show resolved Hide resolved
docs/resources.md Show resolved Hide resolved
examples/taskruns/task-output-image.yaml Outdated Show resolved Hide resolved
pkg/reconciler/v1alpha1/taskrun/taskrun.go Show resolved Hide resolved
cmd/imagedigestexporter/main.go Show resolved Hide resolved
cmd/imagedigestexporter/main.go Outdated Show resolved Hide resolved
@tekton-robot
Copy link
Collaborator

@bobcatfish: cat image

In response to this:

I left a bunch of miscellaneous comments, generally looking great tho and the approach is solid imo!

/approve
/meow space

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

nader-ziada added a commit to nader-ziada/pipeline that referenced this pull request May 9, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests

Signed-off-by: Nader Ziada <nziada@pivotal.io>
Copy link
Collaborator

@bobcatfish bobcatfish left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bit more feedback! Interface looks great, just wondering about /tools/output-image.

I looked at the tests in a bit more detail, wondering if we can break up the AddOutputImageDigestExporter function a bit.

ii, err := layout.ImageIndexFromPath(imageResource.IndexPath)
if err != nil {
// if this image doesn't have a builder that supports index.josn file,
// then it will be skipped
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bumping this! :)

docs/resources.md Outdated Show resolved Hide resolved
pkg/apis/pipeline/v1alpha1/image_resource.go Show resolved Hide resolved
pkg/apis/pipeline/v1alpha1/resource_types.go Show resolved Hide resolved
Args: []string{"-images", fmt.Sprintf("[{\"name\":\"source-image-1\",\"type\":\"image\",\"url\":\"gcr.io/some-image-1\",\"digest\":\"\",\"OutputImageDir\":\"%s\"}]", currentDir)},
}},
}, {
desc: "image resource in task with multiple steps",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'm trying to understand the difference between the two cases in this test and it seems like:

  • both have a resource that is used as an input AND and output
  • one has 1 step, the other has 2

I think there might be some more cases we'd want to test, like:

  • output resource only
  • when the OutputImageDir isn't set

This got me wondering if there is a way we could make the AddOutputImageDigestExporter function more focused so it would be a bit easier to tell what needed to be tested, and the test could be shorter: what if the function was divided up like this:

  • A function that can return all (if any) output image resources from a Task
  • A function that sets the OutputImageDir as needed
  • A function that adds the imageDigestExporterContainer

?

(I don't mind if you want to do that in a follow-up PR instead!)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the outputImageDir is not set has a test in the task defaults since it get set there and output resource only don't would make any difference

for the refactor, makes sense, but I'd prefer if we do it in a follow up PR

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for the refactor, makes sense, but I'd prefer if we do it in a follow up PR

kk!

docs/resources.md Outdated Show resolved Hide resolved
@bobcatfish
Copy link
Collaborator

Left a few comments! Not sure about using /tools, maybe /builder/<something> makes more sense.

Also would like to see AddOutputImageDigestExporter refactored but I don't mind if that's a subsequent PR... as long as we don't forget haha :D

@nader-ziada
Copy link
Member Author

@bobcatfish i’ll work on these last few comments this week. Thanks :)

Copy link
Member

@vdemeester vdemeester left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good 😻
Few nits and one questions in addition to @bobcatfish comments

cmd/imagedigestexporter/main.go Outdated Show resolved Hide resolved
docs/resources.md Outdated Show resolved Hide resolved
{
"mediaType": "application/vnd.oci.image.index.v1+json",
"size": 314,
"digest": "sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think buildah does, or we could use skopeo to fetch an image and write it in oci format

skopeo copy docker://busybox:latest oci:busybox_ocilayout:latest

But it can be done in a follow-up too 😉

pkg/apis/pipeline/v1alpha1/image_resource.go Outdated Show resolved Hide resolved
// Resource Value stuff
// +optional
// Path to the index.json file for output container images
OutputImageDir string `json:"outputImageDir"`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason to not re-use TargetPath for the output folder ? (might have been already discussed 🙇‍♂️)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't know, didn't think about it 🤷🏼‍♂️

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Asking that as this field is only gonna be useful for one type of resources and I feel it would make sense to re-use TargetPath.
@bobcatfish @abayer wdyt ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it might bit a little confusing because it will have different meanings

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it might bit a little confusing because it will have different meanings

Yeah I am 50/50 on that. It's close (as it is a "target" path), but user "may" think it's related to the image reference (although this is not where we define that one so…). I'm not sure how confusing it can be 😅 #dont-know-what-i-am-talking-about 😹

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oooo yeah this is a good idea - I'm really tempted to re-use targetPath here too 🤔but also I'm torn because overloading it may be confusing. Since we're alpha (famous last words) I'm thinking go ahead with OutputImageDir for now and see how it goes?

pkg/reconciler/v1alpha1/taskrun/taskrun.go Show resolved Hide resolved
@tekton-robot
Copy link
Collaborator

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bobcatfish, nader-ziada, 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:
  • OWNERS [bobcatfish,vdemeester]

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

 - This features requires the builder used to build the image to export
 an oci standard layout file `index.json`
 https://github.com/opencontainers/image-spec/blob/master/image-layout.md
 - If the `index.json` file is not present, the digest will not be
 exposed in the taskRun
 - add a field in the image resource to indicate the location of the
 index.json file -> `indexpath`
 - add a field in the taskRun status to include the image name and
 digest -> `resourcesResult`
 - add a container step to collect the digest from all the files
 - the taskRun controller will collect the output from the
 image-digest-exporter container and update the taskRun status
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests

Signed-off-by: Nader Ziada <nziada@pivotal.io>
- rename field to OutputImageDir instead of OutputImagePath
- fixed documentation typos
- fix some docs and comments
Copy link
Member

@afrittoli afrittoli left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work, thank you! I look forward to having this feature merge in.
The only thing that concerns me a bit on this is using the container log to transport data, but that's definitely not a show-stopper, it may be something we can improve upon in future.

return nil
}

// UpdateTaskRunStatusWithResourceResult if there an update to the outout image resource, add to taskrun status result
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if there is an update to the output

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bumping this - might merge anyway tho cuz it's been a long road and this PR is otherwise in pretty great shape - maybe @nader-ziada can fix in a follow up?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can do a followup PR on that one

if err != nil {
logger.Errorf("Error getting output from image-digest-exporter for %s/%s: %s", taskRun.Name, taskRun.Namespace, err)
}
err = resources.UpdateTaskRunStatusWithResourceResult(taskRun, logContent)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been trying to find an alternative to using the log file to share data, so that we could keep the log file to log things. The best idea I could come up with so far is to use the imagedigestreporter to update the TaskRun via patch and store the image digest there.
Did you consider any other alternative yet?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There was a doc sent out a while back: and this PR was based on the feedback I got.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i know what you mean @afrittoli ! it seems a bit odd but it also seems like the best option at the moment - but fortunately since this is an implementation detail, I feel like we're safe to go ahead with this and if we come across a better idea we can change it later :D

Copy link
Collaborator

@bobcatfish bobcatfish left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your patience @nader-ziada , looking great! 😻

A couple minor comments but I don't think there's anything that should stop us from merging - let's do it!

Thanks for adding this excellent new feature :D

/lgtm
/meow space

ii, err := layout.ImageIndexFromPath(imageResource.IndexPath)
if err != nil {
// if this image doesn't have a builder that supports index.josn file,
// then it will be skipped
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the controller could be aware of that error and not try to parse if it sees the error?

The `/builder/` namespace is reserved on containers for various system tools, such as the following:

- The environment variable HOME is set to `/builder/home`, used by the builder tools and injected on into all of the step containers
- Default location for output-images `/builder/output-images`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

// Resource Value stuff
// +optional
// Path to the index.json file for output container images
OutputImageDir string `json:"outputImageDir"`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oooo yeah this is a good idea - I'm really tempted to re-use targetPath here too 🤔but also I'm torn because overloading it may be confusing. Since we're alpha (famous last words) I'm thinking go ahead with OutputImageDir for now and see how it goes?

return nil
}

// UpdateTaskRunStatusWithResourceResult if there an update to the outout image resource, add to taskrun status result
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bumping this - might merge anyway tho cuz it's been a long road and this PR is otherwise in pretty great shape - maybe @nader-ziada can fix in a follow up?

pkg/reconciler/v1alpha1/taskrun/taskrun.go Show resolved Hide resolved
@tekton-robot
Copy link
Collaborator

@bobcatfish: cat image

In response to this:

Thanks for your patience @nader-ziada , looking great! 😻

A couple minor comments but I don't think there's anything that should stop us from merging - let's do it!

Thanks for adding this excellent new feature :D

/lgtm
/meow space

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@tekton-robot tekton-robot added the lgtm Indicates that a PR is ready to be merged. label May 21, 2019
@bobcatfish
Copy link
Collaborator

Looks like there is some new linting @dlorenc added recently that has noticed a couple things so we can't merge just yet @nader-ziada :( 😭

I0521 13:30:49.876] pkg/reconciler/v1alpha1/taskrun/resources/image_exporter_test.go:285:41: Error return value of `UpdateTaskRunStatusWithResourceResult` is not checked (errcheck)
I0521 13:30:49.877] 			UpdateTaskRunStatusWithResourceResult(c.taskRun, c.podLog)
I0521 13:30:49.878] 			                                     ^
I0521 13:30:49.879] pkg/reconciler/v1alpha1/taskrun/taskrun_test.go:1742:57: Error return value of `(github.com/tektoncd/pipeline/vendor/k8s.io/client-go/tools/cache.Store).Add` is not checked (errcheck)
I0521 13:30:49.880] 				pipelineResourceInformer.Informer().GetIndexer().Add(r)
I0521 13:30:49.881] 				                                                    ^
I0521 13:31:11.248] pkg/apis/pipeline/v1alpha1/task_defaults.go:39:2: S1023: redundant `return` statement (gosimple)
I0521 13:31:11.296] 	return
I0521 13:31:11.296] 	^

@tekton-robot tekton-robot removed the lgtm Indicates that a PR is ready to be merged. label May 21, 2019
@nader-ziada
Copy link
Member Author

Thanks @bobcatfish, pushed a fix to the linting issues, happy to do a follow-up PR for other comments, there was already a refactor we talked about that I said I would do as a follow up :D

@bobcatfish
Copy link
Collaborator

Thanks @nader-ziada!! : heart:

/lgtm

@tekton-robot tekton-robot added the lgtm Indicates that a PR is ready to be merged. label May 21, 2019
@tekton-robot tekton-robot merged commit ea5cc07 into tektoncd:master May 21, 2019
tekton-robot pushed a commit that referenced this pull request May 21, 2019
- run the image digest exporter after each step
- move the index path to the task definition instead of the resource since the user needs to know this at the time of creating the task so it can be used as part of the steps scripting if needed
- rename indexpath to outputimagepath
- add example yaml
- refactor image exporter code and add more unit tests

Signed-off-by: Nader Ziada <nziada@pivotal.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cla: yes Trying to make the CLA bot happy with ppl from different companies work on one commit lgtm Indicates that a PR is ready to be merged. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants