func/pipelines/tekton/resources.go

172 lines
4.2 KiB
Go

package tekton
import (
"context"
"fmt"
pplnv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fn "knative.dev/kn-plugin-func"
)
func deletePipelines(ctx context.Context, namespace string, listOptions metav1.ListOptions) (err error) {
client, err := NewTektonClient()
if err != nil {
return
}
return client.Pipelines(namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, listOptions)
}
func deletePipelineRuns(ctx context.Context, namespace string, listOptions metav1.ListOptions) (err error) {
client, err := NewTektonClient()
if err != nil {
return
}
return client.PipelineRuns(namespace).DeleteCollection(ctx, metav1.DeleteOptions{}, listOptions)
}
func generatePipeline(f fn.Function, labels map[string]string) *pplnv1beta1.Pipeline {
pipelineName := getPipelineName(f)
params := []pplnv1beta1.ParamSpec{
{
Name: "gitRepository",
Description: "Git repository that hosts the function project",
Default: pplnv1beta1.NewArrayOrString(*f.Git.URL),
},
{
Name: "gitRevision",
Description: "Git revision to build",
},
{
Name: "contextDir",
Description: "Path where the function project is",
Default: pplnv1beta1.NewArrayOrString(""),
},
{
Name: "imageName",
Description: "Function image name",
},
{
Name: "builderImage",
Description: "Buildpacks builder image to be used",
},
}
workspaces := []pplnv1beta1.PipelineWorkspaceDeclaration{
{Name: "source-workspace", Description: "Directory where function source is located."},
{Name: "cache-workspace", Description: "Directory where Buildpacks cache is stored"},
}
tasks := pplnv1beta1.PipelineTaskList{
taskFetchRepository(),
taskBuild("fetch-repository"),
taskImageDigest("build"),
taskFuncDeploy("image-digest"),
}
return &pplnv1beta1.Pipeline{
ObjectMeta: v1.ObjectMeta{
Name: pipelineName,
Labels: labels,
},
Spec: pplnv1beta1.PipelineSpec{
Params: params,
Workspaces: workspaces,
Tasks: tasks,
},
}
}
func generatePipelineRun(f fn.Function, labels map[string]string) *pplnv1beta1.PipelineRun {
revision := ""
if f.Git.Revision != nil {
revision = *f.Git.Revision
}
contextDir := ""
if f.Git.ContextDir != nil {
contextDir = *f.Git.ContextDir
}
return &pplnv1beta1.PipelineRun{
ObjectMeta: v1.ObjectMeta{
GenerateName: fmt.Sprintf("%s-run-", getPipelineName(f)),
Labels: labels,
},
Spec: pplnv1beta1.PipelineRunSpec{
PipelineRef: &pplnv1beta1.PipelineRef{
Name: getPipelineName(f),
},
ServiceAccountName: getPipelineBuilderServiceAccountName(f),
Params: []pplnv1beta1.Param{
{
Name: "gitRepository",
Value: *pplnv1beta1.NewArrayOrString(*f.Git.URL),
},
{
Name: "gitRevision",
Value: *pplnv1beta1.NewArrayOrString(revision),
},
{
Name: "contextDir",
Value: *pplnv1beta1.NewArrayOrString(contextDir),
},
{
Name: "imageName",
Value: *pplnv1beta1.NewArrayOrString(f.Image),
},
{
Name: "builderImage",
Value: *pplnv1beta1.NewArrayOrString(f.Builder),
},
},
Workspaces: []pplnv1beta1.WorkspaceBinding{
{
Name: "source-workspace",
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: getPipelinePvcName(f),
},
SubPath: "source",
},
{
Name: "cache-workspace",
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: getPipelinePvcName(f),
},
SubPath: "cache",
},
},
},
}
}
func getPipelineName(f fn.Function) string {
return fmt.Sprintf("%s-%s-pipeline", f.Name, f.BuildType)
}
func getPipelineSecretName(f fn.Function) string {
return fmt.Sprintf("%s-secret", getPipelineName(f))
}
func getPipelinePvcName(f fn.Function) string {
return fmt.Sprintf("%s-pvc", getPipelineName(f))
}
func getPipelineBuilderServiceAccountName(f fn.Function) string {
return fmt.Sprintf("%s-builder-secret", getPipelineName(f))
}
func getPipelineDeployerRoleBindingName(f fn.Function) string {
return fmt.Sprintf("%s-deployer-binding", getPipelineName(f))
}