<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tekton – Supply Chain Security</title>
    <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/</link>
    <description>Recent content in Supply Chain Security on Tekton</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="https://deploy-preview-726--tekton.netlify.app/docs/chains/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/authentication/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/authentication/</guid>
      <description>
        
        
        &lt;h1 id=&#34;authentication-for-chains&#34;&gt;Authentication for Chains&lt;/h1&gt;
&lt;p&gt;Authentication must be set up to take advantage of the following features in Chains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pushing signatures to an OCI registry after signing an image&lt;/li&gt;
&lt;li&gt;Using Fulcio to get Signing Certificates when utilizing Keyless signing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This doc will cover how to set this up!&lt;/p&gt;
&lt;h2 id=&#34;authenticating-to-an-oci-registry&#34;&gt;Authenticating to an OCI Registry&lt;/h2&gt;
&lt;p&gt;To push to an OCI registry, the Chains controller will look for credentials in two places. The first place is in the pod executing your Task and the second place is in the service account configured to run your Task.&lt;/p&gt;
&lt;h3 id=&#34;first-well-cover-creating-the-credentials&#34;&gt;First we&amp;rsquo;ll cover creating the credentials.&lt;/h3&gt;
&lt;p&gt;Set the namespace and name of the Kubernetes service account:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&amp;lt;your namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_NAME&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&amp;lt;service account name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-a-secret-based-on-existing-credentials&#34;&gt;Create a Secret based on existing credentials&lt;/h3&gt;
&lt;p&gt;If you already ran &lt;code&gt;docker login&lt;/code&gt;, you can copy the credentials stored in
config.json into Kubernetes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Make sure that any external credentials store, such as the native
keychain of the operating system, is not used to store the credentials and
the config.json is of the format:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;auths&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;&amp;lt;registry&amp;gt;&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;redacted&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Create a secret with config.json:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret generic docker-registry &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;    --from-file&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;.dockerconfigjson&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&amp;lt;path/to/.docker/config.json&amp;gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;    --type&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;kubernetes.io/dockerconfigjson &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;    -n &lt;span style=&#34;color:#033&#34;&gt;$NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More details around creating this secret can be found &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;create-a-secret-by-providing-credentials-on-the-command-line&#34;&gt;Create a Secret by providing credentials on the command line&lt;/h3&gt;
&lt;p&gt;First, you will need access to credentials for your registry (they are in a file called &lt;code&gt;credentials.json&lt;/code&gt; in this example).
Next, create a &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/secret/#docker-config-secrets&#34;&gt;Docker config type Kubernetes secret&lt;/a&gt;, which will contain the credentials required to push signatures:&lt;/p&gt;
&lt;p&gt;Then, create a &lt;code&gt;.dockerconfig&lt;/code&gt; type secret:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret docker-registry registry-credentials &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --docker-server&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;gcr.io &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --docker-username&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;_json_key &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --docker-email&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;someemail@something.com &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --docker-password&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;cat credentials.json&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  -n &lt;span style=&#34;color:#033&#34;&gt;$NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More details around creating this secret can be found &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;setup-credentials-using-the-pod&#34;&gt;Setup credentials using the pod&lt;/h3&gt;
&lt;p&gt;Tekton supports specifying a Pod template to customize the Pod running your Task. You must supply the Pod template when starting your Task with the cli or embeddng it into your TaskRun.&lt;/p&gt;
&lt;p&gt;An example TaskRun configured with the &lt;code&gt;registry-credentials&lt;/code&gt; secret.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0cf;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;mytaskrun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;mytask&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;podTemplate&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;imagePullSecrets&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry-credentials&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More details on how to modify the podTemplate for a taskRun can be found &lt;a href=&#34;https://github.com/tektoncd/pipeline/blob/main/docs/taskruns.md#specifying-a-pod-template&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;setup-credentials-using-the-service-account&#34;&gt;Setup credentials using the service account&lt;/h3&gt;
&lt;p&gt;Finally, give the service account access to the secret above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch serviceaccount &lt;span style=&#34;color:#033&#34;&gt;$SERVICE_ACCOUNT_NAME&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  -p &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;{\&amp;#34;secrets\&amp;#34;: [{\&amp;#34;name\&amp;#34;: \&amp;#34;registry-credentials\&amp;#34;}]}&amp;#34;&lt;/span&gt; -n &lt;span style=&#34;color:#033&#34;&gt;$NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, Chains has push permissions for any TaskRuns running under the service account &lt;code&gt;$SERVICE_ACCOUNT_NAME&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The secrets in the &lt;code&gt;imagePullSecrets&lt;/code&gt; attribute of the ServiceAccount are also taken into account.
However, other Tekton components may not do so. The &lt;code&gt;secrets&lt;/code&gt; attribute is the
&lt;a href=&#34;https://tekton.dev/docs/pipelines/auth/&#34;&gt;recommended&lt;/a&gt; approach.&lt;/p&gt;
&lt;h2 id=&#34;authenticating-to-fulcio-for-keyless-signing&#34;&gt;Authenticating to Fulcio for Keyless signing&lt;/h2&gt;
&lt;p&gt;The default &lt;a href=&#34;https://github.com/tektoncd/chains/tree/main/config/100-deployment.yaml&#34;&gt;deployment&lt;/a&gt; will work against
public Fulcio assuming it is installed into an EKS or GKE cluster. You will
just need to add the following to &lt;code&gt;chains-config&lt;/code&gt; ConfigMap data section in the
&lt;code&gt;tekton-chains&lt;/code&gt; namespace:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;signers.x509.fulcio.enabled&amp;#34;: &amp;#34;true&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;specifying-a-custom-fulcio-endpoint&#34;&gt;Specifying a custom Fulcio endpoint&lt;/h3&gt;
&lt;p&gt;If you are running your own instance of Fulcio, you need to further
configure Fulcio for this. You need to additionally point Chains to your
fulcio instance by adding this to &lt;code&gt;chains-config&lt;/code&gt;. In this case, it&amp;rsquo;s a local
k8s service, but you will need to change the URL to point to your Fulcio
instance.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;signers.x509.fulcio.address&amp;#34;: &amp;#34;http://fulcio.fulcio-system.svc&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;specifying-spiffe-as-authentication-provider&#34;&gt;Specifying Spiffe as authentication provider&lt;/h3&gt;
&lt;p&gt;If you are using Spiffe to authenticate to Fulcio, you will need to configure
your Chains Deployment to fetch the SVID from the Spire agent. This requires
mounting the Agent socket, specifying an environmental variable (if not using
the default of &lt;code&gt;/tmp/spire-agent/public/api.sock&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For VolumeMount, replace the k8s SA token, or add if you use it for something
else the following to &lt;code&gt;tekton-chains-controller&lt;/code&gt; container volumeMounts section:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        - name: spiffe-workload-api
          mountPath: /run/spire/sockets/agent.sock
          readOnly: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Specify (if necessary) the non-default Agent socket, by adding the following
to the &lt;code&gt;tekton-chains-controller&lt;/code&gt; env section:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        - name: SPIFFE_ENDPOINT_SOCKET
          value: &amp;#34;/run/spire/sockets/agent.sock&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And finally, adding the volume for the Spiffe workload API by adding this
to deployment &lt;code&gt;volumes&lt;/code&gt; section:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;      - name: spiffe-workload-api
        hostPath:
          path: /run/spire/sockets/agent.sock
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Last but not least, thanks to &lt;a href=&#34;https://github.com/spiffe/spiffe-csi&#34;&gt;spiffe-csi&lt;/a&gt;, which is a CSI (Container Storage Interface) driver for Kubernetes that facilitates injection of the SPIFFE Workload API , there is alternative way of retrieving the Agent socket to your Pods without having to mount the &lt;code&gt;hostPath&lt;/code&gt;. You can read more about it &lt;a href=&#34;https://www.kusari.dev/blog/spiffee-csi/&#34;&gt;here&lt;/a&gt;. Once you have installed &lt;code&gt;spiffe-csi-driver&lt;/code&gt; into your cluster by following the &lt;a href=&#34;https://github.com/spiffe/spiffe-csi/tree/main/example#steps&#34;&gt;installation steps&lt;/a&gt; in the GitHub repository, the only thing that you have to do is add the following code snippet to deployment &lt;code&gt;volumes&lt;/code&gt; and &lt;code&gt;volumeMounts&lt;/code&gt; sections:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;     ...
        volumeMounts:
          - name: spiffe-workload-api
            mountPath: /spiffe-workload-api
            readOnly: true

     ...
      volumes:
        - name: spiffe-workload-api
          csi:
            driver: &amp;#34;csi.spiffe.io&amp;#34;
            readOnly: true
&lt;/code&gt;&lt;/pre&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/config/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/config/</guid>
      <description>
        
        
        &lt;h1 id=&#34;chains-configuration&#34;&gt;Chains Configuration&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Chains&lt;/code&gt; works by observing &lt;code&gt;TaskRun&lt;/code&gt; and &lt;code&gt;PipelineRun&lt;/code&gt; executions, capturing relevant information, and storing it in a cryptographically-signed format.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TaskRuns&lt;/code&gt; and &lt;code&gt;PipelineRuns&lt;/code&gt; can indicate inputs and outputs which are then captured and surfaced in the &lt;code&gt;Chains&lt;/code&gt; payload formats, where relevant.
&lt;code&gt;Chains&lt;/code&gt; uses the &lt;code&gt;Results&lt;/code&gt; to &lt;em&gt;hint&lt;/em&gt; at the correct inputs and outputs. Check out &lt;a href=&#34;https://deploy-preview-726--tekton.netlify.app/docs/chains/slsa-provenance/&#34;&gt;slsa-provenance.md&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h2 id=&#34;chains-configuration-1&#34;&gt;Chains Configuration&lt;/h2&gt;
&lt;p&gt;Chains uses a &lt;code&gt;ConfigMap&lt;/code&gt; called &lt;code&gt;chains-config&lt;/code&gt; in the &lt;code&gt;tekton-chains&lt;/code&gt; namespace for configuration.
Supported keys include:&lt;/p&gt;
&lt;h3 id=&#34;taskrun-configuration&#34;&gt;TaskRun Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.taskrun.format&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The format to store &lt;code&gt;TaskRun&lt;/code&gt; payloads in.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;in-toto&lt;/code&gt;, &lt;code&gt;slsa/v1&lt;/code&gt;, &lt;code&gt;slsa/v2alpha3&lt;/code&gt;, &lt;code&gt;slsa/v2alpha4&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;in-toto&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.taskrun.storage&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The storage backend to store &lt;code&gt;TaskRun&lt;/code&gt; signatures in. Multiple backends can be specified with comma-separated list (&amp;ldquo;tekton,oci&amp;rdquo;). To disable the &lt;code&gt;TaskRun&lt;/code&gt; artifact input an empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;tekton&lt;/code&gt;, &lt;code&gt;oci&lt;/code&gt;, &lt;code&gt;gcs&lt;/code&gt;, &lt;code&gt;docdb&lt;/code&gt;, &lt;code&gt;grafeas&lt;/code&gt;, &lt;code&gt;archivista&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;tekton&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.taskrun.signer&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The signature backend to sign &lt;code&gt;TaskRun&lt;/code&gt; payloads with. Use &lt;code&gt;none&lt;/code&gt; to disable signing while still storing provenance.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;, &lt;code&gt;kms&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;slsa/v1&lt;/code&gt; is an alias of &lt;code&gt;in-toto&lt;/code&gt; for backwards compatibility.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slsa/v2alpha3&lt;/code&gt; corresponds to the slsav1.0 spec. and uses latest &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1&#34;&gt;&lt;code&gt;v1&lt;/code&gt; Tekton Objects&lt;/a&gt;.  Recommended format for new chains users who want the slsav1.0 spec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slsa/v2alpha4&lt;/code&gt; corresponds to the slsav1.0 spec. and uses latest &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1&#34;&gt;&lt;code&gt;v1&lt;/code&gt; Tekton Objects&lt;/a&gt;. It reads type-hinted results from &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1alpha1.StepAction&#34;&gt;StepActions&lt;/a&gt;. Recommended format for new chains users who want the slsav1.0 spec.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;pipelinerun-configuration&#34;&gt;PipelineRun Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.pipelinerun.format&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The format to store &lt;code&gt;PipelineRun&lt;/code&gt; payloads in.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;in-toto&lt;/code&gt;, &lt;code&gt;slsa/v1&lt;/code&gt;, &lt;code&gt;slsa/v2alpha3&lt;/code&gt;, &lt;code&gt;slsa/v2alpha4&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;in-toto&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.pipelinerun.storage&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The storage backend to store &lt;code&gt;PipelineRun&lt;/code&gt; signatures in. Multiple backends can be specified with comma-separated list (&amp;ldquo;tekton,oci&amp;rdquo;). To disable the &lt;code&gt;PipelineRun&lt;/code&gt; artifact input an empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;tekton&lt;/code&gt;, &lt;code&gt;oci&lt;/code&gt;, &lt;code&gt;gcs&lt;/code&gt;, &lt;code&gt;docdb&lt;/code&gt;, &lt;code&gt;grafeas&lt;/code&gt;, &lt;code&gt;archivista&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;tekton&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.pipelinerun.signer&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The signature backend to sign &lt;code&gt;PipelineRun&lt;/code&gt; payloads with. Use &lt;code&gt;none&lt;/code&gt; to disable signing while still storing provenance.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;, &lt;code&gt;kms&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.pipelinerun.enable-deep-inspection&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;This boolean option will configure whether Chains should inspect child taskruns in order to capture inputs/outputs within a pipelinerun. &lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt; means that Chains only checks pipeline level results, whereas &lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt; means Chains inspects both pipeline level and task level results.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For grafeas storage backend, currently we only support Container Analysis. We will make grafeas server address configurabe within a short time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slsa/v1&lt;/code&gt; is an alias of &lt;code&gt;in-toto&lt;/code&gt; for backwards compatibility.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slsa/v2alpha3&lt;/code&gt; corresponds to the slsav1.0 spec. and uses latest &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1&#34;&gt;&lt;code&gt;v1&lt;/code&gt; Tekton Objects&lt;/a&gt;. Recommended format for new chains users who want the slsav1.0 spec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slsa/v2alpha4&lt;/code&gt; corresponds to the slsav1.0 spec. and uses latest &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1&#34;&gt;&lt;code&gt;v1&lt;/code&gt; Tekton Objects&lt;/a&gt;. It reads type-hinted results from &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipeline-api/#tekton.dev/v1alpha1.StepAction&#34;&gt;StepActions&lt;/a&gt; when &lt;code&gt;artifacts.pipelinerun.enable-deep-inspection&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt;. Recommended format for new chains users who want the slsav1.0 spec.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;oci-configuration&#34;&gt;OCI Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.oci.format&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The format to store &lt;code&gt;OCI&lt;/code&gt; payloads in.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;simplesigning&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;simplesigning&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.oci.storage&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The storage backend to store &lt;code&gt;OCI&lt;/code&gt; signatures in. Multiple backends can be specified with comma-separated list (&amp;ldquo;oci,tekton&amp;rdquo;). To disable the &lt;code&gt;OCI&lt;/code&gt; artifact input an empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;tekton&lt;/code&gt;, &lt;code&gt;oci&lt;/code&gt;, &lt;code&gt;gcs&lt;/code&gt;, &lt;code&gt;docdb&lt;/code&gt;, &lt;code&gt;grafeas&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;oci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;artifacts.oci.signer&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The signature backend to sign &lt;code&gt;OCI&lt;/code&gt; payloads with. Use &lt;code&gt;none&lt;/code&gt; to skip signing of OCI artifacts while still allowing provenance generation and attestation signing (see note below).&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;, &lt;code&gt;kms&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;x509&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: When &lt;code&gt;artifacts.oci.signer&lt;/code&gt; is set to &lt;code&gt;none&lt;/code&gt;, only OCI image &lt;em&gt;signing&lt;/em&gt; is disabled; attestations are still generated and pushed as configured. To push attestations to registries, set &lt;code&gt;artifacts.taskrun.storage&lt;/code&gt; and/or &lt;code&gt;artifacts.pipelinerun.storage&lt;/code&gt; to include &lt;code&gt;oci&lt;/code&gt;. Attestations will still be pushed to the same location determined by type hinting (IMAGE_URL/IMAGE_DIGEST results) or &lt;code&gt;storage.oci.repository&lt;/code&gt; if configured.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;kms-configuration&#34;&gt;KMS Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.kmsref&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The URI reference to a KMS service to use in &lt;code&gt;KMS&lt;/code&gt; signers.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Supported schemes: &lt;code&gt;gcpkms://&lt;/code&gt;, &lt;code&gt;awskms://&lt;/code&gt;, &lt;code&gt;azurekms://&lt;/code&gt;, &lt;code&gt;hashivault://&lt;/code&gt;. See &lt;a href=&#34;https://docs.sigstore.dev/cosign/kms_support&#34;&gt;https://docs.sigstore.dev/cosign/kms_support&lt;/a&gt; for more details.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;storage-configuration&#34;&gt;Storage Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.gcs.bucket&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The GCS bucket for storage&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.oci.repository&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The OCI repo to store OCI signatures and attestation in&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;If left undefined &lt;em&gt;and&lt;/em&gt; one of &lt;code&gt;artifacts.{oci,taskrun}.storage&lt;/code&gt; includes &lt;code&gt;oci&lt;/code&gt; storage, attestations will be stored alongside the stored OCI artifact itself. (&lt;a href=&#34;https://raw.github.com/tektoncd/chains/main/images/attestations-in-artifact-registry.png&#34;&gt;example on GCP&lt;/a&gt;) Defining this value results in the OCI bundle stored in the designated location &lt;em&gt;instead of&lt;/em&gt; alongside the image. See &lt;a href=&#34;https://github.com/sigstore/cosign#specifying-registry&#34;&gt;cosign documentation&lt;/a&gt; for additional information.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.oci.repository.insecure&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Whether to use insecure connection when connecting to the OCI repository&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.docdb.url&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The go-cloud URI reference to a docstore collection&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;firestore://projects/[PROJECT]/databases/(default)/documents/[COLLECTION]?name_field=name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The value of MONGO_SERVER_URL env var with the MongoDB connection URI&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Example: &lt;code&gt;mongodb://[USER]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The path of the directory that contains the file named MONGO_SERVER_URL that stores the value of MONGO_SERVER_URL env var&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;If the file &lt;code&gt;/mnt/mongo-creds-secret/MONGO_SERVER_URL&lt;/code&gt; has the value of MONGO_SERVER_URL, then set &lt;code&gt;storage.docdb.mongo-server-url-dir: /mnt/mongo-creds-secret&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The path of the file that contains the value of mongo server url&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;If the file &lt;code&gt;/mnt/mongo-creds-secret/mongo-server-url&lt;/code&gt; has the value, then set &lt;code&gt;storage.docdb.mongo-server-url-path: /mnt/mongo-creds-secret/mongo-server-url&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.grafeas.projectid&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The project of where grafeas server is located for storing occurrences&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.grafeas.noteid&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;This field will be used as the prefix part of the note name that will be created. The value of this field must be a string without spaces. (See more details &lt;a href=&#34;#grafeas&#34;&gt;below&lt;/a&gt;.)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.grafeas.notehint&lt;/code&gt; (optional)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;This field is used to set the &lt;a href=&#34;https://github.com/grafeas/grafeas/blob/cd23d4dc1bef740d6d6d90d5007db5c9a2431c41/proto/v1/attestation.proto#L49&#34;&gt;human_readable_name&lt;/a&gt; field in the Grafeas ATTESTATION note. If it is not provided, the default &lt;code&gt;This attestation note was generated by Tekton Chains&lt;/code&gt; will be used.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;storage.archivista.url&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The URL endpoint for the Archivista service.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;A valid HTTPS URL pointing to your Archivista instance (e.g. &lt;code&gt;https://archivista.testifysec.io&lt;/code&gt;).&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Security Considerations for &lt;code&gt;storage.oci.repository.insecure&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;storage.oci.repository.insecure&lt;/code&gt; flag allows connecting to OCI registries without TLS certificate verification. This feature is designed to ease developer overhead during testing and development where setting up HTTPS might be cumbersome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security Risks:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Production Environment Risk&lt;/strong&gt;: Enabling this flag in production environments can lead to serious security compromises. Administrators must ensure this flag is only enabled for development and testing purposes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Man-in-the-Middle Attacks&lt;/strong&gt;: Skipping TLS certificate verification makes the connection vulnerable to man-in-the-middle attacks where provenance could be tampered with.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SLSA Guarantees Violation&lt;/strong&gt;: Tampered provenance can lead to violation of SLSA (Supply chain Levels for Software Artifacts) guarantees that Tekton Chains promises to provide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: Only use &lt;code&gt;storage.oci.repository.insecure: true&lt;/code&gt; in development or test environments. For production deployments, always use secure HTTPS connections with valid TLS certificates (&lt;code&gt;storage.oci.repository.insecure: false&lt;/code&gt;, which is the default).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;docstore&#34;&gt;docstore&lt;/h4&gt;
&lt;p&gt;You can read about the go-cloud docstore URI format &lt;a href=&#34;https://gocloud.dev/howto/docstore/&#34;&gt;here&lt;/a&gt;. Tekton Chains supports the following docstore services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;firestore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dynamodb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mongo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;mongodb&#34;&gt;MongoDB&lt;/h4&gt;
&lt;p&gt;You can provide MongoDB connection through different options&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using MONGO_SERVER_URL Environment Variable&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User can set the MongoDB connection URL in the MONGO_SERVER_URL env var in the Chains deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using &lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt; field in the chains-config configmap&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alternatively, you can set the connection URL using the &lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt; field in the chains-config configmap&lt;/li&gt;
&lt;li&gt;This field overrides the MONGO_SERVER_URL env var&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using &lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt; field&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Another option is to set &lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt;, which points to a directory containing a file named &lt;code&gt;MONGO_SERVER_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The directory path setting takes precedence over both &lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt; and the &lt;code&gt;MONGO_SERVER_URL&lt;/code&gt; env var&lt;/li&gt;
&lt;li&gt;For instance, if &lt;code&gt;/mnt/mongo-creds-secret/MONGO_SERVER_URL&lt;/code&gt; contains the MongoDB URL, set &lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt;: &lt;code&gt;/mnt/mongo-creds-secret&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; field&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can use &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; field in chains-config configmap to directly reference the file containing the MongoDB URL&lt;/li&gt;
&lt;li&gt;This field overrides all others (&lt;code&gt;mongo-server-url-dir, mongo-server-url, and MONGO_SERVER_URL env var&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;For instance, if &lt;code&gt;/mnt/mongo-creds-secret/mongo-server-url&lt;/code&gt;  contains the MongoDB URL, then set &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt;: &lt;code&gt;/mnt/mongo-creds-secret/mongo-server-url&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; :-&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When using &lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt; or &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; field, store the value of mongo server url in a secret and mount the secret. When the secret is updated, the new value will be fetched by Tekton Chains controller&lt;/li&gt;
&lt;li&gt;Also using &lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt; or &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; field are recommended, using &lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt; should be avoided since credentials are stored in a ConfigMap instead of a secret&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;grafeas&#34;&gt;Grafeas&lt;/h4&gt;
&lt;p&gt;You can read more about Grafeas notes and occurrences &lt;a href=&#34;https://github.com/grafeas/grafeas/blob/master/docs/grafeas_concepts.md&#34;&gt;here&lt;/a&gt;. To create occurrences, we have to create notes first that are used to link occurrences. Two types of occurrences will be created: &lt;code&gt;ATTESTATION&lt;/code&gt; Occurrence and &lt;code&gt;BUILD&lt;/code&gt; Occrrence. The configurable &lt;code&gt;noteid&lt;/code&gt; is used as the prefix of the note name. Under the hood, the suffix &lt;code&gt;-simplesigning&lt;/code&gt; will be appended for the &lt;code&gt;ATTESTATION&lt;/code&gt; note, and the suffix &lt;code&gt;-intoto&lt;/code&gt; will be appended for the &lt;code&gt;BUILD&lt;/code&gt; note. If the &lt;code&gt;noteid&lt;/code&gt; field is not configured, &lt;code&gt;tekton-&amp;lt;NAMESPACE&amp;gt;&lt;/code&gt; will be used as the prefix.&lt;/p&gt;
&lt;h3 id=&#34;in-toto-configuration&#34;&gt;In-toto Configuration&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;builder.id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The builder ID to set for in-toto attestations&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://tekton.dev/chains/v2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;builddefinition.buildtype&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The buildType for in-toto attestations&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://tekton.dev/chains/v2/slsa&lt;/code&gt;, &lt;code&gt;https://tekton.dev/chains/v2/slsa-tekton&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://tekton.dev/chains/v2/slsa&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE:
Considerations for the builddefinition.buildtype parameter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is only valid for &lt;code&gt;slsa/v2alpha3&lt;/code&gt; configurations (see TaskRun or PipelineRun configuration).&lt;/li&gt;
&lt;li&gt;The parameter can take one of two values:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://tekton.dev/chains/v2/slsa&lt;/code&gt;: This buildType strictly conforms to the slsav1.0 spec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://tekton.dev/chains/v2/slsa-tekton&lt;/code&gt;: This buildType also conforms to the slsav1.0 spec, but adds additional information specific to Tekton. This information includes the PipelinRun/TaskRun labels and annotations as internalParameters. It also includes capturing each pipeline task in a PipelinRun under resolvedDependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;sigstore-features-configuration&#34;&gt;Sigstore Features Configuration&lt;/h3&gt;
&lt;h4 id=&#34;transparency-log&#34;&gt;Transparency Log&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;transparency.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Whether to enable automatic binary transparency uploads.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;manual&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;transparency.url&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The URL to upload binary transparency attestations to, if enabled.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://rekor.sigstore.dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If &lt;code&gt;transparency.enabled&lt;/code&gt; is set to &lt;code&gt;manual&lt;/code&gt;, then only &lt;code&gt;TaskRuns&lt;/code&gt; and &lt;code&gt;PipelineRuns&lt;/code&gt; with the following annotation will be uploaded to the transparency log:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/transparency-upload&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;keyless-signing-with-fulcio&#34;&gt;Keyless Signing with Fulcio&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.fulcio.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Whether to enable automatic certificates from fulcio.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.fulcio.address&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Fulcio address to request certificate from, if enabled&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://fulcio.sigstore.dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.fulcio.issuer&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Expected OIDC issuer.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://oauth2.sigstore.dev/auth&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.fulcio.provider&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Provider to request ID Token from&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;google&lt;/code&gt;, &lt;code&gt;spiffe&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;filesystem&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Unset, each provider will be attempted.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.identity.token.file&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Path to file containing ID Token.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.x509.tuf.mirror.url&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;TUF server URL. $TUF_URL/root.json is expected to be present.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;https://sigstore-tuf-root.storage.googleapis.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;kms-oidc-and-spire-configuration&#34;&gt;KMS OIDC and Spire Configuration&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Key&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Supported Values&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.address&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;URI of KMS server (e.g. the value of &lt;code&gt;VAULT_ADDR&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.token&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Auth token KMS server (e.g. the value of &lt;code&gt;VAULT_TOKEN&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.token-path&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Path to store KMS server Auth token (e.g. &lt;code&gt;/etc/kms-secrets&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.oidc.path&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Path used for OIDC authentication (e.g. &lt;code&gt;jwt&lt;/code&gt; for Vault)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.oidc.role&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Role used for OIDC authentication&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.spire.sock&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;URI of the Spire socket used for KMS token (e.g. &lt;code&gt;unix:///tmp/spire-agent/public/api.sock&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signers.kms.auth.spire.audience&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Audience for requesting a SVID from Spire&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE:&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;signers.kms.auth.token-path&lt;/code&gt; is set, create a secret and ensure the Chains deployment mounts this secret to
the path specified by &lt;code&gt;signers.kms.auth.token-path&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
To project the latest token values without needing to recreate the pod, avoid using &lt;code&gt;subPath&lt;/code&gt; in volume mount.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;visual-guide-configmap-configuration-options&#34;&gt;Visual Guide: ConfigMap Configuration Options&lt;/h3&gt;
&lt;p&gt;Refer the diagram below to explore the pictorial representation of signing and storage configuration options, and their usage in the context of chains artifacts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/images/signing-storage-config-diagram.drawio.svg&#34; alt=&#34;ConfigMap Configuration Diagram&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;namespaces-restrictions-in-chains-controller&#34;&gt;Namespaces Restrictions in Chains Controller&lt;/h2&gt;
&lt;p&gt;This feature allows you to specify a list of namespaces for the controller to monitor, providing granular control over its operation. If no namespaces are specified, the controller defaults to monitoring all namespaces.&lt;/p&gt;
&lt;h3 id=&#34;usage&#34;&gt;Usage&lt;/h3&gt;
&lt;p&gt;To restrict the Chains Controller to specific namespaces, pass a comma-separated list of namespaces as an argument to the controller using the &amp;ndash;namespace flag.&lt;/p&gt;
&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;
&lt;p&gt;To restrict the controller to the dev and test namespaces, you would start the controller with the following argument:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--namespace&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;dev,test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, the controller will only monitor resources (pipelinesruns and taskruns) within the dev and test namespaces.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/signing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/signing/</guid>
      <description>
        
        
        &lt;h1 id=&#34;signing-artifacts&#34;&gt;Signing Artifacts&lt;/h1&gt;
&lt;h2 id=&#34;signing-secrets&#34;&gt;Signing Secrets&lt;/h2&gt;
&lt;p&gt;To get started signing things in Chains, you will need to generate a keypair and instruct Chains to sign with it via a Kubernetes secret.
Chains expects a private key, and password if the key is encrypted, to exist in a Kubernetes secret &lt;code&gt;signing-secrets&lt;/code&gt; in the &lt;code&gt;tekton-chains&lt;/code&gt; namespace.&lt;/p&gt;
&lt;p&gt;Chains supports a few different signature schemes, including x509 and KMS systems.&lt;/p&gt;
&lt;p&gt;This doc explains how to generate keys and configure Chains for each type.
Note, &lt;strong&gt;only one&lt;/strong&gt; of the following keys needs to be set up for Chains to work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#x509&#34;&gt;x509&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#cosign&#34;&gt;Cosign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#kms&#34;&gt;KMS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-726--tekton.netlify.app/docs/chains/sigstore/#keyless-signing-mode&#34;&gt;Keyless signing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;x509&#34;&gt;x509&lt;/h2&gt;
&lt;p&gt;For x509, Chains expects the private key to be stored in a secret called &lt;code&gt;signing-secrets&lt;/code&gt; with the following structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x509.pem (the private key)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chains also has the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The private key to be stored as an unencrypted PKCS8 PEM file (&lt;code&gt;BEGIN PRIVATE KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The key is of type &lt;code&gt;ed25519&lt;/code&gt; or &lt;code&gt;ecdsa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cosign&#34;&gt;Cosign&lt;/h2&gt;
&lt;p&gt;For cosign, Chains expects the encrypted private key to be stored in a secret called &lt;code&gt;signing-secrets&lt;/code&gt; with the following structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cosign.key&lt;/code&gt; (the cosign-generated private key)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cosign.password&lt;/code&gt; (the password to decrypt the private key)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chains also has the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The private key must be stored as an encrypted PEM file of type &lt;code&gt;ENCRYPTED COSIGN PRIVATE KEY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;generate-cosign-keypair&#34;&gt;Generate cosign Keypair&lt;/h3&gt;
&lt;p&gt;To create a cosign keypair, &lt;code&gt;cosign.key&lt;/code&gt; and &lt;code&gt;cosign.pub&lt;/code&gt;, install &lt;a href=&#34;https://github.com/sigstore/cosign&#34;&gt;cosign&lt;/a&gt; and run the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign generate-key-pair k8s://tekton-chains/signing-secrets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cosign will prompt you for a password, and create the Kubernetes secret for you.&lt;/p&gt;
&lt;h2 id=&#34;kms&#34;&gt;KMS&lt;/h2&gt;
&lt;p&gt;Chains uses a &lt;a href=&#34;https://github.com/google/go-cloud&#34;&gt;&amp;ldquo;go-cloud&amp;rdquo;&lt;/a&gt; URI like scheme for KMS references.
Chains supports GCP KMS and Hashicorp Vault today, but we would love to add support for more.&lt;/p&gt;
&lt;p&gt;You can configure Chains to use a specific KMS key using the &lt;code&gt;signers.kms.kmsref&lt;/code&gt; config key in &lt;code&gt;chains-config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For GCP, this should have the structure of &lt;code&gt;gcpkms://projects/&amp;lt;project&amp;gt;/locations/&amp;lt;location&amp;gt;/keyRings/&amp;lt;keyring&amp;gt;/cryptoKeys/&amp;lt;key&amp;gt;&lt;/code&gt;
where &lt;code&gt;location&lt;/code&gt;, &lt;code&gt;keyring&lt;/code&gt;, and &lt;code&gt;key&lt;/code&gt; are filled in appropriately.&lt;/p&gt;
&lt;p&gt;For Vault, this should have the structure of &lt;code&gt;hashivault://&amp;lt;keyname&amp;gt;&lt;/code&gt;, where the &lt;code&gt;keyname&lt;/code&gt; is filled out appropriately.&lt;/p&gt;
&lt;p&gt;For AWS, this should have the structure of &lt;code&gt;awskms://[ENDPOINT]/[ID/ALIAS/ARN]&lt;/code&gt; (endpoint optional).&lt;/p&gt;
&lt;p&gt;For Azure, this should have the structure of &lt;code&gt;azurekms://[VAULT_NAME][VAULT_URL]/[KEY_NAME]&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;authentication&#34;&gt;Authentication&lt;/h3&gt;
&lt;p&gt;Most likely, you will need to set up some additional authentication so that the &lt;code&gt;chains-controller&lt;/code&gt; deployment has access to your KMS service for signing.&lt;/p&gt;
&lt;p&gt;For Vault, if you use Token-based authentication, store the token as a secret. Mount this secret to a specific path within the tekton-chains-controller container. Specify the mounted path as the value for the &lt;code&gt;chains-config&lt;/code&gt; config map key &lt;code&gt;signers.kms.auth.token-path&lt;/code&gt;. This approach can also be applied to other KMS providers that support token-based authentication. Note that the existing configuration option &lt;code&gt;signers.kms.auth.token&lt;/code&gt; will still work. If both values are set, &lt;code&gt;signers.kms.auth.token-path&lt;/code&gt; will take precedence.&lt;/p&gt;
&lt;p&gt;For GCP/GKE, we suggest enabling &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity&#34;&gt;Workload Identity&lt;/a&gt;, and giving your service account &lt;code&gt;Cloud KMS Admin&lt;/code&gt; permissions.
Other Service Account techniques would work as well.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;If your signing secrets is already populated, you may get the following error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error from server &lt;span style=&#34;color:#555&#34;&gt;(&lt;/span&gt;AlreadyExists&lt;span style=&#34;color:#555&#34;&gt;)&lt;/span&gt;: secrets &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;signing-secrets&amp;#34;&lt;/span&gt; already exists
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simply delete the secret and then recreate as described above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete secret signing-secrets -n tekton-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/slsa-provenance/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/slsa-provenance/</guid>
      <description>
        
        
        &lt;h1 id=&#34;slsa-provenance&#34;&gt;SLSA Provenance&lt;/h1&gt;
&lt;h2 id=&#34;goal&#34;&gt;Goal&lt;/h2&gt;
&lt;p&gt;This doc includes instructions for how to configure a Tekton Pipeline/Task
so that Tekton Chains can generate SLSA provenances properly.&lt;/p&gt;
&lt;h2 id=&#34;glossary&#34;&gt;Glossary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;SLSA&lt;/em&gt;&lt;/strong&gt;: SLSA stands for Supply-chain Levels for Software Artifacts, or SLSA (&amp;ldquo;salsa&amp;rdquo;). It’s a security framework, a checklist of standards and controls to prevent tampering, improve integrity, and secure packages and infrastructure. It’s how you get from &amp;ldquo;safe enough&amp;rdquo; to being as resilient as possible, at any link in the chain. (&lt;a href=&#34;https://slsa.dev/&#34;&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Attestation&lt;/em&gt;&lt;/strong&gt; (&lt;a href=&#34;https://github.com/in-toto/attestation/blob/main/spec/README.md&#34;&gt;in-toto attestation&lt;/a&gt;): An in-toto attestation is authenticated metadata about one or more software artifacts. The intended consumers are automated policy engines, such as in-toto-verify and Binary Authorization. There are &lt;a href=&#34;https://github.com/in-toto/attestation/tree/main/spec/predicates&#34;&gt;a variety of attestations&lt;/a&gt;, and the type of attestation is determined by the &lt;a href=&#34;https://github.com/in-toto/attestation/blob/main/spec/v1/predicate.md&#34;&gt;predicate&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;SLSA Provenance&lt;/em&gt;&lt;/strong&gt;: &lt;a href=&#34;https://slsa.dev/spec/v1.0/provenance&#34;&gt;SLSA Provenance&lt;/a&gt; is an attestation that a build platform generated to describe how an artifact or set of artifacts was produced.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Pipeline-level provenance&lt;/em&gt;&lt;/strong&gt;: Provenance that Tekton Chains generates to cover the whole picture of the PipelineRun execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Task-level provenance&lt;/em&gt;&lt;/strong&gt;: Provenance that Tekton Chains generates to only include the details of a particular TaskRun execution. It&amp;rsquo;s particularly needed for a standalone TaskRun that is not spawned by a PipelineRun. By contrast, if it&amp;rsquo;s a child TaskRun of a PipelineRun, Task-level provenance will miss the details of other TaskRuns within that Pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Input Artifacts&lt;/em&gt;&lt;/strong&gt;: A canonical term used in this doc to refer to the artifacts that influenced the build process such as source code repository, dependencies and so on. It&amp;rsquo;s mapped to &lt;code&gt;resolvedDependences&lt;/code&gt; field in SLSA v1.0, and mapped to &lt;code&gt;materials&lt;/code&gt; field in SLSA v0.1 &amp;amp; v0.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Output Artifacs&lt;/em&gt;&lt;/strong&gt;: A canonical term used in this doc to refer to the artifacts that the build process produced i.e. an OCI image. This is mapped to &lt;code&gt;Subjects&lt;/code&gt; field in all SLSA versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;&lt;code&gt;Results&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;: &lt;code&gt;Results&lt;/code&gt; are Tekton API fields that authors can use to emit some information after a TaskRun/PipelineRun is complete. &lt;code&gt;Results&lt;/code&gt; can be used to pass along information to different tasks within a pipeline or aggregate different task results to a pipeline result. Check out &lt;a href=&#34;https://tekton.dev/docs/pipelines/pipelines/#using-results&#34;&gt;Tekton official doc&lt;/a&gt; more information. &lt;em&gt;Note: API result field is completely different from &lt;a href=&#34;https://tekton.dev/docs/results/&#34;&gt;Tekton Results Operator&lt;/a&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Type hinting&lt;/em&gt;&lt;/strong&gt;: Refer to specially named results/params that aim to enable Tekton Chains to understand the input artifacts and outputs of a PipelineRun/TaskRun.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-does-tekton-chains-work&#34;&gt;How does Tekton Chains work?&lt;/h2&gt;
&lt;p&gt;Tekton Chains works by reconciling the run of a task or a pipeline. Once the run is observed as &lt;code&gt;completed&lt;/code&gt;, Tekton Chains will take a snapshot of the completed TaskRun/PipelineRun, and start its core works in the order of &lt;strong&gt;&lt;em&gt;&lt;code&gt;formatting&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; (generate provenance json) -&amp;gt; &lt;strong&gt;&lt;em&gt;&lt;code&gt;signing&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; (sign the payload using the key configured by user) -&amp;gt; &lt;strong&gt;&lt;em&gt;&lt;code&gt;uploading&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; (upload the provenance and its signature to the storage configured by user).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/images/how-chains-works.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-configure-tekton-chains&#34;&gt;How to configure Tekton Chains&lt;/h2&gt;
&lt;p&gt;Tekton Chains supports both SLSA v0.2 and v1.0 provenance for both task-level and pipeline-level provenance.&lt;/p&gt;
&lt;p&gt;The following shows the mapping between slsa version and formatter name.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SLSA Version&lt;/th&gt;
&lt;th&gt;Formatter Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v1.0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;slsa/v2alpha3&lt;/code&gt; and &lt;code&gt;slsa/v2alpha4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0.2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;slsa/v1&lt;/code&gt; or &lt;code&gt;in-toto&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To configure Task-level provenance version&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.format&amp;#34;: &amp;#34;slsa/v1&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To configure Pipeline-level provenance version&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.pipelinerun.format&amp;#34;: &amp;#34;slsa/v1&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note:&lt;br&gt;
While Chains is able to generate both task-level and pipeline-level provenance at the same time, it&amp;rsquo;s not recommended to upload both to a storage backend because it would be confusing to have 2 different provenances for the same artifact.&lt;br&gt;
To disable Task-level provenance, simply config empty string &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; as the storage backend&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;&amp;gt; {&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.storage&amp;#34;: &amp;#34;&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To disable Pipeline-level provenance, simply config empty string &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; as the storage backend&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;&amp;gt; {&amp;#34;data&amp;#34;:{&amp;#34;artifacts.pipelinerun.storage&amp;#34;: &amp;#34;&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;how-to-configure-a-task-or-pipeline&#34;&gt;How to configure a Task or Pipeline&lt;/h2&gt;
&lt;p&gt;As mentioned in the &lt;a href=&#34;#glossary&#34;&gt;Glossary&lt;/a&gt;, SLSA provenance describes the build process of a particular artifact being produced. While Tekton Chains is able to capture the build process regardless of how the pipeline was configured, it is mandatory to signal Chains what the output and input artifacts are in the pipeline config. The way to do that is through the type hinting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Task-level Provenance: The type hinting carrying the references of input/output artifacts should be defined in the TaskSpec.&lt;/li&gt;
&lt;li&gt;Pipeline-level Provenance: The type hinting carrying the references of input/output artifacts can be defined either:
&lt;ul&gt;
&lt;li&gt;in the PipelineSpec&lt;/li&gt;
&lt;li&gt;in the TaskSpec. However, in this case, the feature flag &lt;a href=&#34;https://deploy-preview-726--tekton.netlify.app/docs/chains/config/#pipelinerun-configuration&#34;&gt;&lt;code&gt;artifacts.pipelinerun.enable-deep-inspection&lt;/code&gt;&lt;/a&gt; must be enabled to instruct Chains to dive deep into each child TaskRuns to look for type-hinting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;type-hinting&#34;&gt;Type Hinting&lt;/h2&gt;
&lt;p&gt;Type hinting is a way to let Chains to understand the input and output artifacts throughout a PipelineRun. Chains expects different type hinting names for inputs and outputs. However, both input and output artifacts should have the uri and digest components, which is the common thing in the following type hinting list.&lt;/p&gt;
&lt;h3 id=&#34;input-artifacts&#34;&gt;Input Artifacts&lt;/h3&gt;
&lt;p&gt;Input artifacts can be defined either in &lt;code&gt;params&lt;/code&gt; or &lt;code&gt;results&lt;/code&gt; using one of following options.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s worth noting that the value for the digest component needs to be precise commit SHA. It can&amp;rsquo;t be other mutable references i.e. tag, branch name and so on.&lt;/p&gt;
&lt;h4 id=&#34;git-results&#34;&gt;Git Results&lt;/h4&gt;
&lt;p&gt;In this approach, one can define the url of the source code repository and the precise commit sha digest in type hinting &lt;strong&gt;&lt;em&gt;exactly named as &lt;code&gt;CHAINS-GIT_URL&lt;/code&gt; and &lt;code&gt;CHAINS-GIT_COMMIT&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; respectively.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Example TaskRun&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;git-clone&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;params&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;url&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Repository URL to clone from.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;https://github.com/tektoncd/pipeline&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;revision&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Revision to checkout. (branch, tag, sha, ref, etc...)&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The precise URL that was fetched by this Task.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_COMMIT&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The precise commit SHA that was fetched by this Task.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-clone&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          #!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;https://github.com/tektoncd/pipeline&amp;#34; | tee $(results.CHAINS-GIT_URL.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;7f2f46e1b97df36b2b82d1b1d87c81b8b3d21601&amp;#34; | tee $(results.CHAINS-GIT_COMMIT.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Note: This can be either params or results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Param&lt;/em&gt;&lt;/strong&gt;: To surface a git URL/commit as the input artifact, add a parameter named &lt;code&gt;CHAINS-GIT_COMMIT&lt;/code&gt; and &lt;code&gt;CHAINS-GIT_URL&lt;/code&gt;. The value of these
parameters should be fed by some VCS task (e.g like this
&lt;a href=&#34;https://github.com/tektoncd/catalog/blob/ee409b23543881457c2f35cbd630ea55732b1856/task/git-clone/0.9/git-clone.yaml#L112-L115&#34;&gt;task&lt;/a&gt;) so that the reported url and revision are guaranteed to be the one that was fetched.
A &lt;code&gt;PipeLine&lt;/code&gt; example where another task &lt;code&gt;checkout&lt;/code&gt; has URL/commit as
task results:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;params&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_COMMIT&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;$(tasks.checkout.results.commit)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;$(tasks.checkout.results.url)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Result&lt;/em&gt;&lt;/strong&gt;: Alternatively, &lt;code&gt;CHAINS-GIT_COMMIT&lt;/code&gt; and &lt;code&gt;CHAINS-GIT_URL&lt;/code&gt; can be results instead.
Another &lt;code&gt;Pipeline&lt;/code&gt; example where results are used:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Repository URL used for buiding the image.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$(tasks.checkout.results.url)&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Repository commit used for building the image.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CHAINS-GIT_COMMIT&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;$(tasks.checkout.results.commit)&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;tasks&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;checkout&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;artifact_inputs&#34;&gt;&lt;code&gt;*ARTIFACT_INPUTS&lt;/code&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Note:&lt;br&gt;
&lt;code&gt;*&lt;/code&gt; indicates any expression&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this approach, one can group the url of the source code repository and the precise commit sha into a single object type hinting. The object type hinting only needs to have the &lt;strong&gt;&lt;em&gt;suffix &lt;code&gt;ARTIFACT_INPUTS&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; and have the 2 keys exactly named as &lt;code&gt;uri&lt;/code&gt; and &lt;code&gt;digest&lt;/code&gt;. This is particularly useful if there are multiple input artifacts. For example, one object type hinting can be &lt;code&gt;first_ARTIFACT_INPUTS&lt;/code&gt; and another one is &lt;code&gt;second_ARTIFACT_INPUTS&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The digest component must be in the format of &lt;code&gt;cryptographic hash algorithm name&lt;/code&gt; + &lt;code&gt;:&lt;/code&gt; + &lt;code&gt;a valid hex value&lt;/code&gt; i.e. &amp;ldquo;sha1:7f2f46e1b97df36b2b82d1b1d87c81b8b3d21601&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;Example TaskRun&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;git-clone&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;params&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;url&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Repository URL to clone from.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;https://github.com/tektoncd/pipeline&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;revision&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Revision to checkout. (branch, tag, sha, ref, etc...)&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;source_repo_ARTIFACT_INPUTS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The source code repo artifact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;object&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;properties&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;uri&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;digest&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-clone&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          #!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;{\&amp;#34;uri\&amp;#34;:\&amp;#34;https://github.com/tektoncd/pipeline\&amp;#34;, \&amp;#34;digest\&amp;#34;:\&amp;#34;sha1:7f2f46e1b97df36b2b82d1b1d87c81b8b3d21601\&amp;#34;}&amp;#34; &amp;gt; $(results.source_repo_ARTIFACT_INPUTS.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;hr&gt;
&lt;h3 id=&#34;output-artifacts&#34;&gt;Output Artifacts&lt;/h3&gt;
&lt;p&gt;Output artifacts should be defined in &lt;code&gt;results&lt;/code&gt; only, using one of following options.&lt;/p&gt;
&lt;h4 id=&#34;image_url--image_digest&#34;&gt;&lt;code&gt;*IMAGE_URL&lt;/code&gt; / &lt;code&gt;*IMAGE_DIGEST&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In this approach, one can write the url and digest of an output OCI artifact into 2 results that have same prefix, but the one for url has suffix &lt;code&gt;IMAGE_URL&lt;/code&gt; and the one for digest has suffix &lt;code&gt;IMAGE_DIGEST&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;IMAGE_URL&lt;/code&gt; component must be a valid container repository URL.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;IMAGE_DIGEST&lt;/code&gt; component must be in the format of &lt;code&gt;cryptographic hash algorithm name&lt;/code&gt; + &lt;code&gt;:&lt;/code&gt; + &lt;code&gt;a valid hex value&lt;/code&gt; i.e. &amp;ldquo;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;Example TaskRun&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;image-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first-image-IMAGE_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The precise URL of the OCI image built.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first-image-IMAGE_DIGEST&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The algorithm and digest of the OCI image built.&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          #!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;gcr.io/foo/bar&amp;#34; | tee $(results.first-image-IMAGE_URL.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee&amp;#34; | tee $(results.first-image-IMAGE_DIGEST.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h4 id=&#34;images&#34;&gt;&lt;code&gt;IMAGES&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Multiple images can also be specified by using a single &lt;code&gt;IMAGES&lt;/code&gt; Result.
The value of the &lt;code&gt;IMAGES&lt;/code&gt; result is a list of images, each qualified by digest.
The list of images can be separated by commas or by newlines.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Example TaskRun&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;image-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;IMAGES&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The multiple image artifacts&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          #!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;img1@sha256:digest1, img2@sha256:digest2&amp;#34; | tee $(results.IMAGES.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h4 id=&#34;artifact_uri--artifact_digest&#34;&gt;&lt;code&gt;*ARTIFACT_URI&lt;/code&gt; / &lt;code&gt;*ARTIFACT_DIGEST&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Similar to option 1 - &lt;code&gt;IMAGE_URL&lt;/code&gt; and &lt;code&gt;IMAGE_DIGEST&lt;/code&gt;, but just with different names.&lt;/p&gt;
&lt;h4 id=&#34;artifact_outputs&#34;&gt;&lt;code&gt;*ARTIFACT_OUTPUTS&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In this approach, one can group the url and digest of the output artifact a single object result. The object result only needs to have the &lt;strong&gt;&lt;em&gt;suffix &lt;code&gt;ARTIFACT_OUTPUTS&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt; and have the 2 keys exactly named as &lt;code&gt;uri&lt;/code&gt; and &lt;code&gt;digest&lt;/code&gt;. This is particularly useful if there are multiple artifacts produced throughout a task. For example, one object type hinting can be &lt;code&gt;first_ARTIFACT_OUTPUTS&lt;/code&gt; and another one is &lt;code&gt;second_ARTIFACT_OUTPUTS&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The digest component must be in the format of &lt;code&gt;cryptographic hash algorithm name&lt;/code&gt; + &lt;code&gt;:&lt;/code&gt; + &lt;code&gt;a valid hex value&lt;/code&gt; i.e. &amp;ldquo;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;Example TaskRun&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;image-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first-ARTIFACT_OUTPUTS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The first artifact built&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;object&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;properties&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;uri&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;digest&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          #!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;{\&amp;#34;uri\&amp;#34;:\&amp;#34;gcr.io/foo/bar\&amp;#34;, \&amp;#34;digest\&amp;#34;:\&amp;#34;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee\&amp;#34;}&amp;#34; &amp;gt; $(results.first-ARTIFACT_OUTPUTS.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id=&#34;v2alpha4-formatter&#34;&gt;&lt;code&gt;v2alpha4&lt;/code&gt; formatter&lt;/h2&gt;
&lt;p&gt;Starting with version &lt;code&gt;v2alpha4&lt;/code&gt;, the type-hinted object results value now can include a new boolean flag called &lt;code&gt;isBuildArtifact&lt;/code&gt;. When set to &lt;code&gt;true&lt;/code&gt;, this flag indicates the output artifact should be considered as &lt;code&gt;subject&lt;/code&gt; in the executed TaskRun/PipelineRun.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;isBuildArtifact&lt;/code&gt; can be set in results whose type-hint uses the &lt;code&gt;*ARTIFACT_OUTPUTS&lt;/code&gt; format. Results using the &lt;code&gt;IMAGES&lt;/code&gt; and &lt;code&gt;*IMAGE_URL&lt;/code&gt; / &lt;code&gt;*IMAGE_DIGEST&lt;/code&gt; type-hint format will still be considered as &lt;code&gt;subject&lt;/code&gt; automatically; all other results will be classified as &lt;code&gt;byProduct&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For instance, in the following TaskRun:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;image-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first-ARTIFACT_OUTPUTS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The first artifact built&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;object&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;properties&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;uri&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;digest&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;second-ARTIFACT_OUTPUTS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The second artifact built&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;object&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;properties&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;uri&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;digest&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;isBuildArtifact&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;third-IMAGE_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;third-IMAGE_DIGEST&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;IMAGES&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dummy-build&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bash:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;{\&amp;#34;uri\&amp;#34;:\&amp;#34;gcr.io/foo/img1\&amp;#34;, \&amp;#34;digest\&amp;#34;:\&amp;#34;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee\&amp;#34;}&amp;#34; &amp;gt; $(results.first-ARTIFACT_OUTPUTS.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;{\&amp;#34;uri\&amp;#34;:\&amp;#34;gcr.io/foo/img2\&amp;#34;, \&amp;#34;digest\&amp;#34;:\&amp;#34;sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5\&amp;#34;, \&amp;#34;isBuildArtifact\&amp;#34;:\&amp;#34;true\&amp;#34;}&amp;#34; &amp;gt; $(results.second-ARTIFACT_OUTPUTS.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;gcr.io/foo/bar&amp;#34; | tee $(results.third-IMAGE_URL.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b6&amp;#34; | tee $(results.third-IMAGE_DIGEST.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;          echo -n &amp;#34;gcr.io/test/img3@sha256:2996854378975c2f8011ddf0526975d1aaf1790b404da7aad4bf25293055bc8b, gcr.io/test/img4@sha256:ef334b5d9704da9b325ed6d4e3e5327863847e2da6d43f81831fd1decbdb2213&amp;#34; | tee $(results.IMAGES.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;second-ARTIFACT_OUTPUTS&lt;/code&gt;, &lt;code&gt;third-IMAGE_URL&lt;/code&gt;/&lt;code&gt;third-IMAGE_DIGEST&lt;/code&gt;, and &lt;code&gt;IMAGES&lt;/code&gt; will be considered as &lt;code&gt;subject&lt;/code&gt;. &lt;code&gt;first-ARTIFACT_OUTPUTS&lt;/code&gt; doesn&amp;rsquo;t specify &lt;code&gt;isBuildArtifact: true&lt;/code&gt; so it is not count as &lt;code&gt;subject&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Chains&amp;rsquo; &lt;code&gt;v2alpha4&lt;/code&gt; formatter now automatically reads type-hinted results from StepActions associated to the executed TaskRun/PipelineRun; users no longer need to manually surface these results from the StepActions when the appropriate type hints are in place. PipelineRuns require &lt;code&gt;artifacts.pipelinerun.enable-deep-inspection: true&lt;/code&gt; for this functionality to work. For instance, with the following TaskRun:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1alpha1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;StepAction&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;img-builder&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;busybox:glibc&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;results&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;first-ARTIFACT_OUTPUTS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;The first artifact built&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;object&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;properties&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;uri&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;digest&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;isBuildArtifact&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;second-IMAGE_URL&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;second-IMAGE_DIGEST&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;string&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;script&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;    echo -n &amp;#34;{\&amp;#34;uri\&amp;#34;:\&amp;#34;gcr.io/foo/img1\&amp;#34;, \&amp;#34;digest\&amp;#34;:\&amp;#34;sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee\&amp;#34;, \&amp;#34;isBuildArtifact\&amp;#34;: \&amp;#34;true\&amp;#34; }&amp;#34; &amp;gt; $(step.results.first-ARTIFACT_OUTPUTS.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;    echo -n &amp;#34;gcr.io/foo/bar&amp;#34; &amp;gt; $(step.results.second-IMAGE_URL.path)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-style:italic&#34;&gt;    echo -n &amp;#34;sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b6&amp;#34; &amp;gt; $(step.results.second-IMAGE_DIGEST.path)&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#0cf;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tekton.dev/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TaskRun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;taskrun&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;taskSpec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;steps&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;action-runner&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;ref&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;img-builder&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chains Will read &lt;code&gt;first-ARTIFACT_OUTPUTS&lt;/code&gt; and &lt;code&gt;second-IMAGE_URL/second-IMAGE_DIGEST&lt;/code&gt; from the StepAction and classify them as a &lt;code&gt;subject&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;besides-inputsoutputs&#34;&gt;Besides inputs/outputs&lt;/h2&gt;
&lt;p&gt;Tekton Chains is also able to capture the feature flags being used for Tekton Pipelines controller and the origin of the build configuration file with immutable references such as task.yaml and pipeline.yaml. However, those fields in Tekton Pipelines are gated by a dedicated feature flag. Therefore, the feature flag needs to be enabled to let Tekton Pipelines controller to populate these fields.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch -n tekton-pipelines configmap feature-flags -p &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;enable-provenance-in-status&amp;#34;:&amp;#34;true&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/sigstore/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/sigstore/</guid>
      <description>
        
        
        &lt;h1 id=&#34;sigstore&#34;&gt;Sigstore&lt;/h1&gt;
&lt;h2 id=&#34;transparency-log-support&#34;&gt;Transparency Log Support&lt;/h2&gt;
&lt;p&gt;Chains supports automatic binary uploads to a transparency log and defaults to
using &lt;a href=&#34;https://github.com/sigstore/rekor&#34;&gt;Rekor&lt;/a&gt;. If enabled, all signatures and
attestations will be logged. The entry ID will be appended as an annotation on a
&lt;code&gt;TaskRun&lt;/code&gt; or a &lt;code&gt;PipelineRun&lt;/code&gt; once Chains has uploaded it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/transparency&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;https://rekor.sigstore.dev/7599&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;enabling-transparency-log-support&#34;&gt;Enabling Transparency Log Support&lt;/h3&gt;
&lt;p&gt;To enable, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;transparency.enabled&amp;#34;: &amp;#34;true&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Right now, Chains default to storing entries in the public Rekor instance
(&lt;a href=&#34;https://rekor.sigstore.dev&#34;&gt;https://rekor.sigstore.dev&lt;/a&gt;). To customize where entries are stored, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;transparency.url&amp;#34;: &amp;#34;&amp;lt;YOUR URL&amp;gt;&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;keyless-signing-mode&#34;&gt;Keyless Signing Mode&lt;/h2&gt;
&lt;p&gt;Chains also supports a keyless signing mode with
&lt;a href=&#34;https://github.com/sigstore/fulcio&#34;&gt;Fulcio&lt;/a&gt;, Sigstore&amp;rsquo;s free root certificate
authority.&lt;/p&gt;
&lt;p&gt;In this mode, instead of setting up a signing key, Chains would request an
identity token from the cluster it is running in. This identity token will be
used to authorize a Fulcio certificate for a Tekton artifact (OCI image,
&lt;code&gt;TaskRun&lt;/code&gt;, or &lt;code&gt;PipelineRun&lt;/code&gt;). This feature has been tested on GKE,
&lt;a href=&#34;https://www.chainguard.dev/unchained/keyless-signing-with-tekton-on-amazon-eks-2&#34;&gt;EKS&lt;/a&gt;,
and
&lt;a href=&#34;https://www.chainguard.dev/unchained/keyless-signing-with-tekton-on-aks&#34;&gt;AKS&lt;/a&gt;,
but should work on any environment that supports
&lt;a href=&#34;https://docs.sigstore.dev/cosign/openid_signing&#34;&gt;Cosign OIDC signing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once Chains has successfully requested a certificate, it will store the cert as
a base64 encoded annotation on the &lt;code&gt;TaskRun&lt;/code&gt; or &lt;code&gt;PipelineRun&lt;/code&gt; , along with the
payload and signature.&lt;/p&gt;
&lt;p&gt;This can look like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;Annotations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/cert-taskrun-57e7ef8e-13fb-4d27-af6e-dc4d68f73cc4&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/chain-taskrun-57e7ef8e-13fb-4d27-af6e-dc4d68f73cc4&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/payload-taskrun-57e7ef8e-13fb-4d27-af6e-dc4d68f73cc4&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;eyJfdHlwZSI6ImJ1aWxkLWNoYWlucy01dnhycyIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Rla3Rvbi5kZXYvY2hhaW5zL3Byb3ZlbmFuY2UiLCJzdWJqZWN0IjpbeyJuYW1lIj...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/signature-taskrun-57e7ef8e-13fb-4d27-af6e-dc4d68f73cc4&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;eyJwYXlsb2FkVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5pbi10b3RvK2pzb24iLCJwYXlsb2FkIjoiZXlKZmRIbHdaU0k2SW1KMWFXeGtMV05vWVdsdWN5MDFkbmh5Y3lJc0luQnlaV1...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/signed&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;chains.tekton.dev/transparency&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;https://rekor.sigstore.dev/7599&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;pipeline.tekton.dev/release&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v0.25.0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;enabling-keyless-signing-mode&#34;&gt;Enabling Keyless Signing Mode&lt;/h3&gt;
&lt;p&gt;To enable singing with Fulcio, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;signers.x509.fulcio.enabled&amp;#34;: &amp;#34;true&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;better-way-of-navigating-in-transparency-log-with-rekor-search-ui&#34;&gt;Better Way Of Navigating in Transparency Log with rekor-search-ui&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;chains.tekton.dev/transparency&lt;/code&gt; annotation on &lt;code&gt;TaskRun&lt;/code&gt; and &lt;code&gt;PipelineRun&lt;/code&gt; resources holds the URL to access the transparency log entry via Rekor&amp;rsquo;s API. It is also possible to view the log entry via &lt;a href=&#34;https://github.com/chainguard-dev/rekor-search-ui&#34;&gt;Rekor&amp;rsquo;s web interface&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is already a public good instance of the Rekor Search UI provided by the Chainguard team running at &lt;a href=&#34;https://rekor.tlog.dev&#34;&gt;https://rekor.tlog.dev&lt;/a&gt;, which you can use to display the details of the log entry within the transparency log.&lt;/p&gt;
&lt;p&gt;If you want to search your entry via &lt;code&gt;logIndex,&lt;/code&gt; you can use the following URL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://rekor.tlog.dev/?logIndex=735223&#34;&gt;https://rekor.tlog.dev/?logIndex=735223&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But the &lt;code&gt;logIndex&lt;/code&gt; is not the only option. You could also use &lt;code&gt;email,&lt;/code&gt; &lt;code&gt;hash,&lt;/code&gt; &lt;code&gt;commit SHA,&lt;/code&gt; and &lt;code&gt;UUID&lt;/code&gt; as an option to search the transparency log entry.&lt;/p&gt;
&lt;p&gt;For example, you can search via &lt;code&gt;email&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://rekor.tlog.dev/?email=developerguyn@gmail.com&#34;&gt;https://rekor.tlog.dev/?email=developerguyn@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/experimental/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/experimental/</guid>
      <description>
        
        
        &lt;h1 id=&#34;experimental-features&#34;&gt;Experimental Features&lt;/h1&gt;
&lt;p&gt;This doc covers experimental features in Tekton Chains.&lt;/p&gt;
&lt;p&gt;Currently, experimental features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#pubsub-storage-backend-support&#34;&gt;PubSub Storage Backend Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pubsub-storage-backend-support&#34;&gt;PubSub Storage Backend Support&lt;/h2&gt;
&lt;p&gt;Support for PubSub storage backend was introduced in chains. The first PubSub
provider implementation is Kafka, and more may follow in the future.&lt;/p&gt;
&lt;h3 id=&#34;kafka&#34;&gt;Kafka&lt;/h3&gt;
&lt;p&gt;To enable the Kafka backend run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;: {storage.pubsub.provider&amp;#34;: &amp;#34;kafka&amp;#34;,&amp;#34;storage.pubsub.topic&amp;#34;: &amp;#34;chains&amp;#34;, &amp;#34;storage.pubsub.kafka.bootstrap.servers&amp;#34;:&amp;#34;kafka-0.kafka-headless.default.svc.cluster.local:9092&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that the &lt;code&gt;storage.pubsub.kafka.bootstrap.servers&lt;/code&gt; value needs to be
adjusted to point to the list of &lt;a href=&#34;https://kafka.apache.org/documentation/#producerconfigs_bootstrap.servers&#34;&gt;bootstrap servers&lt;/a&gt; your cluster is connected
to.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/getting-started-tutorial/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/getting-started-tutorial/</guid>
      <description>
        
        
        &lt;h1 id=&#34;chains-getting-started-tutorial&#34;&gt;Chains Getting Started Tutorial&lt;/h1&gt;
&lt;p&gt;This tutorial will guide you through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generating your own keypair and storing it as a Kubernetes Secret&lt;/li&gt;
&lt;li&gt;Configuring Tekton Chains backend storage&lt;/li&gt;
&lt;li&gt;Creating a sample TaskRun&lt;/li&gt;
&lt;li&gt;Retrieving the signature and payload from the signed TaskRun&lt;/li&gt;
&lt;li&gt;Verifying the signature&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will be creating a &lt;code&gt;TaskRun&lt;/code&gt;, signing it, and storing the signature and the
payload as annotations on the &lt;code&gt;TaskRun&lt;/code&gt; itself. So, no additional authentication
should be required!&lt;/p&gt;
&lt;p&gt;For this tutorial we will use the &lt;a href=&#34;#x509&#34;&gt;x509&lt;/a&gt; key type.&lt;/p&gt;
&lt;h2 id=&#34;x509&#34;&gt;x509&lt;/h2&gt;
&lt;p&gt;To generate your own encrypted x509 keypair and save it as a Kubernetes secret,
install &lt;a href=&#34;https://github.com/sigstore/cosign&#34;&gt;cosign&lt;/a&gt; and run the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign generate-key-pair k8s://tekton-chains/signing-secrets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/sigstore/cosign&#34;&gt;cosign&lt;/a&gt; will prompt you for a password, which will be stored in a Kubernetes
secret named signing-secrets in the tekton-chains namespace.&lt;/p&gt;
&lt;h2 id=&#34;configuring-tekton-chains&#34;&gt;Configuring Tekton Chains&lt;/h2&gt;
&lt;p&gt;You will need to make sure that OCI storage is disabled and that the taskrun
storage and format is set to &lt;code&gt;tekton&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can set these fields by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.oci.storage&amp;#34;: &amp;#34;&amp;#34;, &amp;#34;artifacts.taskrun.format&amp;#34;:&amp;#34;in-toto&amp;#34;, &amp;#34;artifacts.taskrun.storage&amp;#34;: &amp;#34;tekton&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then restart the controller to ensure it picks up the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete po -n tekton-chains -l &lt;span style=&#34;color:#033&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;tekton-chains-controller
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This tells Chains to use the default &lt;code&gt;tekton&lt;/code&gt; artifact (enabled by default) and
disable the &lt;code&gt;OCI&lt;/code&gt; artifact.&lt;/p&gt;
&lt;p&gt;To create a simple &lt;code&gt;TaskRun&lt;/code&gt;, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output should be similar to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;taskrun.tekton.dev/build-push-run-output-image-qbjvh created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait for it to finish (all the steps should be marked as &lt;strong&gt;Completed&lt;/strong&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ tkn tr describe --last
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;...truncated output...&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🦶 Steps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                            STATUS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∙ create-dir-builtimage-9467f   Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∙ git-source-sourcerepo-p2sk8   Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∙ build-and-push                Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∙ &lt;span style=&#34;color:#366&#34;&gt;echo&lt;/span&gt;                          Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∙ image-digest-exporter-xlkn7   Completed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, retrieve the signature and payload from the object (they are stored as
base64-encoded annotations):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;TASKRUN_UID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;tkn tr describe --last -o  &lt;span style=&#34;color:#033&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{.metadata.uid}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tkn tr describe --last -o &lt;span style=&#34;color:#033&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$TASKRUN_UID&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;}&amp;#34;&lt;/span&gt; | base64 -d &amp;gt; sig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, we can check the signature with &lt;a href=&#34;https://github.com/sigstore/cosign&#34;&gt;cosign&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cosign verify-blob-attestation --insecure-ignore-tlog --key k8s://tekton-chains/signing-secrets --signature sig --type slsaprovenance --check-claims&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#366&#34;&gt;false&lt;/span&gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Verified OK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;If using Cosign v1&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cosign verify-blob --key k8s://tekton-chains/signing-secrets --signature sig sig
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Verified OK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Now we have a verifiable record of the &lt;code&gt;TaskRun&lt;/code&gt;!&lt;/p&gt;
&lt;h2 id=&#34;what-you-just-created&#34;&gt;What you just created&lt;/h2&gt;
&lt;p&gt;This diagram shows what you just deployed:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/docs/tutorials/images/getting_started.png&#34; alt=&#34;getting-started-setup&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/signed-provenance-tutorial/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/signed-provenance-tutorial/</guid>
      <description>
        
        
        &lt;h1 id=&#34;chains-signed-provenance-tutorial&#34;&gt;Chains Signed Provenance Tutorial&lt;/h1&gt;
&lt;p&gt;This tutorial will cover how to set up Chains to sign OCI images built in Tekton, and how to automatically generate and sign in-toto attestations for each image.
This tutorial will also cover how to store these attestations in a transparency log and query the log for the attestation.&lt;/p&gt;
&lt;p&gt;This tutorial will guide you through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generating your own keypair and storing it as a Kubernetes Secret&lt;/li&gt;
&lt;li&gt;Setting up authentication for your OCI registry to store images, image signatures and signed image attestations&lt;/li&gt;
&lt;li&gt;Configuring Tekton Chains to generate and sign provenance&lt;/li&gt;
&lt;li&gt;Building an image with kaniko in a Tekton TaskRun&lt;/li&gt;
&lt;li&gt;Verifying the signed image and the signed provenance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;A Kubernetes cluster with the following installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tekton Chains&lt;/li&gt;
&lt;li&gt;Tekton Pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;generate-a-key-pair&#34;&gt;Generate a Key Pair&lt;/h2&gt;
&lt;p&gt;First, we&amp;rsquo;ll generate an encrypted x509 keypair and save it as a Kubernetes secret.
Install &lt;a href=&#34;https://github.com/sigstore/cosign&#34;&gt;cosign&lt;/a&gt; and run the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign generate-key-pair k8s://tekton-chains/signing-secrets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cosign will prompt you for a password, which will be stored in a Kubernetes secret named &lt;code&gt;signing-secrets&lt;/code&gt; in the &lt;code&gt;tekton-chains&lt;/code&gt; namespace.&lt;/p&gt;
&lt;p&gt;The public key will be written to a local file called &lt;code&gt;cosign.pub&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;set-up-authentication&#34;&gt;Set up Authentication&lt;/h2&gt;
&lt;p&gt;There are two forms of authentication that need to be set up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Chains controller will be pushing signatures to an OCI registry using the credentials linked to your &lt;code&gt;TaskRun&lt;/code&gt;&amp;rsquo;s service account. See our &lt;a href=&#34;https://deploy-preview-726--tekton.netlify.app/docs/chains/authentication/&#34;&gt;authentication doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Kaniko Task that will build and push the image needs push permissions for your registry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To set up auth for the Kaniko Task, you&amp;rsquo;ll need a Kubernetes secret of a docker &lt;code&gt;config.json&lt;/code&gt; file which contains the required auth.
You can create the secret by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret generic &lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;DOCKERCONFIG_SECRET_NAME&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt; --from-file &lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;PATH TO CONFIG.JSON&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuring-tekton-chains&#34;&gt;Configuring Tekton Chains&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need to make these changes to the Tekton Chains Config:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;artifacts.taskrun.format=slsa/v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;artifacts.taskrun.storage=oci&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;artifacts.oci.storage=oci&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transparency.enabled=true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can set these fields by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.format&amp;#34;: &amp;#34;slsa/v1&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.storage&amp;#34;: &amp;#34;oci&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.oci.storage&amp;#34;: &amp;#34;oci&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;transparency.enabled&amp;#34;: &amp;#34;true&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;, you can continue to use the older alias of &lt;code&gt;slsa/v1&lt;/code&gt;: &lt;code&gt;in-toto&lt;/code&gt; above.&lt;/p&gt;
&lt;p&gt;This tells Chains to generate an in-toto attestation and store it in the specified OCI registry.
Attestations will also be stored in &lt;a href=&#34;https://github.com/sigstore/rekor&#34;&gt;rekor&lt;/a&gt; since transparency is enabled.&lt;/p&gt;
&lt;h2 id=&#34;start-the-kaniko-task&#34;&gt;Start the Kaniko Task&lt;/h2&gt;
&lt;p&gt;Great, now that the setup is done we&amp;rsquo;re finally ready to build an image with kaniko!&lt;/p&gt;
&lt;p&gt;First, apply the &lt;a href=&#34;https://github.com/tektoncd/chains/tree/main/examples/kaniko/kaniko.yaml&#34;&gt;Kaniko Task&lt;/a&gt; to your cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f examples/kaniko/kaniko.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and set the following environment variables:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#033&#34;&gt;REGISTRY&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=[&lt;/span&gt;The registry you&lt;span style=&#34;color:#a00;background-color:#faa&#34;&gt;&amp;#39;&lt;/span&gt;ll be pushing to&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#033&#34;&gt;DOCKERCONFIG_SECRET_NAME&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=[&lt;/span&gt;The name of the secret with the docker config.json&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, you can start the Kaniko Task with the Tekton CLI tool, &lt;a href=&#34;https://github.com/tektoncd/cli&#34;&gt;tkn&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tkn task start --param &lt;span style=&#34;color:#033&#34;&gt;IMAGE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$REGISTRY&lt;/span&gt;/kaniko-chains --use-param-defaults --workspace &lt;span style=&#34;color:#033&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;source,emptyDir&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; --workspace &lt;span style=&#34;color:#033&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;dockerconfig,secret&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$DOCKERCONFIG_SECRET_NAME&lt;/span&gt; kaniko-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can watch the logs of this Task until they complete; if authentication is set up correctly than the final image should be pushed to &lt;code&gt;$REGISTRY/kaniko-chains&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;verifying-the-image-and-attestation&#34;&gt;Verifying the Image and Attestation&lt;/h2&gt;
&lt;p&gt;Once the TaskRun has successfully completed, you&amp;rsquo;ll need to wait a few seconds for Chains to generate provenance and sign it.&lt;/p&gt;
&lt;p&gt;Once you see the &lt;code&gt;chains.tekton.dev/signed=true&lt;/code&gt; annotation on your TaskRun you know that Chains has completed the signing process and you&amp;rsquo;re ready to move on to verification:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get tr &lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;TASKRUN_NAME&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt; -o json | jq -r .metadata.annotations
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;chains.tekton.dev/signed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To verify the image and the attestation, we&amp;rsquo;ll use &lt;code&gt;cosign&lt;/code&gt; again:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign verify --key cosign.pub &lt;span style=&#34;color:#033&#34;&gt;$REGISTRY&lt;/span&gt;/kaniko-chains
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign verify-attestation --key cosign.pub --type slsaprovenance &lt;span style=&#34;color:#033&#34;&gt;$REGISTRY&lt;/span&gt;/kaniko-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see verification output for both!&lt;/p&gt;
&lt;h2 id=&#34;finding-provenance-in-rekor&#34;&gt;Finding Provenance in Rekor&lt;/h2&gt;
&lt;p&gt;To find provenance for the image in Rekor, first get the digest of the &lt;code&gt;$REGISTRY/kaniko-chains&lt;/code&gt; image you just built.
You can look this up in the TaskRun, or pull the image to get the digest.&lt;/p&gt;
&lt;p&gt;You can then search rekor to find all entries that match the sha256 digest of the image you just built with the &lt;a href=&#34;https://github.com/sigstore/rekor/releases/&#34;&gt;rekor-cli&lt;/a&gt; tool:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rekor-cli search --sha &lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;IMAGE_DIGEST&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;UUID1&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;UUID2&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The search will print out the UUIDs of matching entries.
It may take a little guessing, but one of those UUIDs holds the attestation.
You can see the attestation by using &lt;a href=&#34;https://github.com/stedolan/jq&#34;&gt;jq&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rekor-cli get --uuid &lt;span style=&#34;color:#555&#34;&gt;[&lt;/span&gt;UUID&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt; --format json | jq -r .Attestation | base64 --decode | jq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Congratulations! You have officially built an image, signed it, and generated signed provenance for it with Tekton Chains 🎉&lt;/p&gt;
&lt;h2 id=&#34;what-you-just-created&#34;&gt;What you just created&lt;/h2&gt;
&lt;p&gt;This diagram shows what you just deployed:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/docs/tutorials/images/signed_provenance.png&#34; alt=&#34;signed-provenance-setup&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/provenance-storage-mongodb-tutorial/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/provenance-storage-mongodb-tutorial/</guid>
      <description>
        
        
        &lt;h1 id=&#34;using-docdb-mongodb-as-storage-for-tekton-chains-signed-artifacts&#34;&gt;Using DocDB (MongoDB) as storage for Tekton Chains signed artifacts&lt;/h1&gt;
&lt;p&gt;This tutorial will guide you through setting up &lt;strong&gt;MongoDB&lt;/strong&gt; as the storage backend for Tekton Chains. We will cover deploying a MongoDB instance, securely configuring authentication using Kubernetes Secrets, and understanding the different configuration options available.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before starting, ensure you have the following installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Cluster&lt;/strong&gt;: A local cluster like &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;kind&lt;/a&gt; is sufficient.
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind create cluster --name chains-mongo-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubectl&lt;/strong&gt;: The Kubernetes command-line tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cosign&lt;/strong&gt;: For generating signing keys. &lt;a href=&#34;https://docs.sigstore.dev/cosign/system_config/installation/&#34;&gt;Installation Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;step-1-install-tekton-pipelines-and-chains&#34;&gt;Step 1: Install Tekton Pipelines and Chains&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# Install Tekton Pipelines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f  https://infra.tekton.dev/tekton-releases/pipeline/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# Install Tekton Chains&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f https://infra.tekton.dev/tekton-releases/chains/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wait for the components to be ready:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl &lt;span style=&#34;color:#366&#34;&gt;wait&lt;/span&gt; --for&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;condition&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;Ready pods --all -n tekton-chains --timeout&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;60s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-2-set-up-signing-keys&#34;&gt;Step 2: Set up Signing Keys&lt;/h2&gt;
&lt;p&gt;Generate a key pair for signing artifacts and store it as a Kubernetes Secret.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# Generate key pair and create the secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign generate-key-pair k8s://tekton-chains/signing-secrets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;## Step 3: Deploy a MongoDB Instance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For this tutorial, we will deploy a simple MongoDB instance inside your cluster and expose it via a Service on port 27017. &lt;span style=&#34;color:#555&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f60&#34;&gt;27017&lt;/span&gt; is the standard port &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;for&lt;/span&gt; MongoDB servers.&lt;span style=&#34;color:#555&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;```&lt;/span&gt;shell
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# Run a MongoDB pod using the standard port 27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl run mongo1 --image&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;mongo:6 --port&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f60&#34;&gt;27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;# Expose the pod as a Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl expose pod mongo1 --name&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;mongo1-svc --port&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f60&#34;&gt;27017&lt;/span&gt; --target-port&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f60&#34;&gt;27017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your MongoDB connection string is now: &lt;code&gt;mongodb://mongo1-svc.default:27017&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;step-4-securely-configure-mongodb-authentication&#34;&gt;Step 4: Securely Configure MongoDB Authentication&lt;/h2&gt;
&lt;p&gt;Instead of hardcoding the connection string in the Chains configuration, we will store it in a Kubernetes Secret and mount it into the Chains controller.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Secret&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, write the connection string to a file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;echo&lt;/span&gt; -n &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;mongodb://mongo1-svc.default:27017&amp;#34;&lt;/span&gt; &amp;gt; mongo-url.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a secret named &lt;code&gt;mongo-secret&lt;/code&gt; containing this file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret generic mongo-secret &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  -n tekton-chains &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --from-file&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;mongo-url&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;mongo-url.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mount the Secret to the Chains Controller&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We need to update the Chains controller deployment to mount this secret so the application can read the connection string from a file.&lt;/p&gt;
&lt;p&gt;We will patch the deployment to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a volume for the &lt;code&gt;mongo-secret&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mount that volume to &lt;code&gt;/etc/secrets/mongo&lt;/code&gt;.
(This patch assumes the controller is the first controller)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch deployment tekton-chains-controller &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  -n tekton-chains &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --type&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;json&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;[
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;op&amp;#34;: &amp;#34;add&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;path&amp;#34;: &amp;#34;/spec/template/spec/volumes/-&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;value&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        &amp;#34;name&amp;#34;: &amp;#34;mongo-secret&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        &amp;#34;secret&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          &amp;#34;secretName&amp;#34;: &amp;#34;mongo-secret&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;op&amp;#34;: &amp;#34;add&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;path&amp;#34;: &amp;#34;/spec/template/spec/containers/0/volumeMounts/-&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      &amp;#34;value&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        &amp;#34;name&amp;#34;: &amp;#34;mongo-secret&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        &amp;#34;mountPath&amp;#34;: &amp;#34;/etc/secrets/mongo&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        &amp;#34;readOnly&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  ]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restart the controller to apply the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl rollout restart deploy/tekton-chains-controller -n tekton-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-5-configure-chains-to-use-docdb&#34;&gt;Step 5: Configure Chains to use DocDB&lt;/h2&gt;
&lt;p&gt;Now we configure Chains to use the &lt;code&gt;docdb&lt;/code&gt; backend and point it to the mounted secret file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains --type merge -p &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  &amp;#34;data&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    &amp;#34;artifacts.taskrun.storage&amp;#34;: &amp;#34;docdb&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    &amp;#34;artifacts.pipelinerun.storage&amp;#34;: &amp;#34;docdb&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    &amp;#34;storage.docdb.url&amp;#34;: &amp;#34;mongo://tekton-chains/attestations?id_field=name&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    &amp;#34;storage.docdb.mongo-server-url-path&amp;#34;: &amp;#34;/etc/secrets/mongo/mongo-url&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Explanation of Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;artifacts.taskrun.storage&lt;/code&gt;: Tells Chains to store TaskRun artifacts in &lt;code&gt;docdb&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.docdb.url&lt;/code&gt;: The Go Cloud URL for the collection. &lt;code&gt;mongo://&lt;/code&gt; indicates MongoDB, &lt;code&gt;tekton-chains&lt;/code&gt; is the database, &lt;code&gt;attestations&lt;/code&gt; is the collection, and &lt;code&gt;id_field=_id&lt;/code&gt; sets the primary key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt;: The absolute path to the file containing the connection string (which we mounted in Step 4).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-priority-for-mongodb-url&#34;&gt;Configuration Priority for MongoDB URL&lt;/h2&gt;
&lt;p&gt;Chains offers multiple ways to provide the MongoDB connection string. They are checked in the following order of priority (highest to lowest):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt;&lt;/strong&gt; (Recommended)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: Path to a specific file containing the connection string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: When mounting a specific secret key as a file (as done in this tutorial).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;/etc/secrets/mongo/mongo-url&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;storage.docdb.mongo-server-url-dir&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: Path to a directory. Chains looks for a file named &lt;code&gt;MONGO_SERVER_URL&lt;/code&gt; inside this directory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: When mounting a whole secret or directory where the filename is implicitly expected to be &lt;code&gt;MONGO_SERVER_URL&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;storage.docdb.mongo-server-url&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: The connection string value directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Quick testing or non-sensitive environments. &lt;strong&gt;Not recommended&lt;/strong&gt; for production as it exposes credentials in the ConfigMap.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;MONGO_SERVER_URL&lt;/code&gt; Environment Variable&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: An environment variable set on the controller pod.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Legacy configuration or 12-factor app patterns where config maps aren&amp;rsquo;t used.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step-6-verify-the-setup&#34;&gt;Step 6: Verify the Setup&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a TaskRun&lt;/strong&gt;
Create a simple TaskRun to generate an artifact.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create -f - &lt;span style=&#34;color:#c30&#34;&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;apiVersion: tekton.dev/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;kind: TaskRun
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  generateName: simple-task-
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  taskSpec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    steps:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    - name: echo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      image: alpine
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      script: |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        echo &amp;#34;Hello World&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Logs&lt;/strong&gt;
Watch the Chains controller logs to see the artifact being stored.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl logs -f deploy/tekton-chains-controller -n tekton-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see messages indicating successful storage to DocDB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Query MongoDB&lt;/strong&gt;
Connect to the MongoDB pod to verify the data exists.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl &lt;span style=&#34;color:#366&#34;&gt;exec&lt;/span&gt; -it mongo1 -- mongosh --eval &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;use tekton-chains; db.attestations.find()&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see the stored provenance documents.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;understanding-stored-artifacts&#34;&gt;Understanding Stored Artifacts&lt;/h2&gt;
&lt;p&gt;When Tekton Chains processes a TaskRun or PipelineRun, it generates provenance (attestation) and signs it. When using the &lt;code&gt;docdb&lt;/code&gt; backend, these artifacts are stored as documents in your MongoDB collection.&lt;/p&gt;
&lt;h3 id=&#34;what-artifacts-are-stored&#34;&gt;What Artifacts are Stored?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TaskRun / PipelineRun Provenance&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By enabling &lt;code&gt;artifacts.taskrun.storage: docdb&lt;/code&gt; (or &lt;code&gt;artifacts.pipelinerun.storage: docdb&lt;/code&gt;), Chains stores the signed provenance of the execution itself.&lt;/li&gt;
&lt;li&gt;The payload is typically in &lt;strong&gt;SLSA&lt;/strong&gt; (Supply-chain Levels for Software Artifacts) format.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OCI Image Signatures&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you enable &lt;code&gt;artifacts.oci.storage: docdb&lt;/code&gt;, Chains can also store signatures for built container images in the database, rather than attaching them to the container registry.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;document-schema&#34;&gt;Document Schema&lt;/h3&gt;
&lt;p&gt;Each artifact is stored as a single document with the following fields:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Field&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Type&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;_id&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;String&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The unique identifier for the document (e.g., &lt;code&gt;taskrun-uid&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;String&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The name/key of the artifact.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signed&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Binary&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The raw payload that was signed (e.g., the SLSA provenance JSON).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;signature&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;String&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The base64-encoded signature of the payload.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;cert&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;String&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The certificate used for signing (if using X.509).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;chain&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;String&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The certificate chain (if applicable).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Object&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;The unmarshaled JSON object of the payload. This allows you to query fields directly (e.g., &lt;code&gt;db.attestations.find({&amp;quot;object.predicate.buildType&amp;quot;: &amp;quot;...&amp;quot;})&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example Document (JSON representation):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-simple-task-abcde&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-simple-task-abcde&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;signed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a00;background-color:#faa&#34;&gt;&amp;lt;Binary&lt;/span&gt; &lt;span style=&#34;color:#a00;background-color:#faa&#34;&gt;Data&amp;gt;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;signature&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;MEUCIQD...&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;https://in-toto.io/Statement/v0.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;subject&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a00;background-color:#faa&#34;&gt;...&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;predicateType&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;https://slsa.dev/provenance/v0.2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;predicate&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#a00;background-color:#faa&#34;&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;advanced-hot-reloading-secrets&#34;&gt;Advanced: Hot Reloading Secrets&lt;/h2&gt;
&lt;p&gt;One advantage of using &lt;code&gt;storage.docdb.mongo-server-url-path&lt;/code&gt; with Kubernetes Secrets is that Chains watches the file for changes. If you rotate your database credentials and update the Secret, Kubernetes updates the mounted file, and Chains automatically reloads the connection string without needing a restart.&lt;/p&gt;
&lt;p&gt;To test this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Spin up a second MongoDB instance (&lt;code&gt;mongo2&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;mongo-secret&lt;/code&gt; with the new URL (&lt;code&gt;mongodb://mongo2-svc.default:27017&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Chains will detect the change and switch to the new database automatically.&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/provenance-storage-gcs-tutorial/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/provenance-storage-gcs-tutorial/</guid>
      <description>
        
        
        &lt;h1 id=&#34;using-google-cloud-storage-gcs-as-the-storage-for-tekton-chains-signed-artifacts&#34;&gt;Using Google Cloud Storage (GCS) as the storage for Tekton Chains signed artifacts&lt;/h1&gt;
&lt;p&gt;This tutorial will guide you through the steps to enable the artifacts generated by Tekton Chains running on a Kind cluster to be uploaded to a GCS bucket.&lt;/p&gt;
&lt;h2 id=&#34;scope-of-the-tutorial&#34;&gt;Scope of the Tutorial&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/docs/tutorials/images/chains-gcs-abstract.png&#34; alt=&#34;scope-chains-gcs-abstract&#34;&gt;&lt;/p&gt;
&lt;p&gt;Before you begin, ensure that you have the following tools installed on your machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kind.sigs.k8s.io/docs/user/quick-start/#installation&#34;&gt;kind&lt;/a&gt;: To create and manage the local Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/sdk/docs/install&#34;&gt;gcloud&lt;/a&gt;: To interact with Google Cloud resources, such as GCS and IAM.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.sigstore.dev/cosign/system_config/installation/&#34;&gt;cosign&lt;/a&gt;: To sign and verify artifacts (if required).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;solution-overview&#34;&gt;Solution Overview&lt;/h2&gt;
&lt;p&gt;Configure Workload Identity Federation with the Kuberenetes cluster. For detailed instructions follow documentation &lt;a href=&#34;https://cloud.google.com/iam/docs/workload-identity-federation-with-kubernetes#kubernetes&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kubernetes can project service account tokens into workloads using projected volumes. By enabling Workload Identity Federation, we allow these tokens to be used by workloads to authenticate with Google Cloud services. This eliminates the need to hardcode keys or store sensitive credentials for authentication. In our case, the &lt;code&gt;tekton-chains-controller&lt;/code&gt; deployment running on the kind cluster must be configured to mount the projected service account token volume to use these tokens.&lt;/p&gt;
&lt;p&gt;The following diagram illustrates the steps we will take.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.github.com/tektoncd/chains/main/docs/tutorials/images/workload-identity-federation.png&#34; alt=&#34;workload-federation&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Project&lt;/strong&gt; linked to a Billing Account. If you do not have one, you can create a new project following the documentation &lt;a href=&#34;https://cloud.google.com/resource-manager/docs/creating-managing-projects&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud auth login
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud projects create tekton-chains-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensure that the project is linked to a valid Billing Account.This can be done from console or from CLI. Refer docs.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud config &lt;span style=&#34;color:#366&#34;&gt;set&lt;/span&gt; project tekton-chains-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Storage (GCS) Bucket&lt;/strong&gt; - You will need a bucket to which the artifacts will be uploaded. You can create a new GCS bucket using the following command&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud storage buckets create gs://tekton_artifacts --location&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;us-central1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes cluster&lt;/strong&gt; to deploy Tekton pipelines and chains&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind create cluster -n tekton
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Install &lt;strong&gt;Tekton Pipelines&lt;/strong&gt; and &lt;strong&gt;Tekton Chains&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply --filename https://infra.tekton.dev/tekton-releases/pipeline/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply --filename https://infra.tekton.dev/tekton-releases/chains/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensure that all pods in the &lt;code&gt;tekton-pipelines&lt;/code&gt; and &lt;code&gt;tekton-chains&lt;/code&gt; namespaces are running, and that the pods are in the &amp;ldquo;Running&amp;rdquo; status. Below is an example of what the pods should look like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tekton-chains                tekton-chains-controller-658dbffcd4-cqqxj           1/1     Running   0          69s
tekton-pipelines             tekton-events-controller-fcdb69895-m4xjn            1/1     Running   0          2m14s
tekton-pipelines             tekton-pipelines-controller-77fb6d9c6c-lkbkp        1/1     Running   0          2m14s
tekton-pipelines             tekton-pipelines-webhook-6f69779d47-j5lkx           1/1     Running   0          2m14s
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;this-tutorial-will-be-divided-into-6-stages&#34;&gt;This tutorial will be divided into 6 stages&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Enable required api service and create a Workload Identity Pool and Provider in GCP&lt;/li&gt;
&lt;li&gt;Create a Google Cloud IAM service Account and grant GCS Object admin role&lt;/li&gt;
&lt;li&gt;Configure GCP Workload Identity Federation&lt;/li&gt;
&lt;li&gt;Grant access to kubernetes workload&lt;/li&gt;
&lt;li&gt;Update Chains configuration to enable GCS storage&lt;/li&gt;
&lt;li&gt;Execute a task and verify artifact storage in GCS bucket&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;stage-1-create-workload-identity-pool-and-provider&#34;&gt;Stage-1: Create Workload Identity Pool and Provider&lt;/h3&gt;
&lt;p&gt;Ensure folloiwng services are enabled in the gcloud project&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#366&#34;&gt;enable&lt;/span&gt; iam.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#366&#34;&gt;enable&lt;/span&gt; cloudresourcemanager.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#366&#34;&gt;enable&lt;/span&gt; iamcredentials.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#366&#34;&gt;enable&lt;/span&gt; sts.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the workload identity pool named &lt;code&gt;kind-tekton-demo-pool&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud iam workload-identity-pools create kind-tekton-demo-pool --location&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;global&amp;#34;&lt;/span&gt; --description&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;BYO-workload identity demo&amp;#34;&lt;/span&gt; --display-name&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;Bare Metal Kind Cluster Pool&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the OIDC provider corresponding to the Kind cluster to the pool.&lt;/p&gt;
&lt;p&gt;First, retrieve the JSON Web Key Set (JWKS) from the Kubernetes API server. JWKS is typically used in OpenID Connect (OIDC) scenarios to validate tokens.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get --raw /openid/v1/jwks &amp;gt; cluster-jwks.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Get the issuer uri for the kind cluster using&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a kind cluster the uri would be:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://kubernetes.default.svc.cluster.local
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then add the provider to the pool created. use the json and uri obtained in previous steps for the folloiwng command&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud iam workload-identity-pools providers create-oidc kind-cluster-provider &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --location&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;global&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --workload-identity-pool&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;kind-tekton-demo-pool&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --issuer-uri&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;https://kubernetes.default.svc.cluster.local&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --attribute-mapping&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;google.subject=assertion.sub,attribute.namespace=assertion[&amp;#39;kubernetes.io&amp;#39;][&amp;#39;namespace&amp;#39;],attribute.service_account_name=assertion[&amp;#39;kubernetes.io&amp;#39;][&amp;#39;serviceaccount&amp;#39;][&amp;#39;name&amp;#39;],attribute.pod=assertion[&amp;#39;kubernetes.io&amp;#39;][&amp;#39;pod&amp;#39;][&amp;#39;name&amp;#39;]&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --attribute-condition&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;assertion[&amp;#39;kubernetes.io&amp;#39;][&amp;#39;namespace&amp;#39;] in [&amp;#39;tekton-chains&amp;#39;]&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --jwk-json-path&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;cluster-jwks.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: In the above command please note that the &lt;code&gt;--attribute-condition&lt;/code&gt; is set to allow uploads from workloads/pods in &lt;code&gt;tekton-chains&lt;/code&gt; namesapce only. If chains pod is running in someother namespace the condition should be updated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;stage-2-create-a-google-cloud-iam-service-account-and-grant-gcs-object-admin-role&#34;&gt;Stage-2: Create a Google Cloud IAM service Account and grant GCS Object admin role&lt;/h3&gt;
&lt;p&gt;Create a Gcloud IAM service account. In this tutorial, we will use the name &lt;code&gt;gcp-sa-for-kind&lt;/code&gt;, but feel free to choose a different name if you prefer. Just ensure to update the name in the subsequent commands accordingly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud iam service-accounts create gcp-sa-for-kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grant the IAM service account access to resources that we want the Kubernetes workload to access. In this tutorial the kind workload i.e the chains pod has to upload to a gcs bucket. Hence we will bind to role &lt;code&gt;storage.objectAdmin&lt;/code&gt;, which provides full control over the objects (files) within a GCS bucket, which includes both read and write access. &lt;strong&gt;Note&lt;/strong&gt;:Setting up the correct GCS permissions is up to the user. For the scope of tutorial we are restricting to &lt;code&gt;objectAdmin&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;PROJECT_NUMBER&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud projects describe &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud config get-value project&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;value(projectNumber)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud iam service-accounts list --filter&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;name:gcp-sa-for-kind&amp;#34;&lt;/span&gt; --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;value(email)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud projects add-iam-policy-binding &lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;PROJECT_NUMBER&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --member&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;serviceAccount:&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;  --role&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;roles/storage.objectAdmin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;stage-3-configure-gcp-workload-identity-federation&#34;&gt;Stage-3: Configure GCP Workload Identity Federation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;PROJECT_NUMBER&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud projects describe &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud config get-value project&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;value(projectNumber)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud iam service-accounts list --filter&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;name:gcp-sa-for-kind&amp;#34;&lt;/span&gt; --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;value(email)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;system:serviceaccount:tekton-chains:tekton-chains-controller&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;POOL_ID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud iam workload-identity-pools list --location&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;global --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;value(name.basename())&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;PROVIDER_ID&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;$(&lt;/span&gt;gcloud iam workload-identity-pools providers list --workload-identity-pool&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;POOL_ID&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt; --location&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;global --format&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;value(name.basename())&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;WARN&lt;/strong&gt;: command for POOL_ID works only if there is one pool. If the
project has multiple pools, then set the pool name directly from the pool creation step in Stage-1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we need to bind a policy to the IAM service account to allow it to use the workload Identity Federation and allow specify that the tekton-chains service account &lt;code&gt;tekton-chains-controller&lt;/code&gt; can access the IAM service account.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud iam service-accounts add-iam-policy-binding &lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--role&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;roles/iam.workloadIdentityUser&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--member&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;principal://iam.googleapis.com/projects/&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;PROJECT_NUMBER&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;/locations/global/workloadIdentityPools/&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;POOL_ID&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;/subject/&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;stage-4-grant-access-to-the-kuberenetes-workload&#34;&gt;Stage-4: Grant access to the Kuberenetes workload&lt;/h3&gt;
&lt;p&gt;Now that the configuration on GCP is complete, we need to configure the Kind cluster&amp;rsquo;s &lt;code&gt;tekton-chains-controller&lt;/code&gt; service account with the credentials to access GCS resources.&lt;/p&gt;
&lt;p&gt;To do this, we need to create a credential configuration file using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud iam workload-identity-pools create-cred-config &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;projects/&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;PROJECT_NUMBER&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;/locations/global/workloadIdentityPools/&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;POOL_ID&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt;/providers/&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;PROVIDER_ID&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--service-account&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--credential-source-file&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;/var/run/service-account/token &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--credential-source-type&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;text &lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30;font-weight:bold&#34;&gt;&lt;/span&gt;--output-file&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;credential-configuration.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will generate a credential configuration file, enabling the service account to access the GCS resources.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To ensure the &lt;code&gt;tekton-chains-controller&lt;/code&gt; service account can access the necessary GCS resources, store the credential configuration in a ConfigMap. Then, we can volume-mount the ConfigMap onto the &lt;code&gt;tekton-chains-controller&lt;/code&gt; deployment to make the configuration available to the workload.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create configmap kind-demo-wid-test --from-file credential-configuration.json --namespace tekton-chains  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: We need to edit the chains deployment to include the configmap volume mount, corresponding volume and an environment variable. Below is the sample patch deployment for &lt;code&gt;tekton-chains-controller&lt;/code&gt; with volume Mounts -&lt;code&gt;workload-identity-credential-configuration&lt;/code&gt;,&lt;code&gt;token&lt;/code&gt;; volumes - &lt;code&gt;workload-identity-credential-configuration&lt;/code&gt;,&lt;code&gt;token&lt;/code&gt; and an env variable &lt;code&gt;GOOGLE_APPLICATION_CREDENTAILS&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch deployment tekton-chains-controller -n tekton-chains --type&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;strategic&amp;#39;&lt;/span&gt; -p &lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;  template:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;    spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      containers:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      - name: tekton-chains-controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        env:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        - name: GOOGLE_APPLICATION_CREDENTIALS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          value: /etc/workload-identity/credential-configuration.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        volumeMounts:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        - mountPath: /var/run/service-account
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          name: token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          readOnly: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        - mountPath: /etc/workload-identity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          name: workload-identity-credential-configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          readOnly: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      volumes:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      - name: token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        projected:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          defaultMode: 420
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          sources:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          - serviceAccountToken:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;              audience: https://iam.googleapis.com/projects/&amp;lt;PROJECT_NUMBER&amp;gt;/locations/global/workloadIdentityPools/&amp;lt;POOL_NAME&amp;gt;/providers/&amp;lt;PROVIDER_ID&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;              expirationSeconds: 3600
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;              path: token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;      - name: workload-identity-credential-configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;        configMap:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          defaultMode: 420
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;          name: kind-demo-wid-test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;!IMP&lt;/strong&gt; Ensure to replace the &lt;code&gt;PROJECT_NUMBER&lt;/code&gt;,&lt;code&gt;POOL_NAME&lt;/code&gt;,&lt;code&gt;PROVIDER_ID&lt;/code&gt; in the&lt;code&gt;serviceAccountToken.audience&lt;/code&gt; corresponding to the &lt;code&gt;token&lt;/code&gt; volume spec.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the updated deployment ensure that the chains controller pod is running and the logs do not have any error&lt;/p&gt;
&lt;h3 id=&#34;stage-5-update-chains-configuration-to-enable-gcs-storage&#34;&gt;Stage-5. Update Chains configuration to enable GCS storage&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.format&amp;#34;: &amp;#34;slsa/v1&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.taskrun.storage&amp;#34;: &amp;#34;gcs&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;artifacts.oci.storage&amp;#34;: &amp;#34;gcs&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;transparency.enabled&amp;#34;: &amp;#34;true&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch configmap chains-config -n tekton-chains -p&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;storage.gcs.bucket&amp;#34;: &amp;#34;tekton_artifacts&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The chains pod will automatically pick the changes done to the configmap. This can be verified in the &lt;code&gt;tekton-chains-controller&lt;/code&gt; pod logs.&lt;/p&gt;
&lt;h3 id=&#34;stage-6-execute-a-task-and-verify-artifact-storage-in-gcs-bucket&#34;&gt;Stage-6. Execute a task and verify artifact storage in GCS bucket&lt;/h3&gt;
&lt;p&gt;Great, now that the setup is done we&amp;rsquo;re finally ready to build an image with kaniko!&lt;/p&gt;
&lt;p&gt;First, apply the &lt;a href=&#34;https://github.com/tektoncd/chains/tree/main/examples/kaniko/kaniko.yaml&#34;&gt;Kaniko Task&lt;/a&gt; to your cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f examples/kaniko/kaniko.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and set the following environment variables:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;REGISTRY&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=[&lt;/span&gt;The registry you will be pushing to&lt;span style=&#34;color:#555&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Assuming that kaniko task is executed from &lt;code&gt;default&lt;/code&gt; namespace and the task by default uses the &lt;code&gt;default&lt;/code&gt; service account to push the image to &lt;code&gt;REGISTRY&lt;/code&gt;, set the following environment variables&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;SERVICE_ACCOUNT_NAME&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker login &lt;span style=&#34;color:#033&#34;&gt;$REGISTRY&lt;/span&gt; &lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;#This helps to generate the dockerconfig locally at $HOME/.docker/config.json. Optional step in case we have the json handy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;DOCKERCONFIG_FILE_PATH&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$HOME&lt;/span&gt;/.docker/config.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret generic docker-registry --from-file&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;.dockerconfigjson&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$DOCKERCONFIG_FILE_PATH&lt;/span&gt; --type&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;kubernetes.io/dockerconfigjson -n &lt;span style=&#34;color:#033&#34;&gt;$NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl patch serviceaccount &lt;span style=&#34;color:#033&#34;&gt;$SERVICE_ACCOUNT_NAME&lt;/span&gt; -p &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;{\&amp;#34;secrets\&amp;#34;: [{\&amp;#34;name\&amp;#34;: \&amp;#34;docker-registry\&amp;#34;}]}&amp;#34;&lt;/span&gt; -n &lt;span style=&#34;color:#033&#34;&gt;$NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#366&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#033&#34;&gt;DOCKERCONFIG_SECRET_NAME&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;test-kaniko
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create secret generic &lt;span style=&#34;color:#033&#34;&gt;$DOCKERCONFIG_SECRET_NAME&lt;/span&gt; --from-file &lt;span style=&#34;color:#033&#34;&gt;$DOCKERCONFIG_FILE_PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For signing purposes, you can generate a Cosign key pair and store the private key in a Kubernetes secret, while the public key (needed for verifying artifacts) will be stored in the local working directory.&lt;/p&gt;
&lt;p&gt;To generate the key pair, use the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign generate-key-pair k8s://tekton-chains/signing-secrets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, you can start the Kaniko Task with the Tekton CLI tool, &lt;a href=&#34;https://github.com/tektoncd/cli&#34;&gt;tkn&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tkn task start --param &lt;span style=&#34;color:#033&#34;&gt;IMAGE&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$REGISTRY&lt;/span&gt;/kaniko-chains --use-param-defaults --workspace &lt;span style=&#34;color:#033&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;source,emptyDir&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; --workspace &lt;span style=&#34;color:#033&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;dockerconfig,secret&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#033&#34;&gt;$DOCKERCONFIG_SECRET_NAME&lt;/span&gt; kaniko-chains
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can watch the logs of this Task until they complete; if authentication is set up correctly than the final image should be pushed to &lt;code&gt;$REGISTRY/kaniko-chains&lt;/code&gt; &amp;amp; the signed artifacts and attestation should be uploaded to the gcs bucket - &lt;code&gt;tekton_artifacts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once the task run is succeeded the uploaded gcloud artifacts can be listed using the following command:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gcloud storage objects list gs://tekton_artifacts/** --format=&amp;#34;json(name)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sample output for reference:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/28998e6f75e5.cert&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/28998e6f75e5.chain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/28998e6f75e5.payload&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/28998e6f75e5.signature&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.cert&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.chain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.payload&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;taskrun-default-kaniko-chains-run-zflcs/taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.signature&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The .signature file can be downloaded to the current local directory and verified with cosign&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud storage cp &lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;gs://tekton_artifacts/taskrun-default-kaniko-chains-run-zflcs/taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.signature&amp;#34;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The resulting file could be verified with the following cosign command&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cosign verify-blob-attestation --insecure-ignore-tlog --key k8s://tekton-chains/signing-secrets --signature taskrun-65c59603-749f-4945-bcb0-821a2ae24e81.signature --type slsaprovenance --check-claims&lt;span style=&#34;color:#555&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#366&#34;&gt;false&lt;/span&gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sample output for reference:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Verified OK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/deprecations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/deprecations/</guid>
      <description>
        
        
        &lt;h1 id=&#34;deprecations&#34;&gt;Deprecations&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#introduction&#34;&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#deprecation-table&#34;&gt;Deprecation Table&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This doc provides a list of features in Tekton Chains that are
being deprecated.&lt;/p&gt;
&lt;p&gt;Deprecations will follow this timeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deprecation announcement is made during a release&lt;/li&gt;
&lt;li&gt;Feature is removed two releases later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, if a feature is deprecated at v0.1.0, then it would be removed in v0.3.0.&lt;/p&gt;
&lt;h2 id=&#34;deprecation-table&#34;&gt;Deprecation Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature Being Deprecated&lt;/th&gt;
&lt;th&gt;Deprecation Announcement&lt;/th&gt;
&lt;th&gt;API Compatibility Policy&lt;/th&gt;
&lt;th&gt;Earliest Date or Release of Removal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/tektoncd/chains/issues/293&#34;&gt;&lt;code&gt;tekton-provenance&lt;/code&gt; format is deprecated&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/tektoncd/pipeline/releases/tag/v0.6.0&#34;&gt;v0.6.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;td&gt;v0.8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/hashicorp-integration-tutorial/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/hashicorp-integration-tutorial/</guid>
      <description>
        
        
        &lt;h1 id=&#34;hashicorp-integration-with-tekton-chains&#34;&gt;Hashicorp Integration with Tekton Chains&lt;/h1&gt;
&lt;h3 id=&#34;in-this-tutorial-we-will-be-running-chains-signed-provenance-tutorialhttpsgithubcomtektoncdchainsblobmaindocstutorialssigned-provenance-tutorialmd-using-kms-solution-by-integrating-tekton-chains-with-hashicorp-vault&#34;&gt;In this tutorial, we will be running &lt;a href=&#34;https://github.com/tektoncd/chains/blob/main/docs/tutorials/signed-provenance-tutorial.md&#34;&gt;Chains Signed Provenance Tutorial&lt;/a&gt; using &lt;code&gt;kms&lt;/code&gt; solution by integrating Tekton Chains with Hashicorp Vault&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prerequisite
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hashicorp vault should be installed&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If not installed, you can also try on a minikube or a kind cluster. For more info see &lt;a href=&#34;https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-minikube-raft&#34;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This provider also requires that the &lt;code&gt;transit&lt;/code&gt; secret engine is enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If not done, you can login into the vault provider and run the following command&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;$ vault secrets enable transit
Success! Enabled the transit secrets engine at: transit/
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can get more info about &lt;code&gt;transit&lt;/code&gt; secrets &lt;a href=&#34;https://developer.hashicorp.com/vault/docs/secrets/transit#setup&#34;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure Tekton Pipelines and Tekton Chains is installed&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;chains-signed-provenance-tutorialhttpsgithubcomtektoncdchainsblobmaindocstutorialssigned-provenance-tutorialmd-using-kms-solution-by-integrating-with-hashicorp-vault&#34;&gt;&lt;a href=&#34;https://github.com/tektoncd/chains/blob/main/docs/tutorials/signed-provenance-tutorial.md&#34;&gt;Chains Signed Provenance Tutorial&lt;/a&gt; using &lt;code&gt;kms&lt;/code&gt; solution by integrating with Hashicorp Vault&lt;/h3&gt;
&lt;h3 id=&#34;step-1-generate-a-key-pair&#34;&gt;Step 1: Generate a Key Pair&lt;/h3&gt;
&lt;p&gt;This provider requires that the standard Vault environment variables (&lt;code&gt;$VAULT_ADDR, $VAULT_TOKEN&lt;/code&gt;) are set correctly.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;$ export VAULT_ADDR=http://localhost:8200
$ export VAULT_TOKEN=testtoken
$ vault secrets enable transit  ---&amp;gt; Ignore if you have already done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now run the following command&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;$ cosign generate-key-pair --kms hashivault://$keyname
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;:- If you enabled transit secret engine at different path with the use of -path flag (i.e., $ vault secrets enable -path=&amp;ldquo;someotherpath&amp;rdquo; transit), you can use TRANSIT_SECRET_ENGINE_PATH environment variable to specify this path while generating a key pair like the following:&lt;/p&gt;
&lt;p&gt;In that case the command will be&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;$ TRANSIT_SECRET_ENGINE_PATH=&amp;#34;someotherpath&amp;#34; cosign generate-key-pair --kms hashivault://$keyname
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;step-2-set-up-authenticaion&#34;&gt;Step 2: Set up Authenticaion&lt;/h3&gt;
&lt;p&gt;There are two forms of authentication that need to be set up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Chains controller will be pushing signatures to an OCI registry using the credentials linked to your TaskRun&amp;rsquo;s service account. See our authentication &lt;a href=&#34;https://github.com/tektoncd/chains/blob/main/docs/authentication.md&#34;&gt;doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Kaniko Task that will build and push the image needs push permissions for your registry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To set up auth for the Kaniko Task, you&amp;rsquo;ll need a Kubernetes secret of a docker config.json file which contains the required auth. You can create the secret by running:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;kubectl create secret generic [DOCKERCONFIG_SECRET_NAME] --from-file [PATH TO CONFIG.JSON]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;step-3-configuring-tekton-chains&#34;&gt;Step 3: Configuring Tekton Chains&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ll need to make these changes to the Tekton Chains configMap i.e. &lt;code&gt;chains-config&lt;/code&gt; configMap:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* artifacts.taskrun.format&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;slsa/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* artifacts.taskrun.storage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;oci&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* artifacts.taskrun.signer&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kms&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* artifacts.pipelinerun.signer&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kms&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* artifacts.oci.signer&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kms&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* transparency.enabled&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#c30&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* signers.kms.kmsref&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;hashivault://$keyname&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* signers.kms.auth.address&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;lt;VAULT_ADDR&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;* signers.kms.auth.token&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;lt;VAULT_TOKEN&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-4-start-the-kaniko-task&#34;&gt;Step 4: Start the Kaniko Task&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;First apply the&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f examples/kaniko/kaniko.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Substitute with the URI or file path to your Kaniko task.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the following enviornment variables:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;export REGISTRY=&amp;lt;url_of_registry&amp;gt;
export DOCKERCONFIG_SECRET_NAME=&amp;lt;name_of_the_secret_in_docker_config_json&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Substitute with the URL of the registry where you want to push the image.
Substitute with the name of the secret in the docker config.json file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start the Kaniko Task&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;tkn task start --param IMAGE=$REGISTRY/kaniko-chains --use-param-defaults --workspace name=source,emptyDir=&amp;#34;&amp;#34; --workspace name=dockerconfig,secret=$DOCKERCONFIG_SECRET_NAME kaniko-chains
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Wait for a minute to allow Tekton Chains to generate the provenance and sign it, and then check the availability of the chains.tekton.dev/signed=true annotation on the task run.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;kubectl get tr &amp;lt;task_run_name&amp;gt; -o json | jq -r .metadata.annotations
{
	&amp;#34;chains.tekton.dev/signed&amp;#34;: &amp;#34;true&amp;#34;,
	...
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;step-5-verify-the-image-and-the-attestation&#34;&gt;Step 5: Verify the image and the attestation&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;cosign verify --key cosign.pub $REGISTRY/kaniko-chains
cosign verify-attestation --key cosign.pub --type slsaprovenance $REGISTRY/kaniko-chains
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or you can use the hashivault://$keyname as key as well&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;cosign verify --key hashivault://testkey $REGISTRY/kaniko-chains
cosign verify-attestation --key hashivault://testkey --type slsaprovenance $REGISTRY/kaniko-chains
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The output would be like this&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash=&#34; data-lang=&#34;bash=&#34;&gt;Verification for index.docker.io/$REGISTRY/kaniko-chains:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The claims were present in the transparency log
  - The signatures were integrated into the transparency log when the certificate was valid
  - The signatures were verified against the specified public key

[{&amp;#34;critical&amp;#34;:{&amp;#34;identity&amp;#34;:{&amp;#34;docker-reference&amp;#34;:&amp;#34;index.docker.io/$REGISTRY/kaniko-chains&amp;#34;},&amp;#34;image&amp;#34;:{&amp;#34;docker-manifest-digest&amp;#34;:&amp;#34;sha256:e14396b283abcbacddba403a923a7fdecf2c54537a1d6a1ee1076767bec742d1&amp;#34;},&amp;#34;type&amp;#34;:&amp;#34;cosign container image signature&amp;#34;},&amp;#34;optional&amp;#34;:null}]

Verification for docker.io/$REGISTRY/kaniko-chains --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The claims were present in the transparency log
  - The signatures were integrated into the transparency log when the certificate was valid
  - The signatures were verified against the specified public key
{&amp;#34;payloadType&amp;#34;:&amp;#34;application/vnd.in-toto+json&amp;#34;,&amp;#34;payload&amp;#34;:&amp;#34;eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiJpbmRleC5kb2NrZXIuaW8vcHVuZWV0MjE0Ny9rYW5pa28tY2hhaW5zIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImUxNDM5NmIyODNhYmNiYWNkZGJhNDAzYTkyM2E3ZmRlY2YyYzU0NTM3YTFkNmExZWUxMDc2NzY3YmVjNzQyZDEifX1dLCJwcmVkaWNhdGUiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vdGVrdG9uLmRldi9jaGFpbnMvdjIifSwiYnVpbGRUeXBlIjoidGVrdG9uLmRldi92MWJldGExL1Rhc2tSdW4iLCJpbnZvY2F0aW9uIjp7ImNvbmZpZ1NvdXJjZSI6e30sInBhcmFtZXRlcnMiOnsiQlVJTERFUl9JTUFHRSI6Imdjci5pby9rYW5pa28tcHJvamVjdC9leGVjdXRvcjp2MS41LjFAc2hhMjU2OmM2MTY2NzE3ZjdmZTBiN2RhNDQ5MDhjOTg2MTM3ZWNmZWFiMjFmMzFlYzM5OTJmNmUxMjhmZmY4YTk0YmU4YTUiLCJDT05URVhUIjoiLi8iLCJET0NLRVJGSUxFIjoiLi9Eb2NrZXJmaWxlIiwiRVhUUkFfQVJHUyI6IiIsIklNQUdFIjoiZG9ja2VyLmlvL3B1bmVldDIxNDcva2FuaWtvLWNoYWlucyJ9LCJlbnZpcm9ubWVudCI6eyJhbm5vdGF0aW9ucyI6eyJwaXBlbGluZS50ZWt0b24uZGV2L3JlbGVhc2UiOiJjODAyMDY5In0sImxhYmVscyI6eyJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5IjoidGVrdG9uLXBpcGVsaW5lcyIsInRla3Rvbi5kZXYvdGFzayI6Imthbmlrby1jaGFpbnMifX19LCJidWlsZENvbmZpZyI6eyJzdGVwcyI6W3siZW50cnlQb2ludCI6InNldCAtZVxuZWNobyBcIkZST00gYWxwaW5lQHNoYTI1Njo2OWU3MGE3OWYyZDQxYWI1ZDYzN2RlOThjMWUwYjA1NTIwNmJhNDBhODE0NWU3YmRkYjU1Y2NjMDRlMTNjZjhmXCIgfCB0ZWUgLi9Eb2NrZXJmaWxlXG4iLCJhcmd1bWVudHMiOm51bGwsImVudmlyb25tZW50Ijp7ImNvbnRhaW5lciI6ImFkZC1kb2NrZXJmaWxlIiwiaW1hZ2UiOiJkb2NrZXIuaW8vbGlicmFyeS9iYXNoQHNoYTI1NjoxZWEzMGQ5YjY1Nzk3ZmJhZTQ3ODdmNjE4ODc5NmU3MTg5MzcxMDE5MDMxOTU4YTE2NzQyM2QzNDdkMzJlYWRhIn0sImFubm90YXRpb25zIjpudWxsfSx7ImVudHJ5UG9pbnQiOiIiLCJhcmd1bWVudHMiOlsiIiwiLS1kb2NrZXJmaWxlPS4vRG9ja2VyZmlsZSIsIi0tY29udGV4dD0vd29ya3NwYWNlL3NvdXJjZS8uLyIsIi0tZGVzdGluYXRpb249ZG9ja2VyLmlvL3B1bmVldDIxNDcva2FuaWtvLWNoYWlucyIsIi0tZGlnZXN0LWZpbGU9L3Rla3Rvbi9yZXN1bHRzL0lNQUdFX0RJR0VTVCJdLCJlbnZpcm9ubWVudCI6eyJjb250YWluZXIiOiJidWlsZC1hbmQtcHVzaCIsImltYWdlIjoiZ2NyLmlvL2thbmlrby1wcm9qZWN0L2V4ZWN1dG9yQHNoYTI1NjpjNjE2NjcxN2Y3ZmUwYjdkYTQ0OTA4Yzk4NjEzN2VjZmVhYjIxZjMxZWMzOTkyZjZlMTI4ZmZmOGE5NGJlOGE1In0sImFubm90YXRpb25zIjpudWxsfSx7ImVudHJ5UG9pbnQiOiJzZXQgLWVcbmVjaG8gZG9ja2VyLmlvL3B1bmVldDIxNDcva2FuaWtvLWNoYWlucyB8IHRlZSAvdGVrdG9uL3Jlc3VsdHMvSU1BR0VfVVJMXG4iLCJhcmd1bWVudHMiOm51bGwsImVudmlyb25tZW50Ijp7ImNvbnRhaW5lciI6IndyaXRlLXVybCIsImltYWdlIjoiZG9ja2VyLmlvL2xpYnJhcnkvYmFzaEBzaGEyNTY6MWVhMzBkOWI2NTc5N2ZiYWU0Nzg3ZjYxODg3OTZlNzE4OTM3MTAxOTAzMTk1OGExNjc0MjNkMzQ3ZDMyZWFkYSJ9LCJhbm5vdGF0aW9ucyI6bnVsbH1dfSwibWV0YWRhdGEiOnsiYnVpbGRTdGFydGVkT24iOiIyMDIzLTA3LTE4VDA4OjM4OjU0WiIsImJ1aWxkRmluaXNoZWRPbiI6IjIwMjMtMDctMThUMDg6Mzk6MTNaIiwiY29tcGxldGVuZXNzIjp7InBhcmFtZXRlcnMiOmZhbHNlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJkb2NrZXIuaW8vbGlicmFyeS9iYXNoIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjFlYTMwZDliNjU3OTdmYmFlNDc4N2Y2MTg4Nzk2ZTcxODkzNzEwMTkwMzE5NThhMTY3NDIzZDM0N2QzMmVhZGEifX0seyJ1cmkiOiJnY3IuaW8va2FuaWtvLXByb2plY3QvZXhlY3V0b3IiLCJkaWdlc3QiOnsic2hhMjU2IjoiYzYxNjY3MTdmN2ZlMGI3ZGE0NDkwOGM5ODYxMzdlY2ZlYWIyMWYzMWVjMzk5MmY2ZTEyOGZmZjhhOTRiZThhNSJ9fV19fQ==&amp;#34;,&amp;#34;signatures&amp;#34;:[{&amp;#34;keyid&amp;#34;:&amp;#34;SHA256:wvNLyVMa1zxAWD9ZjvKanoCuukphRbKYdLM24TEEAj0&amp;#34;,&amp;#34;sig&amp;#34;:&amp;#34;MEYCIQDsMLBOWKZKDBiiVJOz4ZQbPTKfQwhdBgsbVupJlvlN+gIhAPxMbCfjKGSl1ity9RS9/UMXRcI5QtkCH+LX6t4V5/Ft&amp;#34;}]}
&lt;/code&gt;&lt;/pre&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/metrics/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/metrics/</guid>
      <description>
        
        
        &lt;h1 id=&#34;metrics&#34;&gt;Metrics&lt;/h1&gt;
&lt;p&gt;Tekton Chains exposes standard
&lt;a href=&#34;https://knative.dev/docs/serving/observability/metrics/serving-metrics/#controller&#34;&gt;Knative Controller metrics&lt;/a&gt;.
These metrics are served on &lt;code&gt;/metrics&lt;/code&gt; on the Tekton Chains controller Pod.
These are exposed on port &lt;code&gt;:9090&lt;/code&gt; by default.&lt;/p&gt;
&lt;p&gt;Metric collectors like Prometheus and OpenTelemetry can be used to collect these
metrics. See
&lt;a href=&#34;https://knative.dev/docs/serving/observability/metrics/collecting-metrics/&#34;&gt;Knative - Collecting Metrics&lt;/a&gt;
for more details.&lt;/p&gt;
&lt;h1 id=&#34;chains-controller-metrics&#34;&gt;Chains Controller Metrics&lt;/h1&gt;
&lt;p&gt;The following chains metrics are also available at &lt;code&gt;tekton-chains-metrics&lt;/code&gt; service on port &lt;code&gt;9090&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_pipelinerun_sign_created_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of signed messages for pipelineruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_pipelinerun_payload_uploaded_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of uploaded payloads for pipelineruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_pipelinerun_payload_stored_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of stored payloads for pipelineruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_pipelinerun_marked_signed_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of objects marked as signed for pipelineruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_pipelinerun_signing_failures_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of PipelineRun signing failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_taskrun_sign_created_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of signed messages for taskruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_taskrun_payload_uploaded_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of uploaded payloads for taskruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_taskrun_payload_stored_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of stored payloads for taskruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_taskrun_marked_signed_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of objects marked as signed for taskruns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watcher_taskrun_signing_failures_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;Total number of TaskRun signing failures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To access the chains metrics, use the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl port-forward -n tekton-chains service/tekton-chains-metrics &lt;span style=&#34;color:#f60&#34;&gt;9090&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then check that changes have been applied to metrics coming from &lt;a href=&#34;http://127.0.0.1:9090/metrics&#34;&gt;http://127.0.0.1:9090/metrics&lt;/a&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/performance/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/performance/</guid>
      <description>
        
        
        &lt;h1 id=&#34;performance&#34;&gt;Performance&lt;/h1&gt;
&lt;p&gt;Tekton Chains exposes a few parameters that can be used to fine tune the controllers execution to
improve its performance as needed.&lt;/p&gt;
&lt;p&gt;The controller accepts the following parameters:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--threads-per-controller&lt;/code&gt; controls the number of concurrent threads the Chains controller
processes. The default value is 2.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--kube-api-burst&lt;/code&gt; controle the maximum burst for throttle. The default value is 10.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--kube-api-qps&lt;/code&gt; controles the maximum QPS to the server from the client. The default value is 5.&lt;/p&gt;
&lt;p&gt;Modify the &lt;code&gt;Deployment&lt;/code&gt; to use those parameters, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;template&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- &lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ghcr.io/tektoncd/chains/controller-92006fd957c0afd31de6a40b3e33b39f:v0.26.2&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                  &lt;/span&gt;&lt;span style=&#34;color:#309;font-weight:bold&#34;&gt;args&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                    &lt;/span&gt;- --threads-per-controller=32&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                    &lt;/span&gt;- --kube-api-burst=100&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                    &lt;/span&gt;- --kube-api-qps=50&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>https://deploy-preview-726--tekton.netlify.app/docs/chains/v1-proposal/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-726--tekton.netlify.app/docs/chains/v1-proposal/</guid>
      <description>
        
        
        &lt;h1 id=&#34;v1-client-changes-proposal---storage-refactoring&#34;&gt;v1 client changes proposal - storage refactoring&lt;/h1&gt;
&lt;p&gt;With v1 approaching, I want to take a moment to look at changes we want to make
to the existing client libraries to better set us up for long term maintenance.&lt;/p&gt;
&lt;p&gt;We already know that we want to reduce the external library surface of chains.
But to do this, we need to define better interfaces between components that we
expect external clients to use.&lt;/p&gt;
&lt;p&gt;Today, I think a lot of the codebase&amp;rsquo;s complexity has come from a few places:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Storage libraries&lt;/p&gt;
&lt;p&gt;Each storage type needs different pieces of data - i.e. Grafeas and OCI need
to distinguish image signatures and attestation formats, and some clients
need the original object to extract out information like GVKs, names,
namespaces, etc. This has led to a organic growth of the chains libraries to
pass the different types of data around, and a lot of typecasting and other
generic object tricks.&lt;/p&gt;
&lt;p&gt;Looking at the storage interfaces, I think this data roughly boils down to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The original Tekton object&lt;/li&gt;
&lt;li&gt;The formatted data object&lt;/li&gt;
&lt;li&gt;The signed payload + signature (with optional cert information)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unlike when chains first started, we now have another useful tool available
to us: generics. I think we can use this to create clearer interfaces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dependence on the config package&lt;/p&gt;
&lt;p&gt;tkn depends on the chains server config, but it probably shouldn&amp;rsquo;t. We should
aim to have better ways to initialize clients for others to use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good news, I don&amp;rsquo;t think we&amp;rsquo;re far off, but we should make some changes&lt;/p&gt;
&lt;h2 id=&#34;signables&#34;&gt;Signables&lt;/h2&gt;
&lt;p&gt;At it&amp;rsquo;s core, Chains is basically an ETL pipeline. We Extract artifacts from run
objects, Transform and sign them, then Load them into storage.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Signable[T any] &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c0f&#34;&gt;Extract&lt;/span&gt;(ctx context.Context, obj objects.TektonObject) []T{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;payloaders&#34;&gt;Payloaders&lt;/h2&gt;
&lt;p&gt;I think payloaders are mostly in a good place, though we can introduce generics
to start creating stricter type relationships between Signables and Payloaders.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Payloader[Input any, Output BinaryMarshaler] &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c0f&#34;&gt;CreatePayload&lt;/span&gt;(ctx context.Context, in Input) (Output, &lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tl;dr: Some type comes in, some type comes out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pkg.go.dev/encoding#BinaryMarshaler&#34;&gt;BinaryMarshaler comes from the encoding package&lt;/a&gt;,
but basically all we&amp;rsquo;re aiming for here is to make sure we can get a []byte for
signing. For existing payload types, this may mean we need to wrap external
types for this functionality.&lt;/p&gt;
&lt;h2 id=&#34;signers&#34;&gt;Signers&lt;/h2&gt;
&lt;p&gt;Signers are mostly in a good spot, though we should probably just embrace []byte
instead of typecasting between string for cert details.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Signer &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	signature.SignerVerifier
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c0f&#34;&gt;Cert&lt;/span&gt;() []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c0f&#34;&gt;Chain&lt;/span&gt;() []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;storers&#34;&gt;Storers&lt;/h2&gt;
&lt;p&gt;Now that we have all the other pieces defined, we can now have stricter typing
for storing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Storer[Input any, Output any] &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c0f&#34;&gt;Store&lt;/span&gt;(ctx context.Context, req &lt;span style=&#34;color:#555&#34;&gt;*&lt;/span&gt;StoreRequest) (&lt;span style=&#34;color:#555&#34;&gt;*&lt;/span&gt;StoreResponse, &lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; StoreRequest[Input any, Output any] &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Object objects.TektonObject
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Artifact Input
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Payload Output
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Bundle &lt;span style=&#34;color:#555&#34;&gt;*&lt;/span&gt;signing.Bundle
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; StoreResponse &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;// Some identifier for what we uploaded to reference later?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#09f;font-style:italic&#34;&gt;&lt;/span&gt;    ID &lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Bundle &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Content   []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Signature []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Cert      []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Chain     []&lt;span style=&#34;color:#078;font-weight:bold&#34;&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;While the StoreRequest struct may not be necessary, it has a nice RPC-like
quality in that it will make it easier to add/remove fields in the future.&lt;/p&gt;
&lt;h2 id=&#34;attestors&#34;&gt;Attestors&lt;/h2&gt;
&lt;p&gt;To put it all together, we can add a new type: Attestor. This is effectively
just a wrapper type around all of the other interfaces that binds the generic
types together. Because things are strictly typed, we&amp;rsquo;ll know at compile
what clients are compatible with each other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TBD if we expose this at all&lt;/strong&gt; - it may remain an internal implementation
detail of chains. This is what we will generate from the Chains server config.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;type&lt;/span&gt; Attestor[Input, Output] &lt;span style=&#34;color:#069;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payloader Payloader[Input, Output]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    signer Signer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    storer Storer[Input, Output]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this looks like in practice:&lt;/p&gt;
&lt;p&gt;OCI Simple Signing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;attestor &lt;span style=&#34;color:#555&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;&amp;amp;&lt;/span&gt;Attestor[name.Digest, simple.SimpleContainerImage]{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payloader: &lt;span style=&#34;color:#c0f&#34;&gt;NewSimpleSigningPayloader&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    signer: x509Signer,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    storer: &lt;span style=&#34;color:#c0f&#34;&gt;NewSimpleOCIStorage&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SLSA:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;attestor &lt;span style=&#34;color:#555&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;&amp;amp;&lt;/span&gt;Attestor[TektonObject, &lt;span style=&#34;color:#555&#34;&gt;*&lt;/span&gt;intoto.Statement]{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payloader: &lt;span style=&#34;color:#c0f&#34;&gt;NewSLSAPayloader&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    signer: fulcio,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    storer: &lt;span style=&#34;color:#c0f&#34;&gt;NewGCSStorage&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grafeas:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;attestor &lt;span style=&#34;color:#555&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;&amp;amp;&lt;/span&gt;Attestor[TektonObject, &lt;span style=&#34;color:#555&#34;&gt;*&lt;/span&gt;Occurrence]{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payloader: &lt;span style=&#34;color:#c0f&#34;&gt;NewGrafeasPayloader&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    signer: kmsSigner,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    storer: &lt;span style=&#34;color:#c0f&#34;&gt;NewGrafeasClient&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;If all goes well, this should have 0 impact on typical consumer usage of
chains - these should all be internal refactors with no change in behavior. If
our e2e start failing, we&amp;rsquo;ve done something wrong.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
