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
构建镜像
-
images
- type: array
- description: buildah 将生成的镜像引用。可包含多个以逗号分隔的镜像地址。例如:
-
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/amd64
和 linux/arm64
平台上运行。
使用方法
最小配置:使用最少参数运行端到端流程
未设置或省略的可选任务(如 sonarqube-scanner
、deploy-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 parameters 和 Java 语言属性。
以下是部分可设置的属性:
属性 | 描述 |
---|
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.organization | SonarQube 中项目所属的组织。 |
部署或升级工作负载
可以使用本管道中 build-image
任务构建的镜像来部署或升级工作负载。
通过设置 workload-manifests-dir
参数,可以从指定目录应用 Kubernetes 清单来创建或更新工作负载。
支持 JSON 和 YAML 格式。指定目录下的所有清单文件将通过 kubectl apply
处理。注意 kubectl apply
不会递归子目录。
如果目录中包含 Kustomize 配置文件(如 kustomization.yaml
、kustomization.yml
或 Kustomization
),将使用 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-clone | skip-git-clone | "false" | 如果代码已存在于 source 工作区,可以设置为 "true" 跳过克隆。 |
sonarqube-scanner | sonar-url | "" | 若未设置 sonar-url ,将跳过扫描。 |
trivy-scanner | skip-trivy-scan | "false" | 若设置为 "true" ,将跳过扫描。 |
deploy-or-upgrade | workload-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