Use java-image-build-scan-deploy Pipeline

该管道旨在自动化 Java 应用程序的完整 CI/CD 工作流。
它可重用且灵活,支持自定义构建参数、多工作区以及步骤的条件执行。

主要特性:

  • ✅ 灵活的代码来源
  • ⚙️ 可定制的 Maven 设置
  • 🚀 支持 Maven 本地仓库缓存
  • 🔌 通过参数支持可插拔任务
  • 🛠️ 动态镜像构建与推送
  • ☁️ 通过 kubectl 更新工作负载镜像

目录

使用 hub 解析器指定

以下示例 PipelineRun 引用了目录中的管道:

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: 需要克隆的仓库 URL。
  • git-revision

    • type: string
    • default: ""
    • description: 需要检出的版本(分支、标签、sha、ref 等)。
  • skip-git-clone

    • type: string
    • default: "false"
    • description: 跳过执行 git clone 任务。仅当对应代码仓库已存在于工作区时可启用。
  • git-crt-file-name

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

Maven

  • maven-subdirectory

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

    • type: array
    • default: ["package"]
    • description: 需要执行的 Maven 目标。
  • maven-mirror-url

    • type: string
    • default: ""
    • description: Maven 仓库镜像 URL。

SonarQube Scanner

  • sonar-url

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

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

    • type: array
    • default: ["sonar.sources=.", "sonar.java.binaries=target/classes"]
    • description: 传递给 SonarQube 的额外属性。详情请参考 Configuration of SonarQube properties

构建镜像

  • images

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

    • type: string
    • default: ./Dockerfile
    • description: 用于构建的 Dockerfile 路径。
  • build-extra-args

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

    • type: array
    • default: [""]
    • description: 指定构建参数及其值,这些参数会在 Dockerfile 指令中进行插值,但不会添加到最终镜像配置的环境变量列表中。例如 HTTP_PROXY=http://10.10.10.10
  • build-context

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

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

Trivy 扫描器

  • 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: 需要部署或升级的工作负载所在命名空间。若未指定,将使用当前 TaskRun 的命名空间。
  • 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: 需要部署的工作负载清单目录。若未指定,仅更新集群中已有工作负载的镜像。可使用 source 工作区中清单目录的相对路径,例如 "manifests"。

工作区

  • source:用于任务间共享信息的工作区。
  • git-basic-auth:一个可选工作区,包含 .gitconfig 和 .git-credentials 文件。这些文件将在执行任何 git 命令前复制到用户主目录。工作区中的其他文件将被忽略。强烈建议尽可能使用 ssh-directory 替代 basic-auth,并优先将 Secret 绑定到该工作区而非其他卷类型。
  • git-ssh-directory:一个可选工作区,包含私钥、known_hosts、config 等文件。在执行 git 命令前复制到用户主目录。用于执行 clone 时的 git 远程认证。强烈建议优先将 Secret 绑定到该工作区而非其他卷类型。
  • git-ssl-ca-directory:一个可选工作区,包含 CA 证书,Git 在通过 HTTPS 拉取或推送时用于验证对端。
  • maven-settings:一个可选工作区,包含自定义 Maven 设置。
  • maven-local-repo:一个可选工作区,用于 Maven 本地仓库。
  • maven-server-secret:一个可选工作区,包含服务器凭据。
  • sonar-settings:一个可选工作区,用于挂载 SonarQube 属性。
  • sonar-credentials:一个可选工作区,包含 SonarQube 使用的凭据。
  • dockerconfig:一个可选工作区,用于 Docker 配置文件,如 config.json.dockerconfigjson。用于推送镜像到镜像仓库时的认证。
  • kubeconfig:一个可选工作区,包含 kubeconfig 文件。kubeconfig 文件名应为 kubeconfig。若该工作区无 kubeconfig 文件,则忽略该工作区。

平台

该 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: dockerconfig
      secret:
        secretName: dockerconfig

使用 Maven Settings.xml

可以挂载 maven-settings 工作区以应用 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 参数设置 Maven 仓库镜像,该参数会作为 <mirror> 节点写入 settings.xml

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

使用构建缓存加速 CI

挂载持久化的 maven-local-repo 工作区缓存 .m2/repository 内容,跨管道运行复用依赖,显著减少 Maven 依赖解析时间,极大缩短构建时间。

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

SonarQube 属性配置

可以挂载 sonar-settings 工作区或使用 sonar-properties 参数应用 sonar-project.properties 文件的属性。

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

SonarQube 属性的使用说明请参考 analysis parametersJava 语言属性

以下是部分可设置的属性:

属性描述
sonar.java.binaries (必填)用逗号分隔的目录路径,包含与源代码对应的已编译字节码文件。
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强制分析步骤轮询服务器实例并等待质量门状态。
sonar.qualitygate.timeout扫描器等待报告处理的秒数。
sonar.projectVersion项目版本。用于基于先前版本的新代码定义的分支分析。
sonar.sources用逗号分隔的主源代码目录路径。
sonar.organizationSonarQube 中项目所属的组织。

部署或升级工作负载

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

通过设置 workload-manifests-dir 参数,可以从指定目录应用 Kubernetes 清单来创建或更新工作负载。

支持 JSON 和 YAML 格式。指定目录下的所有清单文件将通过 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
    # ...

如果不希望通过清单部署工作负载,只需将 workload-manifests-dir 参数留空。此时任务仅更新集群中已有工作负载的镜像。

需要自行管理工作负载的镜像拉取密钥。如果新镜像托管在不同的镜像仓库,请确保为工作负载创建并配置相应的拉取密钥。

使用参数跳过任务

管道支持通过参数跳过任务:

任务参数默认值描述
git-cloneskip-git-clone"false"如果代码已存在于 source 工作区,可以设置为 "true" 跳过克隆。
sonarqube-scannersonar-url""若未设置 sonar-url,将跳过扫描。
trivy-scannerskip-trivy-scan"false"若设置为 "true",将跳过扫描。
deploy-or-upgradeworkload-name""若不想部署或升级工作负载,可将 workload-name 留空。

包含所有任务的完整示例

该示例演示如何使用管道中的所有任务,包括:

  • 克隆源代码
  • 使用 Maven 构建代码
  • 构建镜像并推送至镜像仓库
  • 使用 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: dockerconfig
      secret:
        secretName: docker-credentials
    - name: kubeconfig
      configMap:
        name: kubeconfig