使用模板构建 Java pipeline

此 pipeline 旨在自动化 Java 应用的完整 CI/CD 工作流。 它具有可复用性和灵活性,支持自定义构建参数、多个工作区以及有条件地执行步骤。

主要功能:

  • ✅ 灵活的代码源
  • ⚙️ 可自定义的 Maven 设置
  • 🚀 支持 Maven 本地仓库缓存
  • 🔌 通过 params 插入任务
  • 🛠️ 动态构建和推送镜像
  • ☁️ 使用 kubectl 更新工作负载镜像

使用 hub resolvers 指定

以下 pipeline run 示例引用了 catalog 中的 pipeline:

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: java-pipeline-run
spec:
  pipelineRef:
    resolver: hub
    params:
    - name: catalog
      value: catalog
    - name: kind
      value: pipeline
    - name: name
      value: java-image-build-scan-deploy
    - name: version
      value: "0.1"

参数

Git Clone

  • git-url

    • type: string
    • default: ""
    • description: 要克隆的 Repository URL。
  • git-revision

    • type: string
    • default: ""
    • description: 要 checkout 的 Revision(branch、tag、sha、ref 等)。
  • skip-git-clone

    • type: string
    • default: "false"
    • description: 跳过执行 git clone 任务。仅当对应的代码 Repository 已存在于 workspace 中时才能启用。
  • git-crt-file-name

    • type: string
    • default: "ca-bundle.crt"
    • description: 使用 ssl-ca-directory workspace 挂载的 crt 文件名。默认值为 ca-bundle.crt。

Maven

  • maven-subdirectory

    • type: string
    • default: .
    • description: Maven 项目的上下文目录。
  • maven-goals

    • type: array
    • default: ["package"]
    • description: 要运行的 Maven goals。
  • maven-mirror-url

    • type: string
    • default: ""
    • description: Maven Repository mirror URL。

SonarQube Scanner

  • sonar-url

    • type: string
    • default: ""
    • description: SonarQube Server 实例的 URL。如果未指定,将跳过 sonarqube scanner 任务。
  • sonar-project-key

    • type: string
    • default: ""
    • description: Sonarqube 项目的唯一 key。
  • sonar-properties

    • type: array
    • default: ["sonar.sources=.", "sonar.java.binaries=target/classes"]
    • description: 要传递给 SonarQube 的其他 properties。有关详细信息,请参阅 SonarQube properties 配置

构建镜像

  • images

    • type: array
    • description: buildah 将生成的镜像引用。可以包含以逗号分隔的多个镜像地址。例如:
      • busybox:latest
      • busybox:v1 .30.1
  • containerfile-path

    • type: string
    • default: ./Containerfile
    • description: 要构建的 Containerfile 路径。
  • build-extra-args

    • type: string
    • default: ""
    • description: 构建镜像时传递给 build 命令的额外参数。警告:必须进行清理以避免命令注入(例如 --build-arg key=value --label key=value)。
  • build-args

    • type: array
    • default: [""]
    • description: 指定构建参数及其值。该参数会以与环境变量相同的方式插入从 Containerfile 读取的指令中,但不会添加到最终镜像配置的环境变量列表中。例如 HTTP_PROXY=http://10.10.10.10:8080
  • build-context

    • type: string
    • default: .
    • description: 用作上下文的目录路径。
  • push-extra-args

    • type: string
    • default: ""
    • description: 推送镜像时传递给 push 命令的额外参数。警告:必须进行清理以避免命令注入(例如 --creds=username:password )。

Trivy Scanner

  • skip-trivy-scan

    • type: string
    • default: "false"
    • description: 设置为跳过构建后的 trivy 镜像扫描。
  • trivy-extra-args

    • type: string
    • default: ""
    • description: 扫描镜像时传递给 trivy 命令的额外参数。警告:必须进行清理以避免命令注入(例如 --insecure)。可以使用 --skip-db-update --skip-java-db-update 跳过更新漏洞数据库。

部署或升级工作负载

  • workload-name

    • type: string
    • default: ""
    • description: 要部署或升级的工作负载名称。如果未指定,将跳过 deploy-or-upgrade 任务。
  • workload-kind

    • type: string
    • default: Deployment
    • description: 要部署或升级的工作负载类型,例如 Deployment、StatefulSet 等。
  • workload-namespace

    • type: string
    • default: ""
    • description: 要部署或升级的工作负载 namespace。如果未指定,将使用当前 TaskRun 的 namespace。
  • workload-container

    • type: string
    • default: []
    • description: 此参数用于指定需要更新镜像的工作负载中的容器。默认情况下,将更新工作负载中所有容器的镜像。
  • workload-rollout-timeout

    • type: string
    • default: "0"
    • description: 等待工作负载就绪前的等待时长,0 表示永不结束等待。其他值应包含对应的时间单位(例如 1s、2m、3h)。
  • workload-manifests-dir

    • type: string
    • default: ""
    • description: 要部署的工作负载 manifest。如果未指定,则只更新集群中已有工作负载的镜像。可以使用 source workspace 中 manifest 目录的相对路径。例如:"manifests"。

工作区

  • source:用于在任务之间共享信息的 Workspace。
  • git-basic-auth:包含 .gitconfig 和 .git-credentials 文件的可选 workspace。在运行任何 git 命令前,这些文件会被复制到用户的 home 目录。此 Workspace 中的其他文件会被忽略。强烈建议尽可能使用 ssh-directory 而不是 basic-auth,并优先将 Secret 绑定到此 Workspace,而不是使用其他卷类型。
  • git-ssh-directory:包含 private key、known_hosts、config 等文件的可选 workspace。在执行 git 命令前会将其复制到用户的 home 目录。clone 时用于向 git remote 进行身份验证。强烈建议将 Secret 绑定到此 Workspace,而不是使用其他卷类型。
  • git-ssl-ca-directory:包含 CA certificates 的可选 workspace;通过 HTTPS fetch 或 push 时,Git 将使用这些证书验证对端。
  • maven-settings:包含自定义 Maven settings 的可选 workspace
  • maven-local-repo:用于 Maven 本地 repository 的可选 workspace
  • maven-server-secret:包含 server credentials 的可选 workspace
  • maven-trust-store:包含 Maven 使用的私有 CA 的 JKS truststore 的可选 workspace
  • sonar-settings:可挂载 SonarQube properties 的可选 workspace
  • sonar-credentials:包含 SonarQube 使用凭据的可选 workspace
  • registryconfig:用于 distribution registry 配置文件的可选 workspace;例如 config.json.dockerconfigjson。此项可选,用于向 registry 推送镜像时进行身份验证。
  • kubeconfig:包含 kubeconfig 文件的可选 workspace。kubeconfig 的名称应为 kubeconfig。如果此 workspace 中没有 kubeconfig,将忽略该 workspace。

平台

Task 可在 linux/amd64linux/arm64 平台上运行。

使用

最小设置:使用最少参数端到端运行

未设置或省略时,可选任务(sonarqube-scannerdeploy-or-upgrade 等)将被正常跳过。

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  generateName: java-build-run-
spec:
  pipelineRef:
    name: java-image-build-scan-deploy
  params:
    - name: git-url
      value: https://github.com/example/java-app
    - name: git-revision
      value: refs/heads/main
    - name: images
      value: ["registry.example.com/java-app:latest"]
  workspaces:
    - name: source
      persistentVolumeClaim:
        claimName: source
    - name: git-basic-auth
      secret:
        secretName: gitconfig
    - name: registryconfig
      secret:
        secretName: registryconfig

使用 Maven Settings.xml

可以挂载 maven-settings workspace,以便为 Maven 构建应用 settings.xml

workspaces:
  - name: maven-settings
    configMap:
      name: maven-settings
apiVersion: v1
kind: ConfigMap
metadata:
  name: maven-settings
data:
  settings.xml: |
    <!--# your maven settings.xml ...-->

还可以使用 maven-mirror-url param 设置 Maven repository mirror。它将在 settings.xml 中作为 <mirror> 使用。

<mirror>
  <id>mirror.default</id>
  <url>$(params.maven-mirror-url)</url>
  <mirrorOf>central</mirrorOf>
</mirror>

使用构建缓存加速 CI

附加持久化的 maven-local-repo workspace,以便在多次 pipeline run 之间缓存 .m2/repository 内容。 复用依赖可以大幅缩短 Maven 依赖解析时间,并显著减少多次运行之间的构建时间。

workspaces:
  - name: maven-local-repo
    persistentVolumeClaim:
      claimName: maven-repo-cache

SonarQube properties 配置

可以挂载 sonar-settings workspace,或使用 sonar-properties param 将 properties 应用到 sonar-project.properties 文件。

默认 properties 为:sonar.sources=.sonar.java.binaries=target/classes

可以从 analysis parametersJava 的 properties 中了解 SonarQube properties 的用法。

以下是一些可以设置的 properties:

PropertiesDescription
sonar.java.binaries (required)包含与源文件对应的已编译字节码文件的目录路径,以逗号分隔。
sonar.java.libraries项目使用的第三方库(JAR 或 Zip 文件)的文件路径,以逗号分隔。可使用通配符:sonar.java.libraries=path/to/Library.jar,directory/**/*.jar
sonar.java.test.binaries包含与测试文件对应的已编译字节码文件的目录路径,以逗号分隔。
sonar.java.test.libraries测试使用的第三方库(JAR 或 Zip 文件)的文件路径,以逗号分隔。(例如,应包含 junit jar。)可使用通配符:sonar.java.test.libraries=directory/**/*.jar
sonar.qualitygate.wait强制分析步骤轮询服务器实例,并等待 Quality Gate 状态。
sonar.qualitygate.timeoutscanner 等待报告处理完成的秒数。
sonar.projectVersion项目版本。如果使用基于前一版本的新代码定义进行 branch analysis,则应设置此项。
sonar.sources包含主源文件的目录路径,以逗号分隔。
sonar.organization项目所在的 SonarQube organization。

部署或升级工作负载

可以使用此 pipeline 中 build-image 任务构建的镜像来部署或升级工作负载。

通过设置 workload-manifests-dir param,可以应用指定目录中的 Kubernetes manifests 来创建或更新工作负载。

支持 JSON 和 YAML 格式。指定目录中的所有 manifests 都将使用 kubectl apply 进行处理。请注意,kubectl apply 不会遍历子目录。

如果目录包含 Kustomize 配置文件(例如 kustomization.yamlkustomization.ymlKustomization),则会使用 kubectl kustomize 进行处理。

以下是 workload-manifests-dir 的示例结构:

manifests
├── deployment.yaml
├── kustomization.yaml
└── service.yaml

可以配置以下参数:

spec:
  params:
    # ...
    - name: images
      value:
        - foo/bar:latest
    - name: workload-name
      value: bar
    - name: workload-namespace
      value: default
    - name: workload-kind
      value: Deployment
    - name: workload-manifests-dir
      value: manifests
    # ...

如果不想使用 manifests 部署工作负载,只需将 workload-manifests-dir param 留空。在这种情况下,任务只会更新集群中现有工作负载的镜像。

需要为工作负载管理 image pull secrets。如果新镜像托管在不同的 registry 中,请确保为工作负载创建并配置适当的 pull secret。

使用 Params 跳过任务

pipeline 支持使用 params 跳过任务:

TaskParamDefaultDescription
git-cloneskip-git-clone"false"如果代码已存在于 source workspace 中,可以将此项设置为 "true" 以跳过克隆。
sonarqube-scannersonar-url""如果未设置 sonar-url,将跳过扫描。
trivy-scannerskip-trivy-scan"false"如果将 skip-trivy-scan 设置为 "true",将跳过扫描。
deploy-or-upgradeworkload-name""如果不想部署或升级工作负载,可以将 workload-name 留空。

包含所有任务的完整示例

此示例演示如何使用 pipeline 中的所有任务。其中包括以下任务:

  • 克隆源代码
  • 使用 Maven 构建代码
  • 构建镜像并将镜像推送到 registry。
  • 使用 Trivy 扫描镜像
  • 使用 SonarQube 扫描代码
  • 部署或升级工作负载
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  generateName: java-build-run-
spec:
  pipelineRef:
    name: java-image-build-scan-deploy
  params:
    - name: git-url
      value: https://github.com/example/java-app
    - name: git-revision
      value: refs/heads/main
    - name: sonar-url
      value: https://sonar.example.com
    - name: sonar-project-key
      value: java-pipeline-example-key
    - name: images
      value: ["registry.example.com/java-app:latest"]
    - name: workload-name
      value: java-app
    - name: workload-namespace
      value: default
  workspaces:
    - name: source
      persistentVolumeClaim:
        claimName: source
    - name: git-basic-auth
      secret:
        secretName: gitconfig
    - name: sonar-credentials
      secret:
        secretName: sonar-credentials
    - name: registryconfig
      secret:
        secretName: registry-creds
    - name: kubeconfig
      configMap:
        name: kubeconfig