Repository: kubeflow/kfp-tekton (language: python)

Issue:
migrate to tekton v1 api
/kind feature

**Description:**
[A clear and concise description of what your proposal. What problem does it solve?]


**Additional information:**
[Miscellaneous information that will assist in solving the issue.]

backend(chore): update backend to tekton 0.50
**Which issue is resolved by this Pull Request:** 
Part of #1308 

**Description of your changes:**

**Environment tested:**

* Python Version (use `python --version`):
* Tekton Version (use `tkn version`):
* Kubernetes Version (use `kubectl version`):
* OS (e.g. from `/etc/os-release`):

**Checklist:**
- [x] The title for your pull request (PR) should follow our title convention. [Learn more about the pull request title convention used in this repository](https://github.com/kubeflow/pipelines/blob/master/CONTRIBUTING.md#pull-request-title-convention). 
<!--
   PR titles examples:
    * `fix(frontend): fixes empty page. Fixes #1234`
       Use `fix` to indicate that this PR fixes a bug.
    * `feat(backend): configurable service account. Fixes #1234, fixes #1235`
       Use `feat` to indicate that this PR adds a new feature. 
    * `chore: set up changelog generation tools`
       Use `chore` to indicate that this PR makes some changes that users don't need to know.
    * `test: fix CI failure. Part of #1234`
        Use `part of` to indicate that a PR is working on an issue, but shouldn't close the issue when merged.
-->



Discussion / hints:

Fix patch:
diff --git a/backend/src/agent/persistence/client/workflow_client.go b/backend/src/agent/persistence/client/workflow_client.go
index 53bb223df7..97bacbb744 100644
--- a/backend/src/agent/persistence/client/workflow_client.go
+++ b/backend/src/agent/persistence/client/workflow_client.go
@@ -23,11 +23,13 @@ import (
 
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	log "github.com/sirupsen/logrus"
+	wfapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
-	wfapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	wfapiV1Beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
 	customRun "github.com/tektoncd/pipeline/pkg/apis/run/v1beta1"
 	wfclientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
-	"github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1"
+	tektonV1Beta1 "github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1beta1"
 	"k8s.io/apimachinery/pkg/labels"
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 	"k8s.io/client-go/tools/cache"
@@ -71,9 +73,9 @@ type WorkflowClientInterface interface {
 }
 
 type Informers struct {
-	TRInformer v1beta1.TaskRunInformer
-	PRInformer v1beta1.PipelineRunInformer
-	CRInformer v1beta1.CustomRunInformer
+	TRInformer tektonV1.TaskRunInformer
+	PRInformer tektonV1.PipelineRunInformer
+	CRInformer tektonV1Beta1.CustomRunInformer
 }
 
 // WorkflowClient is a client to call the Workflow API.
@@ -127,14 +129,14 @@ func (c *WorkflowClient) Get(namespace string, name string) (
 		return nil, err
 	}
 
-	if err := c.getStatusFromChildReferences(namespace, labels.SelectorFromSet(s), &workflow.Status); err != nil {
+	if err := c.getStatusFromChildReferences(namespace, labels.SelectorFromSet(s), &workflow.Status, workflow); err != nil {
 		return nil, err
 	}
 
 	return util.NewWorkflow(workflow), nil
 }
 
-func (c *WorkflowClient) getStatusFromChildReferences(namespace string, selector labels.Selector, status *wfapi.PipelineRunStatus) error {
+func (c *WorkflowClient) getStatusFromChildReferences(namespace string, selector labels.Selector, status *wfapi.PipelineRunStatus, workflow *wfapi.PipelineRun) error {
 	if status.ChildReferences != nil {
 		hasTaskRun, hasCustomRun := false, false
 		for _, child := range status.ChildReferences {
@@ -164,7 +166,9 @@ func (c *WorkflowClient) getStatusFromChildReferences(namespace string, selector
 					Status:           taskrun.Status.DeepCopy(),
 				}
 			}
-			status.TaskRuns = taskrunStatuses
+			// TODO: maybe change it to another struct to have backward compatibility
+			taskrunStatusesMarshal, err := json.Marshal(taskrunStatuses)
+			workflow.Annotations["taskrunStatuses"] = string(taskrunStatusesMarshal)
 		}
 		if hasCustomRun {
 			customRuns, err := c.informers.CRInformer.Lister().CustomRuns(namespace).List(selector)
@@ -182,7 +186,9 @@ func (c *WorkflowClient) getStatusFromChildReferences(namespace string, selector
 				// handle nested status
 				c.handleNestedStatusV1beta1(customRun, customRunStatus, namespace)
 			}
-			status.Runs = customRunStatuses
+			// TODO: maybe change it to another struct to have backward compatibility
+			customRunStatusesMarshal, err := json.Marshal(customRunStatuses)
+			workflow.Annotations["customRunStatuses"] = string(customRunStatusesMarshal)
 		}
 	}
 	return nil
@@ -213,7 +219,7 @@ func (c *WorkflowClient) handleNestedStatus(run *v1alpha1.Run, runStatus *v1alph
 }
 
 // handle nested status case for specific types of Run
-func (c *WorkflowClient) handleNestedStatusV1beta1(customRun *wfapi.CustomRun, customRunStatus *customRun.CustomRunStatus, namespace string) {
+func (c *WorkflowClient) handleNestedStatusV1beta1(customRun *wfapiV1Beta1.CustomRun, customRunStatus *customRun.CustomRunStatus, namespace string) {
 	var kind string
 	if customRun.Spec.CustomSpec != nil {
 		kind = customRun.Spec.CustomSpec.Kind
diff --git a/backend/src/agent/persistence/persistence_agent.go b/backend/src/agent/persistence/persistence_agent.go
index 04311f642f..14e236d6a8 100644
--- a/backend/src/agent/persistence/persistence_agent.go
+++ b/backend/src/agent/persistence/persistence_agent.go
@@ -52,8 +52,8 @@ func NewPersistenceAgent(
 	time util.TimeInterface) *PersistenceAgent {
 	// obtain references to shared informers
 	swfInformer := swfInformerFactory.Scheduledworkflow().V1beta1().ScheduledWorkflows()
-	prInformer := workflowInformerFactory.Tekton().V1beta1().PipelineRuns()
-	trInformer := workflowInformerFactory.Tekton().V1beta1().TaskRuns()
+	prInformer := workflowInformerFactory.Tekton().V1().PipelineRuns()
+	trInformer := workflowInformerFactory.Tekton().V1().TaskRuns()
 	crInformer := workflowInformerFactory.Tekton().V1beta1().CustomRuns()
 
 	// Add controller types to the default Kubernetes Scheme so Events can be
diff --git a/backend/src/apiserver/client/tekton.go b/backend/src/apiserver/client/tekton.go
index fbc4187a27..953bae3738 100644
--- a/backend/src/apiserver/client/tekton.go
+++ b/backend/src/apiserver/client/tekton.go
@@ -22,24 +22,24 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/pkg/errors"
 	tektonclient "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
-	tektonv1beta1 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1beta1"
+	tektonv1 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1"
 	"k8s.io/client-go/rest"
 )
 
 type TektonClientInterface interface {
-	PipelineRun(namespace string) tektonv1beta1.PipelineRunInterface
+	PipelineRun(namespace string) tektonv1.PipelineRunInterface
 }
 
 type TektonClient struct {
-	tektonClient tektonv1beta1.TektonV1beta1Interface
+	tektonClient tektonv1.TektonV1Interface
 }
 
-func (tektonClient *TektonClient) PipelineRun(namespace string) tektonv1beta1.PipelineRunInterface {
+func (tektonClient *TektonClient) PipelineRun(namespace string) tektonv1.PipelineRunInterface {
 	return tektonClient.tektonClient.PipelineRuns(namespace)
 }
 
 func NewTektonClientOrFatal(initConnectionTimeout time.Duration, clientParams util.ClientParameters) *TektonClient {
-	var tektonClient tektonv1beta1.TektonV1beta1Interface
+	var tektonClient tektonv1.TektonV1Interface
 	var operation = func() error {
 		restConfig, err := rest.InClusterConfig()
 		if err != nil {
@@ -47,7 +47,7 @@ func NewTektonClientOrFatal(initConnectionTimeout time.Duration, clientParams ut
 		}
 		restConfig.QPS = float32(clientParams.QPS)
 		restConfig.Burst = clientParams.Burst
-		tektonClient = tektonclient.NewForConfigOrDie(restConfig).TektonV1beta1()
+		tektonClient = tektonclient.NewForConfigOrDie(restConfig).TektonV1()
 		return nil
 	}
 
diff --git a/backend/src/apiserver/client/tekton_fake.go b/backend/src/apiserver/client/tekton_fake.go
index 2594e793f0..2a0b70e946 100644
--- a/backend/src/apiserver/client/tekton_fake.go
+++ b/backend/src/apiserver/client/tekton_fake.go
@@ -17,7 +17,7 @@ package client
 import (
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/pkg/errors"
-	tektonv1beta1 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1beta1"
+	tektonv1 "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1"
 )
 
 type FakeTektonClient struct {
@@ -28,14 +28,14 @@ func NewFakeTektonClient() *FakeTektonClient {
 	return &FakeTektonClient{NewWorkflowClientFake()}
 }
 
-func (c *FakeTektonClient) Workflow(namespace string) tektonv1beta1.PipelineRunInterface {
+func (c *FakeTektonClient) Workflow(namespace string) tektonv1.PipelineRunInterface {
 	if len(namespace) == 0 {
 		panic(util.NewResourceNotFoundError("Namespace", namespace))
 	}
 	return c.workflowClientFake
 }
 
-func (c *FakeTektonClient) PipelineRun(namespace string) tektonv1beta1.PipelineRunInterface {
+func (c *FakeTektonClient) PipelineRun(namespace string) tektonv1.PipelineRunInterface {
 	if len(namespace) == 0 {
 		panic(util.NewResourceNotFoundError("Namespace", namespace))
 	}
@@ -72,6 +72,6 @@ func NewFakeTektonClientWithBadWorkflow() *FakeTektonClientWithBadWorkflow {
 	return &FakeTektonClientWithBadWorkflow{&FakeBadWorkflowClient{}}
 }
 
-func (c *FakeTektonClientWithBadWorkflow) Workflow(namespace string) tektonv1beta1.PipelineRunInterface {
+func (c *FakeTektonClientWithBadWorkflow) Workflow(namespace string) tektonv1.PipelineRunInterface {
 	return c.workflowClientFake
 }
diff --git a/backend/src/apiserver/client/workflow_fake.go b/backend/src/apiserver/client/workflow_fake.go
index 12e46579e2..0713a8c853 100644
--- a/backend/src/apiserver/client/workflow_fake.go
+++ b/backend/src/apiserver/client/workflow_fake.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/golang/glog"
 	"github.com/pkg/errors"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	k8errors "k8s.io/apimachinery/pkg/api/errors"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	k8schema "k8s.io/apimachinery/pkg/runtime/schema"
@@ -32,18 +32,18 @@ import (
 )
 
 type FakeWorkflowClient struct {
-	workflows       map[string]*v1beta1.PipelineRun
+	workflows       map[string]*tektonV1.PipelineRun
 	lastGeneratedId int
 }
 
 func NewWorkflowClientFake() *FakeWorkflowClient {
 	return &FakeWorkflowClient{
-		workflows:       make(map[string]*v1beta1.PipelineRun),
+		workflows:       make(map[string]*tektonV1.PipelineRun),
 		lastGeneratedId: -1,
 	}
 }
 
-func (c *FakeWorkflowClient) Create(ctx context.Context, workflow *v1beta1.PipelineRun, options v1.CreateOptions) (*v1beta1.PipelineRun, error) {
+func (c *FakeWorkflowClient) Create(ctx context.Context, workflow *tektonV1.PipelineRun, options v1.CreateOptions) (*tektonV1.PipelineRun, error) {
 	if workflow.GenerateName != "" {
 		c.lastGeneratedId += 1
 		workflow.Name = workflow.GenerateName + strconv.Itoa(c.lastGeneratedId)
@@ -53,7 +53,7 @@ func (c *FakeWorkflowClient) Create(ctx context.Context, workflow *v1beta1.Pipel
 	return workflow, nil
 }
 
-func (c *FakeWorkflowClient) Get(ctx context.Context, name string, options v1.GetOptions) (*v1beta1.PipelineRun, error) {
+func (c *FakeWorkflowClient) Get(ctx context.Context, name string, options v1.GetOptions) (*tektonV1.PipelineRun, error) {
 	workflow, ok := c.workflows[name]
 	if ok {
 		return workflow, nil
@@ -61,11 +61,11 @@ func (c *FakeWorkflowClient) Get(ctx context.Context, name string, options v1.Ge
 	return nil, k8errors.NewNotFound(k8schema.ParseGroupResource("tekton.dev"), name)
 }
 
-func (c *FakeWorkflowClient) UpdateStatus(ctx context.Context, workflow *v1beta1.PipelineRun, options v1.UpdateOptions) (*v1beta1.PipelineRun, error) {
+func (c *FakeWorkflowClient) UpdateStatus(ctx context.Context, workflow *tektonV1.PipelineRun, options v1.UpdateOptions) (*tektonV1.PipelineRun, error) {
 	return workflow, nil
 }
 
-func (c *FakeWorkflowClient) List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PipelineRunList, error) {
+func (c *FakeWorkflowClient) List(ctx context.Context, opts v1.ListOptions) (*tektonV1.PipelineRunList, error) {
 	glog.Error("This fake method is not yet implemented.")
 	return nil, nil
 }
@@ -75,7 +75,7 @@ func (c *FakeWorkflowClient) Watch(ctx context.Context, opts v1.ListOptions) (wa
 	return nil, nil
 }
 
-func (c *FakeWorkflowClient) Update(ctx context.Context, workflow *v1beta1.PipelineRun, options v1.UpdateOptions) (*v1beta1.PipelineRun, error) {
+func (c *FakeWorkflowClient) Update(ctx context.Context, workflow *tektonV1.PipelineRun, options v1.UpdateOptions) (*tektonV1.PipelineRun, error) {
 	name := workflow.GetObjectMeta().GetName()
 	_, ok := c.workflows[name]
 	if ok {
@@ -99,7 +99,7 @@ func (c *FakeWorkflowClient) DeleteCollection(ctx context.Context, options v1.De
 }
 
 func (c *FakeWorkflowClient) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options v1.PatchOptions,
-	subresources ...string) (*v1beta1.PipelineRun, error) {
+	subresources ...string) (*tektonV1.PipelineRun, error) {
 
 	_, ok := c.workflows[name]
 	if !ok {
@@ -142,15 +142,15 @@ type FakeBadWorkflowClient struct {
 	FakeWorkflowClient
 }
 
-func (FakeBadWorkflowClient) Create(ctx context.Context, workflow *v1beta1.PipelineRun, options v1.CreateOptions) (*v1beta1.PipelineRun, error) {
+func (FakeBadWorkflowClient) Create(ctx context.Context, workflow *tektonV1.PipelineRun, options v1.CreateOptions) (*tektonV1.PipelineRun, error) {
 	return nil, errors.New("some error")
 }
 
-func (FakeBadWorkflowClient) Get(ctx context.Context, name string, options v1.GetOptions) (*v1beta1.PipelineRun, error) {
+func (FakeBadWorkflowClient) Get(ctx context.Context, name string, options v1.GetOptions) (*tektonV1.PipelineRun, error) {
 	return nil, errors.New("some error")
 }
 
-func (c *FakeBadWorkflowClient) Update(ctx context.Context, workflow *v1beta1.PipelineRun, options v1.UpdateOptions) (*v1beta1.PipelineRun, error) {
+func (c *FakeBadWorkflowClient) Update(ctx context.Context, workflow *tektonV1.PipelineRun, options v1.UpdateOptions) (*tektonV1.PipelineRun, error) {
 	return nil, errors.New("failed to update workflow")
 }
 
diff --git a/backend/src/apiserver/common/config.go b/backend/src/apiserver/common/config.go
index b797c754f0..d0a5ca35e8 100644
--- a/backend/src/apiserver/common/config.go
+++ b/backend/src/apiserver/common/config.go
@@ -20,7 +20,7 @@ import (
 
 	"github.com/golang/glog"
 	"github.com/spf13/viper"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 )
 
 const (
diff --git a/backend/src/apiserver/resource/model_converter.go b/backend/src/apiserver/resource/model_converter.go
index 09bd825a9a..9eb1c279f7 100644
--- a/backend/src/apiserver/resource/model_converter.go
+++ b/backend/src/apiserver/resource/model_converter.go
@@ -26,7 +26,7 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/apiserver/template"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/pkg/errors"
-	v1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 )
 
 func (r *ResourceManager) ToModelExperiment(apiExperiment *api.Experiment) (*model.Experiment, error) {
@@ -84,7 +84,7 @@ func (r *ResourceManager) ToModelRunDetail(run *api.Run, runId string, workflow
 			DisplayName:        run.Name,
 			Name:               workflow.Name,
 			Namespace:          workflow.Namespace,
-			ServiceAccount:     workflow.Spec.ServiceAccountName,
+			ServiceAccount:     workflow.Spec.TaskRunTemplate.ServiceAccountName,
 			Conditions:         workflow.Condition(),
 			Description:        run.Description,
 			ResourceReferences: resourceReferences,
@@ -133,7 +133,7 @@ func (r *ResourceManager) ToModelJob(job *api.Job, swf *util.ScheduledWorkflow,
 	}
 	serviceAccount := ""
 	if swf.Spec.Workflow != nil {
-		serviceAccount = swf.Spec.Workflow.Spec.ServiceAccountName
+		serviceAccount = swf.Spec.Workflow.Spec.TaskRunTemplate.ServiceAccountName
 	}
 	modelJob := &model.Job{
 		UUID:               string(swf.UID),
@@ -235,11 +235,11 @@ func apiParametersToModelParameters(apiParams []*api.Parameter) (string, error)
 	}
 
 	// for Tekton
-	var params []v1beta1.Param
+	var params []tektonV1.Param
 	for _, apiParam := range apiParams {
-		param := v1beta1.Param{
+		param := tektonV1.Param{
 			Name: apiParam.Name,
-			Value: v1beta1.ArrayOrString{
+			Value: tektonV1.ParamValue{
 				Type:      "string",
 				StringVal: apiParam.Value,
 			},
@@ -257,9 +257,9 @@ func runtimeConfigToModelParameters(runtimeConfig *api.PipelineSpec_RuntimeConfi
 	if runtimeConfig == nil {
 		return "", nil
 	}
-	var params []v1beta1.Param
+	var params []tektonV1.Param
 	for k, v := range runtimeConfig.GetParameters() {
-		param := v1beta1.Param{
+		param := tektonV1.Param{
 			Name: k,
 		}
 		switch t := v.Value.(type) {
diff --git a/backend/src/apiserver/resource/resource_manager.go b/backend/src/apiserver/resource/resource_manager.go
index 137c9b83ab..779db8ccb0 100644
--- a/backend/src/apiserver/resource/resource_manager.go
+++ b/backend/src/apiserver/resource/resource_manager.go
@@ -37,8 +37,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/prometheus/client_golang/prometheus"
 	"github.com/prometheus/client_golang/prometheus/promauto"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
-	workflowclient "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
+	workflowclient "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/typed/pipeline/v1"
 	"google.golang.org/grpc/codes"
 	authorizationv1 "k8s.io/api/authorization/v1"
 	corev1 "k8s.io/api/core/v1"
diff --git a/backend/src/apiserver/server/report_server.go b/backend/src/apiserver/server/report_server.go
index b9e0829c2c..79186824fe 100644
--- a/backend/src/apiserver/server/report_server.go
+++ b/backend/src/apiserver/server/report_server.go
@@ -18,13 +18,12 @@ import (
 	"context"
 	"encoding/json"
 
-	// workflow "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1"
 	"github.com/golang/protobuf/ptypes/empty"
 	api "github.com/kubeflow/pipelines/backend/api/v1/go_client"
 	"github.com/kubeflow/pipelines/backend/src/apiserver/resource"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	scheduledworkflow "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
-	workflow "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflow "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 )
 
 type ReportServer struct {
diff --git a/backend/src/apiserver/template/tekton_template.go b/backend/src/apiserver/template/tekton_template.go
index 0ceb7b29a4..d64fab207e 100644
--- a/backend/src/apiserver/template/tekton_template.go
+++ b/backend/src/apiserver/template/tekton_template.go
@@ -10,7 +10,8 @@ import (
 	"github.com/golang/glog"
 	"github.com/pkg/errors"
 
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
+	workflowapiV1beta "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
 	"sigs.k8s.io/yaml"
 
 	api "github.com/kubeflow/pipelines/backend/api/v1/go_client"
@@ -236,8 +237,18 @@ func ValidatePipelineRun(template []byte) (*util.Workflow, error) {
 	if err != nil {
 		return nil, util.NewInvalidInputErrorWithDetails(err, "Failed to parse the PipelineRun template.")
 	}
+	if pr.APIVersion == TektonBetaGroup {
+		var prV1beta1 workflowapiV1beta.PipelineRun
+		err := yaml.Unmarshal(template, &prV1beta1)
+		if err != nil {
+			return nil, util.NewInvalidInputErrorWithDetails(err, "Failed to parse the V1beta1 PipelineRun template.")
+		}
+		ctx := context.Background()
+		prV1beta1.ConvertTo(ctx, &pr)
+		pr.APIVersion = TektonVersion
+	}
 	if pr.APIVersion != TektonVersion {
-		return nil, util.NewInvalidInputError("Unsupported argo version. Expected: %v. Received: %v", TektonVersion, pr.APIVersion)
+		return nil, util.NewInvalidInputError("Unsupported argo or old Tekton version. Expected: %v. Received: %v", TektonVersion, pr.APIVersion)
 	}
 	if pr.Kind != TektonK8sResource {
 		return nil, util.NewInvalidInputError("Unexpected resource type. Expected: %v. Received: %v", TektonK8sResource, pr.Kind)
diff --git a/backend/src/apiserver/template/template.go b/backend/src/apiserver/template/template.go
index 98b370dbc6..8268916169 100644
--- a/backend/src/apiserver/template/template.go
+++ b/backend/src/apiserver/template/template.go
@@ -24,7 +24,7 @@ import (
 	"github.com/kubeflow/pipelines/api/v2alpha1/go/pipelinespec"
 	api "github.com/kubeflow/pipelines/backend/api/v1/go_client"
 
-	wfv1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	wfv1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"sigs.k8s.io/yaml"
 
 	"github.com/kubeflow/pipelines/backend/src/apiserver/common"
@@ -42,7 +42,8 @@ const (
 	Unknown TemplateType = "Unknown"
 
 	TektonGroup       = "tekton.dev/"
-	TektonVersion     = "tekton.dev/v1beta1"
+	TektonBetaGroup   = "tekton.dev/v1beta1"
+	TektonVersion     = "tekton.dev/v1"
 	TektonK8sResource = "PipelineRun"
 )
 
@@ -168,7 +169,7 @@ func OverrideParameterWithSystemDefault(workflow *util.Workflow) error {
 				}
 				patchedSlice = append(patchedSlice, wfv1.Param{
 					Name: currentParam.Name,
-					Value: wfv1.ArrayOrString{
+					Value: wfv1.ParamValue{
 						Type:      "string",
 						StringVal: *util.StringPointer(desiredValue),
 					},
@@ -185,7 +186,7 @@ func setDefaultServiceAccount(workflow *util.Workflow, serviceAccount string) {
 		workflow.SetServiceAccount(serviceAccount)
 		return
 	}
-	workflowServiceAccount := workflow.Spec.ServiceAccountName
+	workflowServiceAccount := workflow.Spec.TaskRunTemplate.ServiceAccountName
 	if len(workflowServiceAccount) == 0 || workflowServiceAccount == common.DefaultPipelineRunnerServiceAccount {
 		// To reserve SDK backward compatibility, the backend only replaces
 		// serviceaccount when it is empty or equal to default value set by SDK.
diff --git a/backend/src/cache/client/tekton.go b/backend/src/cache/client/tekton.go
index 6ef25d173d..9e110f8eaf 100644
--- a/backend/src/cache/client/tekton.go
+++ b/backend/src/cache/client/tekton.go
@@ -10,22 +10,22 @@ import (
 
 	// "k8s.io/client-go/kubernetes"
 	// v1 "k8s.io/client-go/kubernetes/typed/core/v1"
-	v1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	tektoncdclientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/rest"
 )
 
 type TektonInterface interface {
-	GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1beta1.TaskRun, error)
+	GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1.TaskRun, error)
 }
 
 type TektonClient struct {
-	tektonV1beta1Client *tektoncdclientset.Clientset
+	tektonV1Client *tektoncdclientset.Clientset
 }
 
-func (c TektonClient) GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1beta1.TaskRun, error) {
-	return c.tektonV1beta1Client.TektonV1beta1().TaskRuns(namespace).Get(context.Background(), name, queryOptions)
+func (c TektonClient) GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1.TaskRun, error) {
+	return c.tektonV1Client.TektonV1().TaskRuns(namespace).Get(context.Background(), name, queryOptions)
 }
 
 func createTektonClient() (TektonInterface, error) {
diff --git a/backend/src/cache/client/tekton_fake.go b/backend/src/cache/client/tekton_fake.go
index 8e3d148dea..892d0adddd 100644
--- a/backend/src/cache/client/tekton_fake.go
+++ b/backend/src/cache/client/tekton_fake.go
@@ -15,19 +15,19 @@
 package client
 
 import (
-	v1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 type FakeTektonClient struct {
 }
 
-func (c *FakeTektonClient) GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1beta1.TaskRun, error) {
-	tr := &v1beta1.TaskRun{
-		Spec: v1beta1.TaskRunSpec{
-			Status: v1beta1.TaskRunSpecStatusCancelled,
+func (c *FakeTektonClient) GetTaskRun(namespace, name string, queryOptions metav1.GetOptions) (*v1.TaskRun, error) {
+	tr := &v1.TaskRun{
+		Spec: v1.TaskRunSpec{
+			Status: v1.TaskRunSpecStatusCancelled,
 		},
-		Status: v1beta1.TaskRunStatus{},
+		Status: v1.TaskRunStatus{},
 	}
 
 	return tr, nil
diff --git a/backend/src/cache/server/mutation.go b/backend/src/cache/server/mutation.go
index 9a15f10029..f7c8eb20e4 100644
--- a/backend/src/cache/server/mutation.go
+++ b/backend/src/cache/server/mutation.go
@@ -27,7 +27,7 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/cache/client"
 	"github.com/kubeflow/pipelines/backend/src/cache/model"
 	"github.com/kubeflow/pipelines/backend/src/cache/storage"
-	tektonv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonv1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"go.uber.org/zap"
 	"k8s.io/api/admission/v1beta1"
 	corev1 "k8s.io/api/core/v1"
@@ -79,7 +79,7 @@ type ClientManagerInterface interface {
 }
 
 type Template struct {
-	Spec         tektonv1beta1.TaskRunSpec
+	Spec         tektonv1.TaskRunSpec
 	TaskName     string
 	PipelineName string
 	Generation   string
@@ -290,7 +290,7 @@ func prepareMainContainer(pod *corev1.Pod, result string, logger *zap.SugaredLog
 	return dummyContainers, nil
 }
 
-func mutateContainer(results map[string][]*tektonv1beta1.TaskRunResult, originalContainer corev1.Container) (corev1.Container, error) {
+func mutateContainer(results map[string][]*tektonv1.TaskRunResult, originalContainer corev1.Container) (corev1.Container, error) {
 	outputs, found := results[originalContainer.Name]
 	if !found {
 		return originalContainer, fmt.Errorf("could not find cached output for container %s", originalContainer.Name)
@@ -330,8 +330,8 @@ func mutateContainer(results map[string][]*tektonv1beta1.TaskRunResult, original
 	return originalContainer, nil
 }
 
-func unmarshalResult(taskResult string) (map[string][]*tektonv1beta1.TaskRunResult, error) {
-	var results map[string][]*tektonv1beta1.TaskRunResult
+func unmarshalResult(taskResult string) (map[string][]*tektonv1.TaskRunResult, error) {
+	var results map[string][]*tektonv1.TaskRunResult
 	err := json.Unmarshal([]byte(taskResult), &results)
 	if err != nil {
 		return nil, err
@@ -339,7 +339,7 @@ func unmarshalResult(taskResult string) (map[string][]*tektonv1beta1.TaskRunResu
 	return results, nil
 }
 
-func generateCacheKeyFromTemplate(taskRun *tektonv1beta1.TaskRun, pod *corev1.Pod) (string, string, error) {
+func generateCacheKeyFromTemplate(taskRun *tektonv1.TaskRun, pod *corev1.Pod) (string, string, error) {
 	template := Template{}
 	template.Spec = taskRun.Spec
 	template.Spec.Timeout = nil //clear timeout
diff --git a/backend/src/cache/server/watcher.go b/backend/src/cache/server/watcher.go
index c8280cc84d..c272c91768 100644
--- a/backend/src/cache/server/watcher.go
+++ b/backend/src/cache/server/watcher.go
@@ -11,7 +11,7 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/cache/client"
 	"github.com/kubeflow/pipelines/backend/src/cache/model"
 	"github.com/peterhellberg/duration"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"github.com/tektoncd/pipeline/pkg/result"
 	"github.com/tektoncd/pipeline/pkg/termination"
 	"go.uber.org/zap"
@@ -118,7 +118,7 @@ func WatchPods(ctx context.Context, namespaceToWatch string, clientManager Clien
 func parseResult(pod *corev1.Pod, logger *zap.SugaredLogger) (string, error) {
 	logger.Info("Start parse result from pod.")
 
-	outputs := make(map[string][]*v1beta1.TaskRunResult)
+	outputs := make(map[string][]*tektonV1.TaskRunResult)
 
 	containersState := pod.Status.ContainerStatuses
 	if containersState == nil || len(containersState) == 0 {
@@ -133,12 +133,12 @@ func parseResult(pod *corev1.Pod, logger *zap.SugaredLogger) (string, error) {
 				logger.Errorf("termination message could not be parsed as JSON: %v", err)
 				return "", fmt.Errorf("termination message could not be parsed as JSON: %v", err)
 			}
-			output := []*v1beta1.TaskRunResult{}
+			output := []*tektonV1.TaskRunResult{}
 			for _, r := range results {
 				if r.ResultType == result.TaskRunResultType {
-					itemRes := v1beta1.TaskRunResult{}
+					itemRes := tektonV1.TaskRunResult{}
 					itemRes.Name = r.Key
-					itemRes.Value = *v1beta1.NewArrayOrString(r.Value)
+					itemRes.Value = *tektonV1.NewStructuredValues(r.Value)
 					output = append(output, &itemRes)
 				}
 			}
diff --git a/backend/src/common/client/api_server/pipeline_client_fake.go b/backend/src/common/client/api_server/pipeline_client_fake.go
index 0f526f2b4a..e463ccf63b 100644
--- a/backend/src/common/client/api_server/pipeline_client_fake.go
+++ b/backend/src/common/client/api_server/pipeline_client_fake.go
@@ -10,11 +10,11 @@ import (
 	pipelineparams "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/pipeline_client/pipeline_service"
 	pipelinemodel "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/pipeline_model"
 	"github.com/kubeflow/pipelines/backend/src/apiserver/template"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// Replaced Argo v1alpha1.Workflow to Tekton v1beta1.PipelineRun
+// Replaced Argo v1alpha1.Workflow to Tekton v1.PipelineRun
 
 const (
 	PipelineForDefaultTest     = "PIPELINE_ID_10"
diff --git a/backend/src/common/client/api_server/run_client.go b/backend/src/common/client/api_server/run_client.go
index 6ce4e97d32..7e70be3d12 100644
--- a/backend/src/common/client/api_server/run_client.go
+++ b/backend/src/common/client/api_server/run_client.go
@@ -8,7 +8,7 @@ import (
 	params "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/run_client/run_service"
 	model "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/run_model"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"golang.org/x/net/context"
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 	"k8s.io/client-go/tools/clientcmd"
diff --git a/backend/src/common/client/api_server/run_client_fake.go b/backend/src/common/client/api_server/run_client_fake.go
index 5a5a54eee5..1bf4c54c3d 100644
--- a/backend/src/common/client/api_server/run_client_fake.go
+++ b/backend/src/common/client/api_server/run_client_fake.go
@@ -6,10 +6,10 @@ import (
 	"github.com/go-openapi/strfmt"
 	runparams "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/run_client/run_service"
 	runmodel "github.com/kubeflow/pipelines/backend/api/v1/go_http_client/run_model"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 )
 
-// Replaced Argo v1alpha1.Workflow to Tekton v1beta1.PipelineRun
+// Replaced Argo v1alpha1.Workflow to Tekton v1.PipelineRun
 
 const (
 	RunForDefaultTest     = "RUN_DEFAULT"
diff --git a/backend/src/common/util/formatter.go b/backend/src/common/util/formatter.go
index cc6c47d08e..786beb4515 100644
--- a/backend/src/common/util/formatter.go
+++ b/backend/src/common/util/formatter.go
@@ -20,8 +20,7 @@ import (
 	"time"
 
 	"github.com/golang/glog"
-
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	v1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 )
 
 type WorkflowFormatter struct {
@@ -44,7 +43,7 @@ func NewWorkflowFormatter(uuid UUIDGeneratorInterface, scheduledAtInSec int64,
 	}
 }
 
-func (p *WorkflowFormatter) Format(workflow *v1beta1.PipelineRun) error {
+func (p *WorkflowFormatter) Format(workflow *v1.PipelineRun) error {
 	workflowName := getWorkflowName(workflow)
 	formattedWorkflowName, err := p.formatString(workflowName)
 	if err != nil {
@@ -60,7 +59,7 @@ func (p *WorkflowFormatter) Format(workflow *v1beta1.PipelineRun) error {
 	return nil
 }
 
-func getWorkflowName(workflow *v1beta1.PipelineRun) string {
+func getWorkflowName(workflow *v1.PipelineRun) string {
 
 	const (
 		defaultWorkflowName = "workflow-"
@@ -75,12 +74,12 @@ func getWorkflowName(workflow *v1beta1.PipelineRun) string {
 	return defaultWorkflowName
 }
 
-func (p *WorkflowFormatter) formatWorkflowParameters(workflow *v1beta1.PipelineRun) error {
+func (p *WorkflowFormatter) formatWorkflowParameters(workflow *v1.PipelineRun) error {
 	if workflow.Spec.Params == nil {
 		return nil
 	}
 
-	newParams := make([]v1beta1.Param, 0)
+	newParams := make([]v1.Param, 0)
 
 	for _, param := range workflow.Spec.Params {
 		newParam, err := p.formatParameter(param)
@@ -94,18 +93,18 @@ func (p *WorkflowFormatter) formatWorkflowParameters(workflow *v1beta1.PipelineR
 	return nil
 }
 
-func (p *WorkflowFormatter) formatParameter(param v1beta1.Param) (*v1beta1.Param, error) {
+func (p *WorkflowFormatter) formatParameter(param v1.Param) (*v1.Param, error) {
 	formatted, err := p.formatString(param.Value.StringVal)
 	if err != nil {
 		return nil, err
 	}
 
-	tektonFormatted := v1beta1.ArrayOrString{
+	tektonFormatted := v1.ParamValue{
 		Type:      "string",
 		StringVal: formatted,
 	}
 
-	return &v1beta1.Param{
+	return &v1.Param{
 		Name:  param.Name,
 		Value: tektonFormatted,
 	}, nil
diff --git a/backend/src/common/util/template_util.go b/backend/src/common/util/template_util.go
index 8baca23688..cd6d85c8af 100644
--- a/backend/src/common/util/template_util.go
+++ b/backend/src/common/util/template_util.go
@@ -15,23 +15,26 @@
 package util
 
 import (
+	"context"
 	"encoding/json"
 
 	"sigs.k8s.io/yaml"
 
-	tektonV1Beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
+	workflowapiV1beta "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
 )
 
 const (
-	tektonVersion     = "tekton.dev/v1beta1"
+	tektonBetaGroup   = "tekton.dev/v1beta1"
+	tektonVersion     = "tekton.dev/v1"
 	tektonK8sResource = "PipelineRun"
 )
 
-func UnmarshalParameters(paramsString string) ([]tektonV1Beta1.Param, error) {
+func UnmarshalParameters(paramsString string) ([]tektonV1.Param, error) {
 	if paramsString == "" {
 		return nil, nil
 	}
-	var params []tektonV1Beta1.Param
+	var params []tektonV1.Param
 	err := json.Unmarshal([]byte(paramsString), &params)
 	if err != nil {
 		return nil, NewInternalServerError(err, "Parameters have wrong format")
@@ -39,7 +42,7 @@ func UnmarshalParameters(paramsString string) ([]tektonV1Beta1.Param, error) {
 	return params, nil
 }
 
-func MarshalParameters(params []tektonV1Beta1.Param) (string, error) {
+func MarshalParameters(params []tektonV1.Param) (string, error) {
 	if params == nil {
 		return "[]", nil
 	}
@@ -77,11 +80,21 @@ func GetTektonParameters(template []byte) (string, error) {
 }
 
 func ValidatePipelineRun(template []byte) (*Workflow, error) {
-	var wf tektonV1Beta1.PipelineRun
+	var wf tektonV1.PipelineRun
 	err := yaml.Unmarshal(template, &wf)
 	if err != nil {
 		return nil, NewInvalidInputErrorWithDetails(err, "Failed to parse the parameter.")
 	}
+	if wf.APIVersion == tektonBetaGroup {
+		var prV1beta1 workflowapiV1beta.PipelineRun
+		err := yaml.Unmarshal(template, &prV1beta1)
+		if err != nil {
+			return nil, NewInvalidInputErrorWithDetails(err, "Failed to parse the V1beta1 PipelineRun template.")
+		}
+		ctx := context.Background()
+		prV1beta1.ConvertTo(ctx, &wf)
+		wf.APIVersion = tektonVersion
+	}
 	if wf.APIVersion != tektonVersion {
 		return nil, NewInvalidInputError("Unsupported tekton version. Expected: %v. Received: %v", tektonVersion, wf.APIVersion)
 	}
diff --git a/backend/src/common/util/workflow.go b/backend/src/common/util/workflow.go
index 3e213fe071..663d927135 100644
--- a/backend/src/common/util/workflow.go
+++ b/backend/src/common/util/workflow.go
@@ -20,7 +20,7 @@ import (
 	"github.com/golang/glog"
 	swfregister "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow"
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/util/json"
@@ -49,14 +49,14 @@ func (w *Workflow) GetWorkflowParametersAsMap() map[string]string {
 
 // SetServiceAccount Set the service account to run the workflow.
 func (w *Workflow) SetServiceAccount(serviceAccount string) {
-	w.Spec.ServiceAccountName = serviceAccount
+	w.Spec.TaskRunTemplate.ServiceAccountName = serviceAccount
 }
 
 // OverrideParameters overrides some of the parameters of a Workflow.
 func (w *Workflow) OverrideParameters(desiredParams map[string]string) {
 	desiredSlice := make([]workflowapi.Param, 0)
 	for _, currentParam := range w.Spec.Params {
-		var desiredValue workflowapi.ArrayOrString = workflowapi.ArrayOrString{
+		var desiredValue workflowapi.ParamValue = workflowapi.ParamValue{
 			Type:      "string",
 			StringVal: "",
 		}
diff --git a/backend/src/crd/controller/scheduledworkflow/client/workflow_client.go b/backend/src/crd/controller/scheduledworkflow/client/workflow_client.go
index 02b12b7a3c..eaac97ece4 100644
--- a/backend/src/crd/controller/scheduledworkflow/client/workflow_client.go
+++ b/backend/src/crd/controller/scheduledworkflow/client/workflow_client.go
@@ -22,9 +22,9 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/crd/controller/scheduledworkflow/util"
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
 	wraperror "github.com/pkg/errors"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	workflowclientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
-	"github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/client/informers/externalversions/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
@@ -34,12 +34,12 @@ import (
 // WorkflowClient is a client to call the Workflow API.
 type WorkflowClient struct {
 	clientSet workflowclientset.Interface
-	informer  v1beta1.PipelineRunInformer
+	informer  tektonV1.PipelineRunInformer
 }
 
 // NewWorkflowClient creates an instance of the WorkflowClient.
 func NewWorkflowClient(clientSet workflowclientset.Interface,
-	informer v1beta1.PipelineRunInformer) *WorkflowClient {
+	informer tektonV1.PipelineRunInformer) *WorkflowClient {
 	return &WorkflowClient{
 		clientSet: clientSet,
 		informer:  informer,
@@ -132,7 +132,7 @@ func retrieveIndex(workflow *workflowapi.PipelineRun) int64 {
 // Create creates a workflow given a namespace and its specification.
 func (p *WorkflowClient) Create(ctx context.Context, namespace string, workflow *commonutil.Workflow) (
 	*commonutil.Workflow, error) {
-	result, err := p.clientSet.TektonV1beta1().PipelineRuns(namespace).Create(ctx, workflow.Get(), metav1.CreateOptions{})
+	result, err := p.clientSet.TektonV1().PipelineRuns(namespace).Create(ctx, workflow.Get(), metav1.CreateOptions{})
 	if err != nil {
 		return nil, wraperror.Wrapf(err, "Error creating workflow in namespace (%v): %v: %+v", namespace,
 			err, workflow.Get())
diff --git a/backend/src/crd/controller/scheduledworkflow/controller.go b/backend/src/crd/controller/scheduledworkflow/controller.go
index 871f8309f9..259babfa73 100644
--- a/backend/src/crd/controller/scheduledworkflow/controller.go
+++ b/backend/src/crd/controller/scheduledworkflow/controller.go
@@ -29,7 +29,7 @@ import (
 	swfinformers "github.com/kubeflow/pipelines/backend/src/crd/pkg/client/informers/externalversions"
 	wraperror "github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	workflowclientset "github.com/tektoncd/pipeline/pkg/client/clientset/versioned"
 	workflowinformers "github.com/tektoncd/pipeline/pkg/client/informers/externalversions"
 	corev1 "k8s.io/api/core/v1"
@@ -89,7 +89,7 @@ func NewController(
 
 	// obtain references to shared informers
 	swfInformer := swfInformerFactory.Scheduledworkflow().V1beta1().ScheduledWorkflows()
-	workflowInformer := workflowInformerFactory.Tekton().V1beta1().PipelineRuns()
+	workflowInformer := workflowInformerFactory.Tekton().V1().PipelineRuns()
 
 	// Add controller types to the default Kubernetes Scheme so Events can be
 	// logged for controller types.
diff --git a/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go b/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go
index debad58b01..85f3ca56b7 100644
--- a/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go
+++ b/backend/src/crd/controller/scheduledworkflow/util/scheduled_workflow.go
@@ -24,7 +24,7 @@ import (
 
 	commonutil "github.com/kubeflow/pipelines/backend/src/common/util"
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	core "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -156,7 +156,7 @@ func (s *ScheduledWorkflow) NewWorkflow(
 
 	const (
 		workflowKind       = "PipelineRun"
-		workflowApiVersion = "tekton.dev/v1beta1"
+		workflowApiVersion = "tekton.dev/v1"
 	)
 
 	// Creating the workflow.
diff --git a/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go b/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go
index a67f724069..cb57262d7e 100644
--- a/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go
+++ b/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1/types.go
@@ -15,7 +15,7 @@
 package v1beta1
 
 import (
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	core "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -92,7 +92,7 @@ type WorkflowResource struct {
 	Parameters []Parameter `json:"parameters,omitempty"`
 
 	// Specification of the workflow to start.
-	Spec v1beta1.PipelineRunSpec `json:"spec,omitempty"`
+	Spec tektonV1.PipelineRunSpec `json:"spec,omitempty"`
 
 	// Metadata from main pipelinerun
 	metav1.ObjectMeta `json:"metadata,omitempty"`
@@ -229,7 +229,7 @@ type WorkflowStatus struct {
 	UID types.UID `json:"uid,omitempty"`
 
 	// Phase is a high level summary of the status of the workflow.
-	Phase v1beta1.PipelineRunSpecStatus `json:"phase,omitempty"`
+	Phase tektonV1.PipelineRunSpecStatus `json:"phase,omitempty"`
 
 	// A human readable message indicating details about why the workflow is in
 	// this condition.
diff --git a/scripts/deploy/github/build-images.sh b/scripts/deploy/github/build-images.sh
index 743fac0278..00bb5c0c97 100755
--- a/scripts/deploy/github/build-images.sh
+++ b/scripts/deploy/github/build-images.sh
@@ -20,6 +20,8 @@ set -e
 
 REGISTRY="${REGISTRY:-kind-registry:5000}"
 
+docker system prune -a -f
+
 docker build -t "${REGISTRY}/kfp-tekton/apiserver:latest" -f backend/Dockerfile . && docker push "${REGISTRY}/kfp-tekton/apiserver:latest" &
 docker build -t "${REGISTRY}/kfp-tekton/persistenceagent:latest" -f backend/Dockerfile.persistenceagent . && docker push "${REGISTRY}/kfp-tekton/persistenceagent:latest" &
 docker build -t "${REGISTRY}/kfp-tekton/metadata-writer:latest" -f backend/metadata_writer/Dockerfile . && docker push "${REGISTRY}/kfp-tekton/metadata-writer:latest" &


Test patch:
diff --git a/backend/src/agent/persistence/worker/metrics_reporter_test.go b/backend/src/agent/persistence/worker/metrics_reporter_test.go
index f8e57f6003..023f8c2df5 100644
--- a/backend/src/agent/persistence/worker/metrics_reporter_test.go
+++ b/backend/src/agent/persistence/worker/metrics_reporter_test.go
@@ -20,7 +20,7 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/agent/persistence/client"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/stretchr/testify/assert"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 )
diff --git a/backend/src/agent/persistence/worker/persistence_worker_test.go b/backend/src/agent/persistence/worker/persistence_worker_test.go
index 6556413f8d..e2b23055b4 100644
--- a/backend/src/agent/persistence/worker/persistence_worker_test.go
+++ b/backend/src/agent/persistence/worker/persistence_worker_test.go
@@ -21,7 +21,7 @@ import (
 	client "github.com/kubeflow/pipelines/backend/src/agent/persistence/client"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/stretchr/testify/assert"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 	"k8s.io/client-go/tools/cache"
diff --git a/backend/src/agent/persistence/worker/workflow_saver_test.go b/backend/src/agent/persistence/worker/workflow_saver_test.go
index 4209725f40..e1b3f99e59 100644
--- a/backend/src/agent/persistence/worker/workflow_saver_test.go
+++ b/backend/src/agent/persistence/worker/workflow_saver_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/agent/persistence/client"
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/stretchr/testify/assert"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 )
diff --git a/backend/src/apiserver/archive/log_test.go b/backend/src/apiserver/archive/log_test.go
index 4bc801490b..ce537fcf82 100644
--- a/backend/src/apiserver/archive/log_test.go
+++ b/backend/src/apiserver/archive/log_test.go
@@ -19,12 +19,13 @@ import (
 	"bytes"
 	"compress/gzip"
 	"encoding/json"
+	"testing"
+	"time"
+
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	"github.com/stretchr/testify/assert"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"testing"
-	"time"
 )
 
 func compressInput(t *testing.T, content string) []byte {
@@ -61,7 +62,7 @@ func initLogArchive() *LogArchive {
 
 func TestGetLogObjectKey(t *testing.T) {
 	logArchive := initLogArchive()
-	workflow := util.NewWorkflow(&v1beta1.PipelineRun{
+	workflow := util.NewWorkflow(&tektonV1.PipelineRun{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: "MY_NAMESPACE",
 			Name:      "MY_NAME",
diff --git a/backend/src/apiserver/resource/resource_manager_test.go b/backend/src/apiserver/resource/resource_manager_test.go
index 4075176d1f..3461a2b676 100644
--- a/backend/src/apiserver/resource/resource_manager_test.go
+++ b/backend/src/apiserver/resource/resource_manager_test.go
@@ -29,13 +29,13 @@ import (
 	"github.com/spf13/viper"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"google.golang.org/grpc/codes"
 	corev1 "k8s.io/api/core/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// Converted argo v1alpha1.workflow to tekton v1beta1.pipelinerun
+// Converted argo v1alpha1.workflow to tekton tektonV1.pipelinerun
 // Rename argo fake client to tekton fake client
 
 // Removed all the run and create tests since the Tekton client spec is constantly changing
@@ -130,7 +130,12 @@ func (m *FakeBadObjectStore) GetFromYamlFile(o interface{}, filePath string) err
 	return util.NewInternalServerError(errors.New("Error"), "bad object store")
 }
 
-var testWorkflow = util.NewWorkflow(&v1beta1.PipelineRun{
+var testWorkflow = util.NewWorkflow(&tektonV1.PipelineRun{
+	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1beta1", Kind: "PipelineRun"},
+	ObjectMeta: v1.ObjectMeta{Name: "workflow-name", UID: "workflow1", Namespace: "ns1"},
+})
+
+var testV1beta1Workflow = util.NewWorkflow(&tektonV1.PipelineRun{
 	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1beta1", Kind: "PipelineRun"},
 	ObjectMeta: v1.ObjectMeta{Name: "workflow-name", UID: "workflow1", Namespace: "ns1"},
 })
@@ -142,6 +147,7 @@ func initWithPipeline(t *testing.T) (*FakeClientManager, *ResourceManager, *mode
 	manager := NewResourceManager(store)
 	p, err := manager.CreatePipeline("p1", "", "", []byte(testWorkflow.ToStringForStore()))
 	assert.Nil(t, err)
+	manager.CreatePipeline("p1", "", "", []byte(testV1beta1Workflow.ToStringForStore()))
 	return store, manager, p
 }
 
@@ -270,6 +276,7 @@ func TestGetPipelineTemplate(t *testing.T) {
 	actualTemplate, err := manager.GetPipelineTemplate(p.UUID)
 	assert.Nil(t, err)
 	assert.Equal(t, []byte(testWorkflow.ToStringForStore()), actualTemplate)
+	assert.Equal(t, []byte(testV1beta1Workflow.ToStringForStore()), actualTemplate)
 }
 
 func TestGetPipelineTemplate_PipelineMetadataNotFound(t *testing.T) {
diff --git a/backend/src/apiserver/server/pipeline_upload_server_test.go b/backend/src/apiserver/server/pipeline_upload_server_test.go
index f5a9ad09e9..94caffe90b 100644
--- a/backend/src/apiserver/server/pipeline_upload_server_test.go
+++ b/backend/src/apiserver/server/pipeline_upload_server_test.go
@@ -45,7 +45,7 @@ func TestUploadPipeline(t *testing.T) {
 		spec []byte
 	}{{
 		name: "upload Tekton Pipelinerun YAML",
-		spec: []byte("apiVersion: tekton.dev/v1beta1\nkind: PipelineRun"),
+		spec: []byte("apiVersion: tekton.dev/v1\nkind: PipelineRun"),
 	}, {
 		name: "upload pipeline v2 job in proto json",
 		spec: []byte(v2SpecHelloWorld),
@@ -55,7 +55,7 @@ func TestUploadPipeline(t *testing.T) {
 			clientManager, server := setupClientManagerAndServer()
 			bytesBuffer, writer := setupWriter("")
 			setWriterWithBuffer("uploadfile", "hello-world.yaml", string(test.spec), writer)
-			response := uploadPipeline("/apis/v1beta1/pipelines/upload",
+			response := uploadPipeline("/apis/v1/pipelines/upload",
 				bytes.NewReader(bytesBuffer.Bytes()), writer, server.UploadPipeline)
 			if response.Code != 200 {
 				t.Fatalf("Upload response is not 200, message: %s", string(response.Body.Bytes()))
@@ -108,7 +108,7 @@ func TestUploadPipeline(t *testing.T) {
 
 			// Set the fake uuid generator with a new uuid to avoid generate a same uuid as above.
 			server = updateClientManager(clientManager, util.NewFakeUUIDGeneratorOrFatal(fakeVersionUUID, nil))
-			response = uploadPipeline("/apis/v1beta1/pipelines/upload_version?name="+fakeVersionName+"&pipelineid="+resource.DefaultFakeUUID+"&description="+fakeDescription,
+			response = uploadPipeline("/apis/v1/pipelines/upload_version?name="+fakeVersionName+"&pipelineid="+resource.DefaultFakeUUID+"&description="+fakeDescription,
 				bytes.NewReader(bytesBuffer.Bytes()), writer, server.UploadPipelineVersion)
 			assert.Equal(t, 200, response.Code)
 			assert.Contains(t, response.Body.String(), `"created_at":"1970-01-01T00:00:02Z"`)
diff --git a/backend/src/apiserver/server/report_server_test.go b/backend/src/apiserver/server/report_server_test.go
index 1be620d211..8dc0479496 100644
--- a/backend/src/apiserver/server/report_server_test.go
+++ b/backend/src/apiserver/server/report_server_test.go
@@ -8,14 +8,13 @@ import (
 	"github.com/kubeflow/pipelines/backend/src/common/util"
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
 	"github.com/stretchr/testify/assert"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"google.golang.org/grpc/codes"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 )
 
-// Converted argo v1alpha1.workflow to tekton v1beta1.pipelinerun
+// Converted argo v1alpha1.workflow to tekton workflowapi.pipelinerun
 // removed tests: "TestReportWorkflow"
 
 func TestReportWorkflow_ValidationFailed(t *testing.T) {
@@ -23,7 +22,7 @@ func TestReportWorkflow_ValidationFailed(t *testing.T) {
 	defer clientManager.Close()
 	reportServer := NewReportServer(resourceManager)
 
-	workflow := util.NewWorkflow(&v1beta1.PipelineRun{
+	workflow := util.NewWorkflow(&workflowapi.PipelineRun{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: "default",
 			UID:       types.UID(run.UUID),
@@ -45,7 +44,7 @@ func TestValidateReportWorkflowRequest(t *testing.T) {
 			Namespace: "MY_NAMESPACE",
 			UID:       "1",
 			OwnerReferences: []metav1.OwnerReference{{
-				APIVersion: "kubeflow.org/v1beta1",
+				APIVersion: "kubeflow.org/workflowapi",
 				Kind:       "ScheduledWorkflow",
 				Name:       "SCHEDULE_NAME",
 				UID:        types.UID("1"),
@@ -72,7 +71,7 @@ func TestValidateReportWorkflowRequest_MissingField(t *testing.T) {
 			Namespace: "MY_NAMESPACE",
 			UID:       "1",
 			OwnerReferences: []metav1.OwnerReference{{
-				APIVersion: "kubeflow.org/v1beta1",
+				APIVersion: "kubeflow.org/workflowapi",
 				Kind:       "ScheduledWorkflow",
 				Name:       "SCHEDULE_NAME",
 				UID:        types.UID("1"),
@@ -90,7 +89,7 @@ func TestValidateReportWorkflowRequest_MissingField(t *testing.T) {
 			Name: "MY_NAME",
 			UID:  "1",
 			OwnerReferences: []metav1.OwnerReference{{
-				APIVersion: "kubeflow.org/v1beta1",
+				APIVersion: "kubeflow.org/workflowapi",
 				Kind:       "ScheduledWorkflow",
 				Name:       "SCHEDULE_NAME",
 				UID:        types.UID("1"),
@@ -109,7 +108,7 @@ func TestValidateReportWorkflowRequest_MissingField(t *testing.T) {
 			Name:      "MY_NAME",
 			Namespace: "MY_NAMESPACE",
 			OwnerReferences: []metav1.OwnerReference{{
-				APIVersion: "kubeflow.org/v1beta1",
+				APIVersion: "kubeflow.org/workflowapi",
 				Kind:       "ScheduledWorkflow",
 				Name:       "SCHEDULE_NAME",
 				UID:        types.UID("1"),
diff --git a/backend/src/apiserver/server/run_server_test.go b/backend/src/apiserver/server/run_server_test.go
index 9fcbd91806..2ca9a76f3e 100644
--- a/backend/src/apiserver/server/run_server_test.go
+++ b/backend/src/apiserver/server/run_server_test.go
@@ -35,7 +35,7 @@ func TestCreateRun(t *testing.T) {
 	expectedRuntimeWorkflow := testWorkflow.DeepCopy()
 	expectedRuntimeWorkflow.Labels = map[string]string{util.LabelKeyWorkflowRunId: "123e4567-e89b-12d3-a456-426655440000"}
 	expectedRuntimeWorkflow.Annotations = map[string]string{util.AnnotationKeyRunName: "run1"}
-	expectedRuntimeWorkflow.Spec.ServiceAccountName = "pipeline-runner"
+	expectedRuntimeWorkflow.Spec.TaskRunTemplate.ServiceAccountName = "pipeline-runner"
 }
 
 func TestCreateRunPatch(t *testing.T) {
@@ -55,7 +55,7 @@ func TestCreateRunPatch(t *testing.T) {
 	expectedRuntimeWorkflow := testWorkflowPatch.DeepCopy()
 	expectedRuntimeWorkflow.Labels = map[string]string{util.LabelKeyWorkflowRunId: "123e4567-e89b-12d3-a456-426655440000"}
 	expectedRuntimeWorkflow.Annotations = map[string]string{util.AnnotationKeyRunName: "run1"}
-	expectedRuntimeWorkflow.Spec.ServiceAccountName = "pipeline-runner"
+	expectedRuntimeWorkflow.Spec.TaskRunTemplate.ServiceAccountName = "pipeline-runner"
 }
 
 func TestCreateRun_Unauthorized(t *testing.T) {
@@ -121,7 +121,7 @@ func TestCreateRun_Multiuser(t *testing.T) {
 	expectedRuntimeWorkflow := testWorkflow.DeepCopy()
 	expectedRuntimeWorkflow.Labels = map[string]string{util.LabelKeyWorkflowRunId: "123e4567-e89b-12d3-a456-426655440000"}
 	expectedRuntimeWorkflow.Annotations = map[string]string{util.AnnotationKeyRunName: "run1"}
-	expectedRuntimeWorkflow.Spec.ServiceAccountName = "default-editor" // In multi-user mode, we use default service account.
+	expectedRuntimeWorkflow.Spec.TaskRunTemplate.ServiceAccountName = "default-editor" // In multi-user mode, we use default service account.
 }
 
 func TestListRun(t *testing.T) {
diff --git a/backend/src/apiserver/server/test_util.go b/backend/src/apiserver/server/test_util.go
index f899f5cb45..489060077a 100644
--- a/backend/src/apiserver/server/test_util.go
+++ b/backend/src/apiserver/server/test_util.go
@@ -27,26 +27,26 @@ import (
 	"github.com/pkg/errors"
 	"github.com/spf13/viper"
 	"github.com/stretchr/testify/assert"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	"google.golang.org/grpc/codes"
 	authorizationv1 "k8s.io/api/authorization/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// Converted argo v1alpha1.workflow to tekton v1beta1.pipelinerun
+// Converted argo v1alpha1.workflow to tekton tektonV1.pipelinerun
 // Removed conflicted v1alpha1.workflowspec.
 
 const (
 	invalidPipelineVersionId = "not_exist_pipeline_version"
 )
 
-var testWorkflow = util.NewWorkflow(&v1beta1.PipelineRun{
-	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1beta1", Kind: "PipelineRun"},
+var testWorkflow = util.NewWorkflow(&tektonV1.PipelineRun{
+	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1", Kind: "PipelineRun"},
 	ObjectMeta: v1.ObjectMeta{Name: "workflow-name", UID: "workflow1", Namespace: "ns1"},
 })
 
-var testWorkflowPatch = util.NewWorkflow(&v1beta1.PipelineRun{
-	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1beta1", Kind: "PipelineRun"},
+var testWorkflowPatch = util.NewWorkflow(&tektonV1.PipelineRun{
+	TypeMeta:   v1.TypeMeta{APIVersion: "tekton.dev/v1", Kind: "PipelineRun"},
 	ObjectMeta: v1.ObjectMeta{Name: "workflow-name", UID: "workflow2"},
 })
 
diff --git a/backend/src/common/util/formatter_test.go b/backend/src/common/util/formatter_test.go
index 4cab323da0..0050e50763 100644
--- a/backend/src/common/util/formatter_test.go
+++ b/backend/src/common/util/formatter_test.go
@@ -20,11 +20,11 @@ import (
 	"time"
 
 	"github.com/stretchr/testify/assert"
-	"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	tektonV1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// Replaced Argo v1alpha1.Workflow and spec to Tekton v1beta1.PipelineRun and spec
+// Replaced Argo v1alpha1.Workflow and spec to Tekton tektonV1.PipelineRun and spec
 // Replaced Argo parameters to Tekton ArrayorString
 
 const (
@@ -121,16 +121,16 @@ func TestFormatParameter(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	param := v1beta1.Param{
+	param := tektonV1.Param{
 		Name: "PARAM_NAME",
-		Value: v1beta1.ArrayOrString{
+		Value: tektonV1.ParamValue{
 			Type:      "string",
 			StringVal: "PARAM_PREFIX_[[uuid]]_SUFFIX",
 		}}
 
-	expected := v1beta1.Param{
+	expected := tektonV1.Param{
 		Name: "PARAM_NAME",
-		Value: v1beta1.ArrayOrString{
+		Value: tektonV1.ParamValue{
 			Type:      "string",
 			StringVal: "PARAM_PREFIX_" + defaultUUID + "_SUFFIX",
 		}}
@@ -146,9 +146,9 @@ func TestFormatParameterError(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	param := v1beta1.Param{
+	param := tektonV1.Param{
 		Name: "PARAM_NAME",
-		Value: v1beta1.ArrayOrString{
+		Value: tektonV1.ParamValue{
 			Type:      "string",
 			StringVal: "PARAM_PREFIX_[[uuid]]_SUFFIX",
 		}}
@@ -164,13 +164,13 @@ func TestFormatNothingToDoExceptAddUUID(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
+	workflow := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{Name: "workflow-name"},
-		Spec:       v1beta1.PipelineRunSpec{}}
+		Spec:       tektonV1.PipelineRunSpec{}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-name-"},
-		Spec:       v1beta1.PipelineRunSpec{}}
+		Spec:       tektonV1.PipelineRunSpec{}}
 
 	err := formatter.Format(workflow)
 	assert.Nil(t, err)
@@ -183,13 +183,13 @@ func TestFormatEverytingToChange(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
+	workflow := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{Name: "workflow-[[schedule]]-name"},
-		Spec:       v1beta1.PipelineRunSpec{}}
+		Spec:       tektonV1.PipelineRunSpec{}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-20170706050403-name-"},
-		Spec:       v1beta1.PipelineRunSpec{}}
+		Spec:       tektonV1.PipelineRunSpec{}}
 
 	err := formatter.Format(workflow)
 	assert.Nil(t, err)
@@ -202,10 +202,10 @@ func TestFormatOnlyWorkflowName(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
+	workflow := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{Name: "workflow-[[schedule]]-name"}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-20170706050403-name-"}}
 
 	err := formatter.Format(workflow)
@@ -219,10 +219,10 @@ func TestFormatOnlyWorkflowGeneratedName(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
+	workflow := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-[[schedule]]-name-"}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-20170706050403-name-"}}
 
 	err := formatter.Format(workflow)
@@ -236,9 +236,9 @@ func TestFormatNoWorkflowNames(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{}
+	workflow := &tektonV1.PipelineRun{}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-"}}
 
 	err := formatter.Format(workflow)
@@ -252,12 +252,12 @@ func TestFormat2WorkflowNames(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
+	workflow := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{
 			Name:         "workflow-[[schedule]]-name",
 			GenerateName: "workflow-[[schedule]]-generated-name-"}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-20170706050403-generated-name-"}}
 
 	err := formatter.Format(workflow)
@@ -271,12 +271,12 @@ func TestFormatOnlyWorkflowParameters(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{
-		Spec: v1beta1.PipelineRunSpec{}}
+	workflow := &tektonV1.PipelineRun{
+		Spec: tektonV1.PipelineRunSpec{}}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-"},
-		Spec:       v1beta1.PipelineRunSpec{}}
+		Spec:       tektonV1.PipelineRunSpec{}}
 
 	err := formatter.Format(workflow)
 	assert.Nil(t, err)
@@ -289,9 +289,9 @@ func TestFormatEmptyWorkflow(t *testing.T) {
 		getDefaultScheduledAtSec(),
 		getDefaultCreatedAtSec())
 
-	workflow := &v1beta1.PipelineRun{}
+	workflow := &tektonV1.PipelineRun{}
 
-	expected := &v1beta1.PipelineRun{
+	expected := &tektonV1.PipelineRun{
 		ObjectMeta: v1.ObjectMeta{GenerateName: "workflow-"}}
 
 	err := formatter.Format(workflow)
diff --git a/backend/src/common/util/workflow_test.go b/backend/src/common/util/workflow_test.go
index ead08b3c11..8b9c97dfb3 100644
--- a/backend/src/common/util/workflow_test.go
+++ b/backend/src/common/util/workflow_test.go
@@ -19,7 +19,7 @@ import (
 
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
 	"github.com/stretchr/testify/assert"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 )
diff --git a/backend/src/crd/controller/scheduledworkflow/client/workflow_client_test.go b/backend/src/crd/controller/scheduledworkflow/client/workflow_client_test.go
index c165960477..8e64e937a0 100644
--- a/backend/src/crd/controller/scheduledworkflow/client/workflow_client_test.go
+++ b/backend/src/crd/controller/scheduledworkflow/client/workflow_client_test.go
@@ -21,7 +21,7 @@ import (
 	commonutil "github.com/kubeflow/pipelines/backend/src/common/util"
 	swfapi "github.com/kubeflow/pipelines/backend/src/crd/pkg/apis/scheduledworkflow/v1beta1"
 	"github.com/stretchr/testify/assert"
-	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
+	workflowapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
diff --git a/sdk/python/tests/compiler/compiler_tests_e2e.py b/sdk/python/tests/compiler/compiler_tests_e2e.py
index 2ee282f958..b736c60d5c 100644
--- a/sdk/python/tests/compiler/compiler_tests_e2e.py
+++ b/sdk/python/tests/compiler/compiler_tests_e2e.py
@@ -299,9 +299,9 @@ def exit_on_error(cmd, expected_output=None):
     tkn_ver_out = exit_on_error("tkn version")
     tkn_pipeline_ver = re.search(r"^Pipeline version: (.*)$", tkn_ver_out, re.MULTILINE).group(1)
     tkn_client_ver = re.search(r"^Client version: (.*)$", tkn_ver_out, re.MULTILINE).group(1)
-    assert version.parse(TKN_PIPELINE_MIN_VERSION) <= version.parse(tkn_pipeline_ver),\
+    assert version.parse(TKN_PIPELINE_MIN_VERSION) <= version.parse(tkn_pipeline_ver), \
         "Tekton Pipeline version must be >= {}, found '{}'".format(TKN_PIPELINE_MIN_VERSION, tkn_pipeline_ver)
-    assert version.parse(TKN_CLIENT_MIN_VERSION) <= version.parse(tkn_client_ver),\
+    assert version.parse(TKN_CLIENT_MIN_VERSION) <= version.parse(tkn_client_ver), \
         "Tekton CLI version must be >= {}, found '{}'".format(TKN_CLIENT_MIN_VERSION, tkn_client_ver)