apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: rust-test
spec:
  timeouts:
    pipeline: "2h0m0s"
    tasks: "1h0m40s"
    finally: "0h30m0s"
  taskRunTemplate:
    serviceAccountName: build-bot
  pipelineSpec:
    params:
      - name: image-name
        description: The name for the built image
        type: string
      - name: target-name
        description: The dockerfile target to build
        type: string
      - name: path-to-image-context
        description: The path to the build context
        type: string
      - name: path-to-dockerfile
        description: The path to the Dockerfile
        type: string
    tasks:
      - name: report-pending
        taskRef:
          resolver: git
          params:
            - name: url
              value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
            - name: revision
              value: df36b3853a5657fd883015cdbf07ad6466918acf
            - name: pathInRepo
              value: task/gitea-set-status/0.1/gitea-set-status.yaml
        params:
          - name: CONTEXT
            value: "$(params.JOB_NAME)"
          - name: REPO_FULL_NAME
            value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
          - name: GITEA_HOST_URL
            value: code.fizz.buzz
          - name: SHA
            value: "$(tasks.fetch-repository.results.commit)"
          - name: DESCRIPTION
            value: "Build $(params.JOB_NAME) has started"
          - name: STATE
            value: pending
          - name: TARGET_URL
            value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
      - name: fetch-repository
        taskRef:
          resolver: git
          params:
            - name: url
              value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
            - name: revision
              value: df36b3853a5657fd883015cdbf07ad6466918acf
            - name: pathInRepo
              value: task/git-clone/0.9/git-clone.yaml
        workspaces:
          - name: output
            workspace: git-source
        params:
          - name: url
            value: $(params.REPO_URL)
          - name: revision
            value: $(params.PULL_BASE_SHA)
          - name: deleteExisting
            value: "true"
      - name: get-git-commit-time
        taskSpec:
          metadata: {}
          stepTemplate:
            image: alpine:3.20
            computeResources:
              requests:
                cpu: 10m
                memory: 600Mi
            workingDir: "$(workspaces.repo.path)"
          results:
            - name: unix-time
              description: The time of the git commit in unix timestamp format.
          steps:
            - image: alpine/git:v2.34.2
              name: detect-tag-step
              script: |
                #!/usr/bin/env sh
                set -euo pipefail
                echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
        workspaces:
          - name: repo
            workspace: git-source
        runAfter:
          - fetch-repository
      - name: build-image
        taskRef:
          resolver: git
          params:
            - name: url
              value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
            - name: revision
              value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
            - name: pathInRepo
              value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
        params:
          - name: OUTPUT
            value: >-
              type=image,"name=$(params.image-name):latest,$(params.image-name):$(tasks.fetch-repository.results.commit)",push=true,compression=zstd,compression-level=22,oci-mediatypes=true
          - name: CONTEXT
            value: $(params.path-to-image-context)
          - name: DOCKERFILE
            value: $(params.path-to-dockerfile)
          - name: EXTRA_ARGS
            value:
              - "--opt"
              - "target=$(params.target-name)"
              - --import-cache
              - "type=registry,ref=$(params.image-name):buildcache"
              - --export-cache
              - "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
              - --opt
              - build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
          - name: BUILDKITD_TOML
            value: |
              debug = true
              [registry."docker.io"]
                mirrors = ["dockerhub.dockerhub.svc.cluster.local"]
              [registry."dockerhub.dockerhub.svc.cluster.local"]
                http = true
                insecure = true
        workspaces:
          - name: source
            workspace: git-source
          - name: dockerconfig
            workspace: docker-credentials
        runAfter:
          - fetch-repository
      - name: run-cargo-test
        taskSpec:
          metadata: {}
          params:
            - name: docker-image
              type: string
              description: Docker image to run.
              default: alpine:3.20
          stepTemplate:
            image: alpine:3.20
            computeResources:
              requests:
                cpu: 10m
                memory: 600Mi
            workingDir: /workspace/source
          workspaces:
            - name: source
              mountPath: /source
            - name: cargo-cache
              mountPath: /usr/local/cargo/registry
              optional: true
          steps:
            - name: run
              image: $(params.docker-image)
              workingDir: "$(workspaces.source.path)"
              command: [cargo, test, --no-fail-fast]
              args: []
              env:
                - name: CARGO_TARGET_DIR
                  value: /target
        workspaces:
          - name: source
            workspace: git-source
          - name: cargo-cache
            workspace: cargo-cache
        runAfter:
          - build-image
        params:
          - name: docker-image
            value: "$(tasks.build-image.results.IMAGE_URL[1])"
    finally:
      - name: report-success
        when:
          - input: "$(tasks.status)"
            operator: in
            values: ["Succeeded", "Completed"]
        taskRef:
          resolver: git
          params:
            - name: url
              value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
            - name: revision
              value: df36b3853a5657fd883015cdbf07ad6466918acf
            - name: pathInRepo
              value: task/gitea-set-status/0.1/gitea-set-status.yaml
        params:
          - name: CONTEXT
            value: "$(params.JOB_NAME)"
          - name: REPO_FULL_NAME
            value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
          - name: GITEA_HOST_URL
            value: code.fizz.buzz
          - name: SHA
            value: "$(tasks.fetch-repository.results.commit)"
          - name: DESCRIPTION
            value: "Build $(params.JOB_NAME) has succeeded"
          - name: STATE
            value: success
          - name: TARGET_URL
            value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
      - name: report-failure
        when:
          - input: "$(tasks.status)"
            operator: in
            values: ["Failed"]
        taskRef:
          resolver: git
          params:
            - name: url
              value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
            - name: revision
              value: df36b3853a5657fd883015cdbf07ad6466918acf
            - name: pathInRepo
              value: task/gitea-set-status/0.1/gitea-set-status.yaml
        params:
          - name: CONTEXT
            value: "$(params.JOB_NAME)"
          - name: REPO_FULL_NAME
            value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
          - name: GITEA_HOST_URL
            value: code.fizz.buzz
          - name: SHA
            value: "$(tasks.fetch-repository.results.commit)"
          - name: DESCRIPTION
            value: "Build $(params.JOB_NAME) has failed"
          - name: STATE
            value: failure
          - name: TARGET_URL
            value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
      - name: cargo-cache-autoclean
        taskSpec:
          metadata: {}
          params:
            - name: docker-image
              type: string
              description: Docker image to run.
              default: alpine:3.20
          stepTemplate:
            image: alpine:3.20
            computeResources:
              requests:
                cpu: 10m
                memory: 600Mi
            workingDir: /workspace/source
          workspaces:
            - name: source
              mountPath: /source
            - name: cargo-cache
              mountPath: /usr/local/cargo/registry
              optional: true
          steps:
            - name: run
              image: $(params.docker-image)
              workingDir: "$(workspaces.source.path)"
              command: [cargo, cache, --autoclean]
              args: []
        workspaces:
          - name: source
            workspace: git-source
          - name: cargo-cache
            workspace: cargo-cache
        params:
          - name: docker-image
            value: "$(tasks.build-image.results.IMAGE_URL[1])"
    workspaces:
      - name: git-source
      - name: docker-credentials
      - name: cargo-cache
  workspaces:
    - name: git-source
      volumeClaimTemplate:
        spec:
          storageClassName: "nfs-client"
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi
      subPath: rust-source
    - name: cargo-cache
      persistentVolumeClaim:
        claimName: natter-cargo-cache-test
    - name: docker-credentials
      secret:
        secretName: harbor-plain
  params:
    - name: image-name
      value: "harbor.fizz.buzz/private/natter-development-test"
    - name: target-name
      value: ""
    - name: path-to-image-context
      value: docker/natter_development/
    - name: path-to-dockerfile
      value: docker/natter_development/