Install
openclaw skills install tests44适用于在前进平台为**已部署工作负载**创建持续更新流水线(代码克隆 → 构建 → 镜像构建 → 镜像更新部署)。生成 Jenkinsfile 前必须完整阅读本 SKILL 内「流水线骨架」节模板,禁止凭记忆默写。
openclaw skills install tests44auth_login获取前进平台Tokenauth_login(仅此几种,禁止「每调一个工具就登录一次」)
auth_login
auth_list_projects、caas_registry_*、cicd_*、olympus_core_* 等时 不要 在中间穿插 auth_login。auth_login 返回中取 访问 token,仅在 后续 MCP 工具入参 中使用;禁止将 token 写入仓库、Jenkinsfile、可提交的文档或 用户可见的回复正文。auth_list_tenantsauth_list_tenants 列出可访问租户。auth_list_projectsauth_list_projects(tenantId 等从租户选中项取值)。${BUILD_LANG} 就同时列出镜像仓库、命名空间、部署参数等)。${GIT_URL}、${GIT_USERNAME}、${GIT_PASSWORD}、${GIT_BRANCH};${REPO_SUBPATH}** 见参数表。信息经用户确认后,再进入第 2 点。cicd_list_code_build_languages 获取支持语言列表根据用户选择的语言,必须与用户确认:
npmmaven / gradle(必须用户选择,禁止默认)''填入:${BUILD_TOOL}。确认后停止,再进入 Step 3。
${BUILD_COMMANDS}caas_registry_list_project_registries,${DOCKER_SERVER}=registryId|服务地址(示例:f404d83fb8484e40|10.1.112.238:8443)| 左侧必须是 registryId,右侧必须是完整 host:port;禁止只填 registryId、只填地址、漏端口、交换左右顺序、加入空格或其他分隔符${DOCKER_SERVER} 完整值后再继续下一步caas_registry_list_project_repo_projects必须逐项与用户确认:
${DOCKERFILE_PATH}(dockerfile地址)${PRODUCT_NAME}(镜像名称,可建议默认值,但必须确认)${IMAGE_TAG}(默认 latest,但必须确认)olympus_core_list_namespaces_group_by_cluster必须逐项与用户确认:
${DEPLOY_TYPE}(deployment / statefulset / daemonset 等)${DEPLOY_APP_NAME}按需与用户确认,主要和客户确认是否使用默认值,用户有需要再进行修改
${DEPLOY_CONTAINER_NAME}(更新的具体容器名称,可以默认值,第一个)
${IMAGE_SOURCE} (镜像来源默认是1来自上游构建步骤,可选2,来自用户提供)
${IMAGE_URL}(根据需要提供)
禁止自动推断应用名或容器名
禁止自动选择 cluster 或 namespace
在完成上面的 Jenkinsfile 占位符收集后,在已选租户/项目下使用 cicd_list_environments(资源池 envId)、cicd_list_tags(标签)、cicd_get_job_id(jobId)等工具获取平台创建参数。
当 Jenkinsfile 占位符与平台元数据均确认完成后,将完整 Jenkinsfile 文本与「平台侧元数据收集」得到的 envId、标签 labels、jobId、jobName 一并传入 cicd_create_pipeline(字段以工具 schema 为准)。
auth_login${env.xxx} 变量${XXX} 或继续追问。占位符含义见 「参数替换规则」 表${GIT_URL}、${BUILD_LANG}、${DOCKER_SERVER} 等)必须在 easyGitClone、containerCodeBuild、easyImageBuild、workloadImageUpdate 各步骤的参数字段 做 直接值替换(字面量或 Git 密码的凭据引用)。禁止用 environment { }、parameters { } 或 "${params.XXX}" 再包一层转发;骨架里的 "${GIT_…}" 仅表示 生成前 的占位,不得把最终文件写成「先 env 再引用同名变量」的形式。agent 块强制约束(最高优先级): agent { ... } 块内的全部内容 必须与下方骨架完全一致,一字不改;禁止增删、替换、重排其中任何字段、镜像变量、资源配置或 volumeMounts/volumes 条目。
占位符规则: 只替换 ${GIT_URL}、${IMAGE_TAG} 这类 非 env. 的 ${XXX};不要改动 ${env.xxx}(Jenkins 运行时环境)。禁止在模板中提交真实密钥。
生成结果写法: 上述 ${XXX} 仅在 产出 Jenkinsfile 之前 作为待填标记;写入平台的 Jenkinsfile 里应变为 各步骤参数上的直接字面量(与下文「完整案例」一致),不要增加 environment / parameters 块来承载这些业务配置。
pipeline {
agent {
kubernetes {
cloud "${env.runCluster}"
defaultContainer 'maven'
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: ${env.inboundImage}
- name: maven
imagePullPolicy: Always
image: ${env.agentImage}
command:
- sleep
args:
- 99d
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "4000m"
memory: "8192Mi"
volumeMounts:
- mountPath: "/var/run/docker.sock"
name: "volume-1"
readOnly: false
- mountPath: /root/.m2/settings.xml
name: config
subPath: settings.xml
volumes:
- name: "volume-1"
hostPath:
path: "/var/run/docker.sock"
- name: config
configMap:
name: jenkins-agent-config
items:
- key: settings.xml
path: settings.xml
- name: buildah-conf
configMap:
name: buildah-conf
items:
- key: registries.conf
path: registries.conf
'''
}
}
stages {
stage('代码克隆') {
steps {
easyGitClone(
stepName: '代码克隆',
gitUrl: "${GIT_URL}",
gitUserName: "${GIT_USERNAME}",
gitPassword: "${GIT_PASSWORD}",
branch: "${GIT_BRANCH}",
path: "${REPO_SUBPATH}"
)
}
}
stage('依赖安装与代码构建') {
steps {
containerCodeBuild(
stepName: '依赖安装与代码构建',
language: "${BUILD_LANG}",
buildTool: "${BUILD_TOOL}",
command: '''${BUILD_COMMANDS}''',
file_setting: '',
proxy: ''
)
}
}
stage('镜像构建') {
steps {
easyImageBuild(
stepName: '镜像构建',
dockerServer: "${DOCKER_SERVER}",
dockerRepository: "${DOCKER_REPOSITORY}",
imageSecret: '',
dockerfile: "${DOCKERFILE_PATH}",
productName: "${PRODUCT_NAME}",
params_tag: "${IMAGE_TAG}"
)
}
}
stage('镜像部署') {
steps {
workloadImageUpdate(
stepName: '容器应用镜像更新',
clusterNamespace: "${DEPLOY_CLUSTER_NS}",
type: "${DEPLOY_TYPE}",
appName: "${DEPLOY_APP_NAME}",
containerName: "${DEPLOY_CONTAINER_NAME}",
imageSource: "${IMAGE_SOURCE}",
imageUrl: "${IMAGE_URL}"
)
}
}
}
}
.dockerignore)与上文骨架 阶段一致(代码克隆 → 构建 → 镜像 → 部署)。以下为 结构示例:Git 凭据须用 Jenkins 凭据 ID 或平台约定方式管理,禁止在仓库中提交明文密码。
pipeline {
agent {
kubernetes {
cloud "${env.runCluster}"
defaultContainer 'maven'
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: ${env.inboundImage}
- name: maven
imagePullPolicy: Always
image: ${env.agentImage}
command:
- sleep
args:
- 99d
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "4000m"
memory: "8192Mi"
volumeMounts:
- mountPath: "/var/run/docker.sock"
name: "volume-1"
readOnly: false
- mountPath: /root/.m2/settings.xml
name: config
subPath: settings.xml
volumes:
- hostPath:
path: "/var/run/docker.sock"
name: "volume-1"
- configMap:
items:
- key: settings.xml
path: settings.xml
name: jenkins-agent-config
name: config
- configMap:
items:
- key: registries.conf
path: registries.conf
name: buildah-conf
name: buildah-conf
'''
}
}
stages {
stage('代码克隆') {
steps {
easyGitClone(stepName: '代码克隆', gitUrl: 'https://example.com/org/repo.git', gitUserName: 'example-user', gitPassword: '<Jenkins 凭据,勿明文提交>', branch: 'main', path: '')
}
}
stage('依赖安装与代码构建') {
steps {
containerCodeBuild(stepName: '依赖安装与代码构建', language: 'node18', buildTool: 'npm', command: '''npm install & npm build
''', file_setting: '', proxy: '')
}
}
stage('镜像构建') {
steps {
easyImageBuild(stepName: '镜像构建', dockerServer: 'registryId|10.0.0.1:8443', dockerRepository: 'your-library', imageSecret: '', dockerfile: 'Dockerfile', productName: 'your-product', params_tag: 'latest')
}
}
stage('镜像部署') {
steps {
workloadImageUpdate(stepName: '容器应用镜像更新', clusterNamespace: 'cluster:namespace', type: 'deployment', appName: 'app-name', containerName: '', imageSource: '1', imageUrl: '')
}
}
}
}
| 参数 | Typical use |
|---|---|
${GIT_URL} | 仓库地址 |
${GIT_USERNAME} | Git 用户名 |
${GIT_PASSWORD} | Git 密码占位(生成时应改为凭据引用) |
${GIT_BRANCH} | 分支 |
${REPO_SUBPATH} | 克隆后相对子目录,空则填 '' |
${BUILD_LANG} | 使用cicd_list_code_build_languages工具获取支持的语言,展示value让用户选择,禁止猜测和进一步扩展 |
${BUILD_TOOL} | 如 npm / maven / gradle |
${BUILD_COMMANDS} | 构建命令 |
${DOCKER_SERVER} | 强制值格式 `registryId |
${DOCKER_REPOSITORY} | 镜像仓库名称,使用caas_registry_list_project_repo_projects工具根据制品服务id获取镜像仓库名称 |
${DOCKERFILE_PATH} | Dockerfile 路径 |
${PRODUCT_NAME} | 镜像名称,默认可以用仓库名称或者流水线名称 |
${IMAGE_TAG} | 镜像 tag ,默认latest |
${DEPLOY_CLUSTER_NS} | 使用olympus_core_list_namespaces_group_by_cluster获取集群和namespace集群,格式cluster:namespace |
${DEPLOY_TYPE} | deployment / statefulset / daemonset等 |
${DEPLOY_APP_NAME} | 需要更新的工作负载名 |
${DEPLOY_CONTAINER_NAME} | 可选,多容器时指定容器名,默认 '' |
${IMAGE_SOURCE} | 1表示从构建步骤来,2表示需要提供镜像地址,默认1 |
${IMAGE_URL} | IMAGE_SOURCE 为2时需要填写,默认 '' |
command 与 ${BUILD_COMMANDS}Groovy 单引号三引号字符串 不会 对 ${BUILD_COMMANDS} 做运行时插值。${BUILD_COMMANDS} 仅作为 生成/填充前的标记:自动化或人工应用本模板时,应把 ${BUILD_COMMANDS} 整段替换为最终多行 shell,提交到 Jenkins 的 Jenkinsfile 里不应再保留字面量 ${BUILD_COMMANDS}。