一:教程定位
在前 8 篇教程中,我们已经完成了 Harness 平台入门、CI/CD 流水线、触发器、测试制品管理、Kubernetes 部署、变量参数化、审批定时触发,以及日志排查。
第 9 篇开始进入工程化管理阶段:如何把 Harness 配置从“界面点点点”升级为“YAML 化、版本化、可审查、可批量管理”。
很多团队刚开始使用 Harness 时,习惯在 UI 里创建 Pipeline、Connector、Service、Environment、Input Set。这种方式适合入门,但企业落地后会遇到问题:
谁改了 Pipeline? 改了什么? 什么时候改的? 能不能回滚? 能不能代码评审? 能不能批量复制到多个项目? 能不能统一检查命名规范? 能不能像管理 Kubernetes YAML 一样管理 Harness 配置?
答案是:可以。
本篇围绕三个能力展开:
Harness YAML 编辑器 Harness CLI Git 版本管理 / GitOps 化配置管理
需要特别说明:Harness CLI 在不同版本中的命令结构可能会变化。官方当前推荐使用新版 hc CLI,旧版 harness 会逐步废弃。因此本文不会编造某个未确认的子命令,而是采用“官方确认能力 + 可执行脚本 + 版本自检 + UI/YAML/API 兜底”的方式,保证企业或个人都可以落地。
二:适合人群
本文适合:
具备基础命令行能力的 DevOps 工程师 习惯使用 Git 管理配置的工程师 希望把 Harness 配置纳入版本管理的团队 正在从 Jenkinsfile / GitLab CI YAML 迁移到 Harness 的团队 希望批量创建 Pipeline、Input Set、Connector 的平台工程师
建议已经具备:
熟悉 Git 基础操作 熟悉 YAML 基础语法 已经能创建 Harness Pipeline 已经创建过 GitLab / Harbor / Kubernetes Connector 已经理解 Pipeline、Stage、Step、Input Set、Environment
三:学习目标
完成本文后,你应该能够:
理解 Visual Editor 与 YAML Editor 的区别 在 Pipeline Studio 中切换到 YAML 模式 从 UI 中导出 Pipeline YAML 将 Pipeline YAML 保存到 Git 仓库 通过 Git 分支和 Merge Request 管理 Harness 配置变更 安装并配置 Harness CLI 使用 CLI 完成登录、版本检查、基础资源查询 编写 Harness 配置仓库结构 用 YAML 定义 Pipeline、Input Set、Trigger 等资源 使用脚本批量检查 YAML 文件 设计 CLI 批量创建资源的安全流程 理解国内网络环境下 CLI 使用的代理、证书和权限问题 避免把 Secret 明文提交到 Git
四:国内网络环境下的整体架构
本文推荐架构如下:
开发人员 / 平台工程师 ↓ 本地 IDE / VS Code / Cursor ↓ Harness YAML 配置仓库 ↓ Merge Request 审查 GitLab / Gitee ↓ 平台管理员合并 ↓ Harness CLI / Harness UI YAML Import / Harness API ↓ Harness SaaS ↓ Delegate ↓ GitLab / Harbor / Kubernetes
国内企业重点关注:
CLI 所在机器是否能访问 app.harness.io 企业代理是否需要配置 是否使用自签证书或企业根证书 API Token 是否有足够权限 YAML 配置仓库是否在内网 GitLab / Gitee Secret 是否只保存引用,不保存明文 生产配置是否必须经过 Merge Request 审批
五:Visual Editor 与 YAML Editor 的区别
1. Visual Editor
适合:
初学者入门 第一次创建 Pipeline 不熟悉 Harness 字段 需要界面引导选择 Connector、Service、Environment 快速演示
优点:
直观 不容易漏字段 适合第一次跑通 便于非平台工程师理解流程
缺点:
不利于版本管理 多人修改不容易审查 不适合批量复制 不方便统一规范
2. YAML Editor
适合:
企业工程化 Git 版本管理 代码审查 多项目复制 模板化 批量变更 审计追溯
优点:
可以提交到 Git 可以走 Merge Request 可以做静态检查 可以批量搜索替换 可以回滚历史版本 可以沉淀模板
缺点:
初学者容易写错缩进 字段较多 不同模块 YAML 结构需要熟悉 建议先通过 Visual Editor 生成,再整理为标准 YAML
六:推荐工作方式
建议采用“三步走”:
第一步:Visual Editor 跑通功能 第二步:切换 YAML Editor 导出配置 第三步:把 YAML 提交到 Git,后续通过 Git 管理
不要一开始就完全手写 YAML。更稳妥的方式是:
UI 创建成功 复制 YAML 提交 Git 在 Git 中做小步修改 用 Harness YAML Editor 校验 再导入或更新
七:在 Harness 中切换 YAML 编辑器
进入:
Project → Pipelines → 选择 Pipeline → Pipeline Studio
右上角切换:
Visual YAML
在 YAML 模式中可以:
查看完整 Pipeline YAML 复制 YAML 修改字段 查看语法错误 使用自动补全 查找替换
常用技巧:
Cmd/Ctrl + Space:自动补全 Cmd/Ctrl + F:查找替换 F1:命令面板
当 YAML 不合法时,编辑器会提示 Invalid。此时不要强行保存,应先根据提示修复缩进、字段名或缺失项。
八:Harness YAML 配置仓库结构
建议创建一个专门仓库:
harness-platform-config/ ├── README.md ├── docs/ │ ├── naming-convention.md │ ├── review-checklist.md │ └── troubleshooting.md ├── orgs/ │ └── devops-lab/ │ └── projects/ │ └── harness-demo/ │ ├── pipelines/ │ │ ├── nodejs-ci.yaml │ │ ├── nodejs-k8s-deploy.yaml │ │ └── nodejs-prod-release.yaml │ ├── inputsets/ │ │ ├── dev.yaml │ │ ├── test.yaml │ │ ├── pre.yaml │ │ └── prod.yaml │ ├── triggers/ │ │ ├── gitlab-main-push.yaml │ │ └── gitlab-mr-ci.yaml │ ├── connectors/ │ │ ├── gitlab-company.yaml │ │ ├── harbor-company.yaml │ │ └── k8s-dev-cluster.yaml │ ├── services/ │ │ └── harness-demo-app.yaml │ └── environments/ │ ├── dev.yaml │ ├── test.yaml │ ├── pre.yaml │ └── prod.yaml ├── scripts/ │ ├── install-hc.sh │ ├── validate-yaml.sh │ ├── check-sensitive-info.sh │ ├── list-cli-capabilities.sh │ ├── apply-one.sh │ └── apply-all.sh └── Makefile
说明:
pipelines:保存 Pipeline YAML inputsets:保存 Input Set YAML triggers:保存 Trigger YAML connectors:保存 Connector YAML services:保存 Service YAML environments:保存 Environment YAML scripts:保存本地校验、批量导入、批量检查脚本 docs:保存团队规范
企业建议:
一个业务项目一个目录 公共模板放到 templates 目录 生产环境配置单独保护 所有 YAML 变更必须走 Merge Request
九:命名规范
建议统一命名:
Org Identifier: devops_lab
Project Identifier: harness_demo
Pipeline Identifier: nodejs_k8s_deploy nodejs_prod_release
Connector Identifier: gitlab_company harbor_company k8s_dev_cluster
Input Set Identifier: dev test pre prod
Environment Identifier: dev test pre prod
不要使用:
中文 identifier 空格 中横线 点号 特殊字符
推荐使用:
小写字母 数字 下划线
原因:
表达式引用更稳定 脚本处理更简单 Git 搜索更方便 跨平台兼容更好
十:示例 Pipeline YAML
orgs/devops-lab/projects/harness-demo/pipelines/nodejs-k8s-deploy.yaml
pipeline:
name: nodejs-k8s-deploy
identifier: nodejs_k8s_deploy
projectIdentifier: harness_demo
orgIdentifier: devops_lab
tags:
app: nodejs
network: china
managed_by: git
variables:
- name: app_name
type: String
value: harness-demo-app
- name: image_repository
type: String
value: harbor.company.com/devops/harness-demo-app
- name: image_tag
type: String
value: <+input>
- name: namespace
type: String
value: <+input>
stages:
- stage:
name: Deploy
identifier: deploy
type: Deployment
spec:
deploymentType: Kubernetes
service:
serviceRef: harness_demo_app
environment:
environmentRef: <+input>
deployToAll: false
infrastructureDefinitions:
- identifier: <+input>
execution:
steps:
- step:
name: K8s Rolling Deploy
identifier: k8s_rolling_deploy
type: K8sRollingDeploy
timeout: 10m
spec:
skipDryRun: false
- step:
name: Verify Deployment
identifier: verify_deployment
type: ShellScript
timeout: 5m
spec:
shell: Bash
source:
type: Inline
spec:
script: |
set -e
export KUBECONFIG=${HARNESS_KUBE_CONFIG_PATH}
APP_NAME="<+pipeline.variables.app_name>"
NAMESPACE="<+pipeline.variables.namespace>"
kubectl rollout status deployment/${APP_NAME} -n ${NAMESPACE} --timeout=180s
kubectl get pods -n ${NAMESPACE} -l app=${APP_NAME} -o wide
说明:
managed_by: git 表示该配置由 Git 管理 image_tag、namespace、environmentRef、infrastructureDefinitions 使用 Runtime Input 后续通过 Input Set 提供 dev/test/prod 差异参数
十一:示例 Input Set YAML
orgs/devops-lab/projects/harness-demo/inputsets/dev.yaml
inputSet:
name: dev
identifier: dev
orgIdentifier: devops_lab
projectIdentifier: harness_demo
pipeline:
identifier: nodejs_k8s_deploy
variables:
- name: image_tag
type: String
value: latest
- name: namespace
type: String
value: dev
stages:
- stage:
identifier: deploy
type: Deployment
spec:
environment:
environmentRef: dev
infrastructureDefinitions:
- identifier: dev_k8s
orgs/devops-lab/projects/harness-demo/inputsets/prod.yaml
inputSet:
name: prod
identifier: prod
orgIdentifier: devops_lab
projectIdentifier: harness_demo
pipeline:
identifier: nodejs_k8s_deploy
variables:
- name: image_tag
type: String
value: <+input>
- name: namespace
type: String
value: prod
stages:
- stage:
identifier: deploy
type: Deployment
spec:
environment:
environmentRef: prod
infrastructureDefinitions:
- identifier: prod_k8s
生产环境要求:
image_tag 不允许 latest 必须使用 v1.0.0、release-日期-流水号或 commit sha prod Input Set 的修改必须走审批
十二:示例 Trigger YAML
orgs/devops-lab/projects/harness-demo/triggers/gitlab-main-push.yaml
trigger:
name: gitlab-main-push
identifier: gitlab_main_push
enabled: true
description: main 分支 push 后触发测试环境部署
orgIdentifier: devops_lab
projectIdentifier: harness_demo
pipelineIdentifier: nodejs_k8s_deploy
source:
type: Webhook
spec:
type: Gitlab
spec:
type: Push
spec:
connectorRef: gitlab_company
autoAbortPreviousExecutions: true
repoName: devops/harness-demo-app
branchRegex: main
inputSetRefs:
- dev
注意:
Trigger YAML 字段可能随 Harness 版本或 UI 生成方式有差异 建议先在 UI 中创建 Trigger 再切换 YAML 复制保存 不要凭空手写不确定字段
十三:安装 Harness CLI
官方推荐新版 CLI 命令为:
hc
旧版:
harness
旧版未来会废弃,因此本文统一使用 hc。
安装脚本 scripts/install-hc.sh:
#!/usr/bin/env bash
set -e
echo "安装 Harness CLI hc"
curl https://raw.githubusercontent.com/harness/harness-cli/v2/install | sh
echo "检查版本"
hc version
echo "安装完成"
执行:
chmod +x scripts/install-hc.sh
./scripts/install-hc.sh
如果国内网络无法访问 GitHub raw 地址,有三种方案:
方案一:使用企业代理访问 GitHub raw 方案二:在可出网机器下载 hc 二进制后上传到内网 方案三:将 hc 二进制放入企业制品库或对象存储统一分发
代理示例:
export HTTPS_PROXY=http://proxy.company.com:3128
export HTTP_PROXY=http://proxy.company.com:3128
十四:配置 Harness CLI 登录
执行:
hc auth login
按提示输入:
URL: app.harness.io
API Token Key: Harness API Token
Account ID: Harness Account Identifier
Organization ID: devops_lab
Project ID: harness_demo
登录后验证:
hc version
hc --help
官方示例中还可以通过查询 Registry 验证连接:
hc registry list --org devops_lab --project harness_demo
注意:
API Token 不要提交到 Git 不要写在脚本里 不要输出到日志 企业建议使用专用平台机器人账号
十五:CLI 国内网络注意事项
1. 代理
如果本地不能访问 Harness SaaS:
export HTTPS_PROXY=http://proxy.company.com:3128
export HTTP_PROXY=http://proxy.company.com:3128
如果还需要访问内网 GitLab / Harbor:
export NO_PROXY=localhost,127.0.0.1,.company.com,gitlab.company.com,harbor.company.com
2. 证书
如果企业代理或 Harness Self-Managed 使用自签证书,需要确认系统信任企业 CA。
macOS:
security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain company-ca.crt
Linux:
sudo cp company-ca.crt /usr/local/share/ca-certificates/company-ca.crt
sudo update-ca-certificates
3. Token 权限
CLI 使用的 API Token 建议具备:
读取 Project 读取和编辑 Pipeline 读取和编辑 Input Set 读取和编辑 Trigger 读取 Connector 必要时创建或更新 Service / Environment
生产环境不要给所有人管理员 Token。
十六:查看 CLI 当前支持哪些命令
由于 CLI 版本会持续演进,企业脚本不要假设所有资源都有同样的 create/apply 命令。
先执行:
hc --help
查看某类资源:
hc pipeline --help || true
hc input-set --help || true
hc trigger --help || true
hc connector --help || true
hc project --help || true
建议把支持的命令输出保存:
scripts/list-cli-capabilities.sh
#!/usr/bin/env bash
set -e
echo "===== hc version ====="
hc version || true
echo "===== hc help ====="
hc --help || true
for cmd in pipeline input-set trigger connector service environment project registry; do
echo "===== hc ${cmd} --help ====="
hc ${cmd} --help || true
done
执行:
chmod +x scripts/list-cli-capabilities.sh
./scripts/list-cli-capabilities.sh | tee cli-capabilities.txt
企业落地建议:
把 cli-capabilities.txt 提交到内部文档 明确当前版本支持哪些资源的创建、更新、查询 脚本中根据实际支持的命令实现批量管理 不使用未经验证的命令
十七:YAML 静态检查
在导入 Harness 前,先做本地检查。
安装工具:
brew install yamllint yq
Linux:
sudo apt-get install -y yamllint
scripts/validate-yaml.sh
#!/usr/bin/env bash
set -e
ROOT_DIR="${1:-orgs}"
echo "检查 YAML 格式:${ROOT_DIR}"
find "${ROOT_DIR}" \( -name "*.yaml" -o -name "*.yml" \) | while read -r file; do
echo "检查:${file}"
yamllint -d relaxed "${file}"
done
echo "YAML 格式检查完成"
执行:
chmod +x scripts/validate-yaml.sh
./scripts/validate-yaml.sh orgs
十八:敏感信息检查
不能把以下内容提交到 Git:
GitLab Token Harbor Robot Token Slack Webhook 企业微信 Webhook 数据库密码 云厂商 AK/SK 私钥 kubeconfig 明文
scripts/check-sensitive-info.sh
#!/usr/bin/env bash
set -e
ROOT_DIR="${1:-orgs}"
echo "检查敏感信息:${ROOT_DIR}"
PATTERNS=(
"password:"
"token:"
"secret:"
"PRIVATE KEY"
"BEGIN RSA"
"hooks.slack.com/services"
"key_id"
"access_key"
"secret_key"
"kubeconfig"
)
FOUND=0
for pattern in "${PATTERNS[@]}"; do
echo "扫描关键字:${pattern}"
if grep -Rni "${pattern}" "${ROOT_DIR}" || true; then
FOUND=1
fi
done
if [ "${FOUND}" -eq 1 ]; then
echo "发现疑似敏感信息,请人工确认"
exit 1
fi
echo "未发现明显敏感信息"
注意:
这个脚本可能有误报 误报比漏报更安全 正式环境建议接入 GitLab Secret Detection 或企业代码安全扫描
十九:通过 UI 导入 / 更新 YAML
对于初学者,最稳定方式是:
- 在 Git 中修改 YAML
- 复制 YAML 内容
- 进入 Harness Pipeline Studio
- 切换 YAML
- 粘贴内容
- 等待编辑器校验
- 保存
- 运行验证
这种方式虽然不是完全自动化,但最适合初学阶段。
适合:
第一次创建 Pipeline 学习 Harness YAML 结构 不确定 CLI 是否支持某个资源 需要 Harness YAML Editor 直接提示错误
企业工程化后,可以逐步切换到 CLI/API/Terraform Provider 自动化。
二十:通过 CLI 批量管理资源的落地策略
由于 CLI 版本和资源子命令会演进,本文提供一种安全落地策略:
第一层:用 hc auth login、hc --help、hc version 做身份和能力检查 第二层:用脚本读取 YAML 文件列表 第三层:对当前 hc 已支持的资源使用 CLI 创建或更新 第四层:对 CLI 未覆盖或不稳定的资源,回退到 Harness UI YAML Import 或官方 API 第五层:所有操作前必须通过 Merge Request 审查
不要写死未经验证的命令,例如:
hc apply -f xxx.yaml hc pipeline apply xxx.yaml
除非你已经在当前 CLI 版本中通过 hc --help 确认该命令存在。
二十一:批量处理脚本框架
scripts/apply-one.sh
#!/usr/bin/env bash
set -e
FILE="${1:?YAML file is required}"
echo "准备处理文件:${FILE}"
if [ ! -f "${FILE}" ]; then
echo "文件不存在:${FILE}"
exit 1
fi
echo "先做 YAML 格式检查"
yamllint -d relaxed "${FILE}"
echo "识别资源类型"
if grep -q "^pipeline:" "${FILE}"; then
RESOURCE_TYPE="pipeline"
elif grep -q "^inputSet:" "${FILE}"; then
RESOURCE_TYPE="inputset"
elif grep -q "^trigger:" "${FILE}"; then
RESOURCE_TYPE="trigger"
elif grep -q "^connector:" "${FILE}"; then
RESOURCE_TYPE="connector"
else
RESOURCE_TYPE="unknown"
fi
echo "资源类型:${RESOURCE_TYPE}"
echo "检查当前 hc 是否支持该资源命令"
hc --help >/dev/null
case "${RESOURCE_TYPE}" in
pipeline)
echo "这是 Pipeline YAML"
echo "请使用当前 hc 版本中已确认的 pipeline create/update 命令,或回到 UI YAML Editor 导入"
;;
inputset)
echo "这是 Input Set YAML"
echo "请使用当前 hc 版本中已确认的 input-set create/update 命令,或回到 UI 导入"
;;
trigger)
echo "这是 Trigger YAML"
echo "建议优先在 UI 创建并导出 YAML,因为 Trigger 字段随 SCM 类型差异较大"
;;
connector)
echo "这是 Connector YAML"
echo "Connector 通常引用 Secret,不要在 YAML 中写明文密码"
;;
*)
echo "无法识别资源类型,请人工处理"
exit 1
;;
esac
echo "处理完成:${FILE}"
这个脚本不是为了“假装自动导入”,而是为了建立企业流程:
识别资源类型 先校验 再决定使用 CLI、UI 或 API 避免盲目批量写入生产配置
二十二:批量扫描所有 YAML
scripts/apply-all.sh
#!/usr/bin/env bash
set -e
ROOT_DIR="${1:-orgs}"
echo "批量处理目录:${ROOT_DIR}"
./scripts/validate-yaml.sh "${ROOT_DIR}"
./scripts/check-sensitive-info.sh "${ROOT_DIR}"
find "${ROOT_DIR}" \( -name "*.yaml" -o -name "*.yml" \) | sort | while read -r file; do
echo "================================"
echo "处理:${file}"
./scripts/apply-one.sh "${file}"
done
echo "批量处理完成"
执行:
chmod +x scripts/*.sh
./scripts/apply-all.sh orgs
二十三:Makefile
Makefile
ROOT_DIR ?= orgs
.PHONY: validate
validate:
./scripts/validate-yaml.sh $(ROOT_DIR)
.PHONY: secrets-check
secrets-check:
./scripts/check-sensitive-info.sh $(ROOT_DIR)
.PHONY: cli-capabilities
cli-capabilities:
./scripts/list-cli-capabilities.sh
.PHONY: plan
plan: validate secrets-check
@echo "YAML 校验和敏感信息检查通过"
.PHONY: apply-all
apply-all: validate secrets-check
./scripts/apply-all.sh $(ROOT_DIR)
使用:
make plan
make cli-capabilities
make apply-all
二十四:通过 GitOps 管理 Harness 配置
这里的 GitOps 不是指 Harness GitOps Agent 部署 Kubernetes,而是指:
Harness 自身配置通过 Git 管理 所有变更都走 Git 提交 所有修改都走 Merge Request 合并后由平台管理员应用到 Harness
推荐流程:
- 平台工程师从 UI 导出 Pipeline YAML
- 提交到 harness-platform-config 仓库
- 新建分支修改配置
- 提交 Merge Request
- 自动运行 yamllint 和敏感信息扫描
- 平台负责人 Review
- 合并到 main
- 由管理员执行 make apply-all 或在 UI 中导入
- 运行 Pipeline 验证
分支命名建议:
fea-harness-pipeline-param fix-prod-inputset-approval chore-update-harbor-connector
提交信息建议:
feat: add nodejs prod release pipeline fix: update prod inputset image tag rule chore: add yaml validation script
二十五:GitLab CI 校验 Harness YAML
在配置仓库中添加 .gitlab-ci.yml:
stages:
- validate
validate_harness_yaml:
stage: validate
image: harbor.company.com/platform/yaml-tools:1.0.0
script:
- ./scripts/validate-yaml.sh orgs
- ./scripts/check-sensitive-info.sh orgs
only:
- merge_requests
- main
如果没有 yaml-tools 镜像,可以先制作:
FROM alpine:3.20
RUN apk add --no-cache bash grep curl python3 py3-pip
RUN pip3 install --break-system-packages yamllint
WORKDIR /workspace
构建:
docker build -t harbor.company.com/platform/yaml-tools:1.0.0 .
docker push harbor.company.com/platform/yaml-tools:1.0.0
国内环境建议:
CI 校验镜像放 Harbor 不要依赖 DockerHub pip 源可以改为国内镜像或企业 PyPI 私服
二十六:Pipeline YAML 审查清单
Merge Request 审查时,至少检查:
Pipeline identifier 是否符合规范 orgIdentifier / projectIdentifier 是否正确 是否使用了生产环境 Connector 是否跳过了审批 是否关闭了 Dry Run 是否使用 latest 部署生产 是否把 Secret 明文写入 YAML 是否修改了 prod Input Set 是否修改了生产命名空间 是否修改了审批人组 是否修改了 failure strategy
生产配置修改必须特别关注:
prod environment prod infrastructure prod input set prod approval prod connector prod secrets reference
二十七:生产配置保护规则
GitLab 中建议配置:
main 分支保护 prod 目录 Code Owner prod Input Set 修改必须 2 人 Review 禁止普通开发直接合并 禁止 Force Push 启用 Secret Detection 启用 MR 审批规则
目录示例:
orgs/devops-lab/projects/harness-demo/inputsets/prod.yaml orgs/devops-lab/projects/harness-demo/environments/prod.yaml orgs/devops-lab/projects/harness-demo/pipelines/nodejs-prod-release.yaml
CODEOWNERS 示例:
/orgs/devops-lab/projects/harness-demo/inputsets/prod.yaml @devops-admins @release-managers /orgs/devops-lab/projects/harness-demo/environments/prod.yaml @devops-admins /orgs/devops-lab/projects/harness-demo/pipelines/prod.yaml @devops-admins @release-managers
二十八:CLI 批量创建资源的练习设计
本篇练习目标是:用 CLI 和脚本批量处理 Harness YAML 配置。
因为不同 CLI 版本支持的命令可能不同,所以练习分为两级。
练习 A:基础 CLI 验证
执行:
hc version
hc auth login
hc --help
hc registry list --org devops_lab --project harness_demo
验收:
hc 可以正常执行 认证成功 能够查询到项目内资源
练习 B:批量检查 YAML
执行:
make plan
验收:
YAML 语法检查通过 敏感信息检查通过 没有明文 Token 没有 Webhook URL 没有 kubeconfig
练习 C:识别资源类型
执行:
./scripts/apply-one.sh orgs/devops-lab/projects/harness-demo/pipelines/nodejs-k8s-deploy.yaml
./scripts/apply-one.sh orgs/devops-lab/projects/harness-demo/inputsets/dev.yaml
验收:
脚本能识别 pipeline 脚本能识别 inputset 脚本能提示后续应用方式
练习 D:根据当前 CLI 支持能力完善 apply-one.sh
执行:
./scripts/list-cli-capabilities.sh
根据输出确认是否支持:
pipeline create/update input-set create/update trigger create/update connector create/update
如果当前 CLI 支持,就在 apply-one.sh 中补充对应命令。
如果当前 CLI 不支持,就采用:
UI YAML 导入 Harness API Terraform Provider
作为替代方案。
二十九:为什么不直接硬写所有 CLI 命令?
企业落地一定要避免“复制网上过期命令”。
原因:
Harness CLI 正在从旧版 harness 迁移到新版 hc 不同版本命令可能不同 不同账号模块启用情况不同 部分资源字段会随 Harness 版本变化 Trigger / Connector 字段差异较大
更安全的方式:
以官方 hc --help 为准 以 Harness UI 生成 YAML 为准 以当前账号实际功能为准 先在测试 Project 验证 再推广到生产 Project
这也是本文强调“不随意编造”的原因。
三十:YAML 导入失败常见问题
1. Identifier 重复
错误现象:
identifier already exists
原因:
创建资源时 identifier 已存在
处理:
改为 update 或修改 identifier 或先删除旧资源
2. orgIdentifier / projectIdentifier 错误
错误现象:
Project not found Organization not found
处理:
检查 orgIdentifier 检查 projectIdentifier 确认当前 API Token 有该项目权限
3. Connector 引用不存在
错误现象:
connectorRef not found
处理:
先创建 Connector 确认 connector identifier 正确 确认当前 Project 可以访问该 Connector
4. Secret 引用不存在
错误现象:
secret not found
处理:
先在 Harness 创建 Secret YAML 中只引用 Secret Identifier 不要提交 Secret 明文
5. YAML 缩进错误
错误现象:
Invalid YAML mapping values are not allowed did not find expected key
处理:
用 yamllint 检查 使用 2 空格缩进 不要混用 Tab 复杂脚本使用 | 块
6. Runtime Input 没有对应 Input Set
错误现象:
运行 Pipeline 时仍要求填写参数
原因:
Input Set 没覆盖所有 <+input>
处理:
更新 Input Set 或者把固定值写回 Pipeline
三十一:国内网络常见问题
1. 安装 hc 失败
原因:
无法访问 raw.githubusercontent.com 公司代理未配置 DNS 解析失败
解决:
配置 HTTPS_PROXY 使用可出网机器下载 将 hc 二进制放入内部制品库
2. hc auth login 失败
原因:
API Token 错误 Account ID 错误 代理拦截 证书不受信任 URL 写错
排查:
curl -I https://app.harness.io
hc --help
hc version
3. CLI 可以登录但操作失败
原因:
API Token 权限不足 Org / Project 不匹配 资源 identifier 写错 账号没有启用对应模块
解决:
检查 RBAC 检查 Token 所属用户 检查 Organization / Project 使用最小测试资源验证
4. GitLab CI 中使用 CLI 失败
原因:
CI Runner 不能访问 Harness SaaS 未配置 API Token Token 被日志暴露 容器镜像没有 hc
解决:
制作内部 hc 工具镜像 Token 放 GitLab CI Variables 设置 masked / protected 配置企业代理
三十二:制作企业内部 hc 工具镜像
为了让 GitLab CI 或内部流水线使用 hc,建议制作内部镜像。
Dockerfile.hc
FROM alpine:3.20
RUN apk add --no-cache bash curl ca-certificates git grep yq
RUN curl https://raw.githubusercontent.com/harness/harness-cli/v2/install | sh || true
RUN if [ -f ./hc ]; then mv ./hc /usr/local/bin/hc; fi && \
chmod +x /usr/local/bin/hc || true
WORKDIR /workspace
CMD ["bash"]
构建:
docker build -f Dockerfile.hc -t harbor.company.com/platform/harness-cli:1.0.0 .
docker push harbor.company.com/platform/harness-cli:1.0.0
如果不能在 Dockerfile 中访问 GitHub raw:
先下载 hc 二进制 放到构建上下文 COPY hc /usr/local/bin/hc
离线版:
FROM alpine:3.20
RUN apk add --no-cache bash curl ca-certificates git grep yq
COPY hc /usr/local/bin/hc
RUN chmod +x /usr/local/bin/hc
WORKDIR /workspace
CMD ["bash"]
三十三:GitLab CI 中运行校验
.gitlab-ci.yml
stages:
- validate
- plan
variables:
ROOT_DIR: orgs
validate_harness_config:
stage: validate
image: harbor.company.com/platform/harness-cli:1.0.0
script:
- ./scripts/validate-yaml.sh ${ROOT_DIR}
- ./scripts/check-sensitive-info.sh ${ROOT_DIR}
only:
- merge_requests
- main
show_cli_capabilities:
stage: plan
image: harbor.company.com/platform/harness-cli:1.0.0
script:
- hc version
- hc --help
- ./scripts/list-cli-capabilities.sh
only:
- main
注意:
不要在普通 MR 中直接 apply 到生产 Harness 先 validate 合并 main 后由平台管理员执行 apply
三十四:企业落地推荐流程
推荐流程:
开发或平台工程师修改 YAML ↓ 提交 feature 分支 ↓ 创建 Merge Request ↓ GitLab CI 运行 YAML 校验和敏感信息扫描 ↓ 平台负责人 Review ↓ 合并 main ↓ 管理员执行 make apply-all 或 UI/API 导入 ↓ Harness 中验证 Pipeline ↓ 记录变更
生产配置变更推荐:
必须关联变更单 必须 2 人 Review 必须验证测试环境 必须记录回滚方案 必须保留旧版本 YAML
三十五:企业最佳实践
1. 先 UI 生成,再 YAML 管理
不要纯手写复杂 Pipeline。
推荐:
UI 跑通 YAML 导出 Git 管理 小步修改 MR 审查
2. Harness 配置仓库独立管理
不要把所有 Harness 配置散落在各业务仓库。
推荐:
harness-platform-config
业务仓库只保存应用代码、Dockerfile、K8s Manifest。
3. Secret 只存引用
正确:
passwordRef: harbor_robot_token
错误:
password: "真实密码"
4. 生产配置受保护
必须保护:
prod input set prod pipeline prod environment prod connector prod approval
5. CLI 命令以版本为准
任何批量脚本中都要先做:
hc version
hc --help
不要复制未经验证的 CLI 命令。
6. YAML 必须走校验
最少检查:
YAML 语法 敏感信息 identifier 命名 prod latest approval_required connectorRef secretRef
三十六:练习 1:导出 Pipeline YAML
目标:
从 Harness UI 导出一条已有 Pipeline YAML,提交到 Git。
步骤:
- 打开 Pipeline Studio
- 切换 YAML
- 复制 YAML
- 保存到 pipelines/nodejs-k8s-deploy.yaml
- git add / commit / push
验收:
Git 仓库中存在 Pipeline YAML YAML 中没有明文 Secret 可以通过 yamllint
三十七:练习 2:安装并登录 hc CLI
目标:
完成 hc 安装、登录和基础查询。
步骤:
curl https://raw.githubusercontent.com/harness/harness-cli/v2/install | sh
hc version
hc auth login
hc --help
验收:
hc version 正常 hc auth login 成功 hc --help 可以显示命令
三十八:练习 3:批量检查 YAML
目标:
使用脚本批量校验 Harness YAML。
步骤:
make plan
验收:
YAML 校验通过 敏感信息扫描通过 发现问题时 GitLab CI 失败
三十九:练习 4:批量创建资源前的能力探测
目标:
通过 hc --help 确认当前 CLI 支持哪些资源命令。
步骤:
./scripts/list-cli-capabilities.sh | tee cli-capabilities.txt
验收:
能看到当前 CLI 版本 能看到可用命令 能确定 pipeline/inputset/trigger/connector 是否支持 CLI 方式管理
四十:练习 5:使用 GitOps 流程修改 Input Set
目标:
把 dev 副本数从 1 改成 2,并通过 MR 审查。
步骤:
git checkout -b fea-update-dev-inputset
修改:
replicas: 2
提交:
git add orgs/devops-lab/projects/harness-demo/inputsets/dev.yaml
git commit -m "feat: update dev inputset replicas"
git push origin fea-update-dev-inputset
创建 Merge Request。
验收:
MR 中能看到 YAML 差异 CI 校验通过 合并后由管理员应用到 Harness 运行 dev Input Set 后副本数变为 2
四十一:验收标准
完成本文后,应达到:
已理解 Visual Editor 与 YAML Editor 的区别 已能在 Harness 中切换 YAML 编辑器 已能导出 Pipeline YAML 已能将 Harness YAML 提交到 Git 已安装 hc CLI 已完成 hc auth login 已能使用 hc --help 查看命令 已能设计 Harness 配置仓库结构 已能编写 Pipeline / Input Set / Trigger YAML 已能进行 YAML 格式校验 已能进行敏感信息扫描 已理解 CLI 版本差异与命令确认方式 已能设计批量创建资源的安全流程 已能通过 GitLab MR 管理 Harness 配置变更