基于华为云构建Agentic DevOps工具栈实践
方案概述
AI赋能 DevOps 研发全流程,落地研发效率提升方案:将华为云码道、ClaudeCode、OpenCode 这类 AI 工具+LLM融入DevOps全流程,让 AI 承接重复、标准化、高耗时的工作,把研发 / 运维人员解放出来聚焦核心业务值得持续深入探索。
方案架构
本方案基于华为云构建端到端Agentic DevOps工具栈
方案架构图

核心组件
- l OpenCode:云端一体化开发平台,支持代码编写、调试,并通过内置自动化技能(Skills)实现代码提交与分支合并。
- l GitLab:源代码管理与版本控制中心,提供代码托管、分支管理及Webhook触发能力。
- l Jenkins:持续集成与持续部署引擎,驱动构建、测试、镜像推送及部署全流程。
- l SWR(Software Repository for Container):华为云安全可靠的容器镜像仓库,支持镜像存储、版本管理与安全扫描。
- l CCE(Cloud Container Engine):华为云企业级Kubernetes服务,实现容器应用的弹性编排、滚动更新与高可用部署。
全流程示例
- l 代码开发与托管:利用 OpenCode 完成全量代码开发,并推送至 GitLab 仓库进行版本管理。
- l 流水线配置:在 GitLab 创建项目并配置 Webhook,联动 Jenkins 创建构建任务,实现代码变更自动触发。
- l 构建与编译:Jenkins 自动拉取源码,依据预设参数执行编译及单元测试。
- l 镜像构建与推送:构建成功后自动生成 Docker 镜像,并推送至 SWR(容器镜像服务)进行存储与版本打标。
- l 自动化部署:调用 CCE 接口,将最新镜像无缝部署至云容器集群,完成发布。
前置资源准备
实施前需完成以下资源准备:
- l 虚拟私有云(VPC):构建统一、安全的网络环境,确保各组件内网互通,具体配置与操作请参见相关官方文档。
- l 弹性云服务器(ECS)×2:分别部署GitLab(代码仓库)与Jenkins(CI/CD调度中心),具体配置与操作请参见相关官方文档。
- l CCE集群:已创建并配置好的Kubernetes集群,用于容器应用运行,具体配置与操作请参见相关官方文档。
- l SWR服务:已开通的容器镜像仓库,建议配置访问策略与镜像扫描规则,具体配置与操作请参见相关官方文档。
实施步骤
步骤一、代码的开发与提交
安装opencode
完成opencode基础环境的安装与搭建,详情参见附件三。
代码智能生成
输入提示词进行项目代码的开发。
基于提示词进行代码开发的指导性原则和规范性要求如下:
- 明确定义AI的角色、具体任务与上下文约束。例如,指定AI为“资深全栈架构师与安全专家”,要求其“构建包含‘AI初筛+人工复审’三审工作流的内容发布模块”,并说明“需集成JWT双令牌认证、Redis防刷机制及动态敏感词库”等技术背景,以确保输出内容精准匹配企业级内容安全与高并发预期。
- 在此基础上,提示词需阐明基本要求,涵盖功能性、约束性与质量维度。功能层面需明确输入、处理与输出;约束层面应指定编程语言、版本及代码规范;质量层面则需定义可测试性、错误处理与日志记录等标准。例如,可要求“核心接口响应时间<200ms,使用Node.js 18+ (NestJS),以此确保生成的代码具备高性能、高可维护性与工程化质量。
以下给到示例项目的提示词,仅供参考,可根据实际项目情况进行修改:



构建结果
会在当前目录下,生成一个功能完整、结构清晰、包含基础前后端代码、配置文件及依赖声明(如package.json, pom.xml)的可运行项目原型。

代码自动提交
开发者在OpenCode中完成编码,通过Skills自动化能力进行代码扫码和质量检查,并将代码提交至GitLab仓库。Skills的安装,详情参见附件四。
步骤二、Gitlab安装及配置
登录ECS服务器。
1、安装指定版本的Docker
-
登录ECS服务器。
- 在Huawei Cloud EulerOS 2.0操作系统下,可以使用如下命令快速安装最新版本的Docker。如以下命令无法自动化安装,请根据操作系统进行手动安装,详细操作请参见Docker Engine installatio
dnf install docker
- 查看Docker是否安装成功。
docker info

2、拉取 Gitlab 镜像
docker pull gitlab/gitlab-ce
3、运行容器。
docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
4、查询容器状态。
docker ps | grep gitlab

5、在Gitlab上创建项目
生成项目的URL访问地址是通过容器的hostname进行生成的,即容器的id。作为Gitlab服务器,需要一个固定的 URL访问地址,因此需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)。
a.在宿主机上通过vi打开文件/home/gitlab/config/gitlab.rb。
vi /home/gitlab/config/gitlab.rb
添加内容如下
external_url 'http://**.**.**.**' //宿主机外部IP,如EIP
gitlab_rails['gitlab_ssh_host'] = '**.**.**.**' //宿主机外部IP,如EIP
gitlab_rails['gitlab_shell_ssh_port'] = 222 //此端口是启动容器时的端口映射,222->22
b.保存修改内容。
6、重启容器。
docker restart gitlab
7、登录Gitlab服务
使用浏览器访问“ECS EIP:80”, 默认用户名为root,初始登录密码存放在gitlab容器的/etc/gitlab/initial_root_password路径下。
您可以通过以下命令获取:
docker exec gitlab cat /etc/gitlab/initial_root_password

步骤三、Jenkins安装及配置
·1、拉取Jenkins镜像。
docker pull jenkins/jenkins:lts
2、运行Jenkins容器。
由于后续需要在Jenkins容器里执行docker build等相关命令,因此该容器需具备docker in docker(dind)的能力,因此需要将docker.sock与docker挂载到
docker run -d -p 8000:8080 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--name myjenkins --privileged=true -u root jenkins/jenkins:lts
测试Jenkins容器是否能执行docker命令。
docker exec myjenkins docker ps
3、访问Jenkins
使用浏览器访问“ECS EIP:8000”,登录Jenkins服务,默认用户名为admin,初始登录密码存放在/var/jenkins_home/secrets/initialAdminPassword路径下。
您可以通过以下命令获取密码:
docker exec myjenkins cat /var/jenkins_home/secrets/initialAdminPassword
登录Jenkins后,选择安装推荐的插件。完成初始配置后,即可进入Jenkins页面。


4、安装kubectl命令行工具。
将kubectl下载到本地,建议和用户要使用的集群版本保持一致。
wget https://dl.k8s.io/release/v*.*.*/bin/linux/amd64/kubectl // v*.*.*为集群版本
将kubectl复制到Jenkins容器内。
docker cp kubectl myjenkins:/usr/bin/
docker exec myjenkins chmod +x /usr/bin/kubectl
5、配置Jenkins免密拉取Gitlab代码。
在jenkins环境生成SSH秘钥,并配置到gitlab。通过SSH秘钥方式,将本地git项目与代码托管服务(Repo)建立联系。
登陆jenkins服务器获取SSH公钥。
docker exec -it myjenkins ssh-keygen -t rsa
按Enter跳过填写其他参数,默认可无需填写。
查看生成的公钥。
docker exec myjenkins cat /root/.ssh/id_rsa.pub
a.在Gitlab中搜索SSH,添加一个新密钥。

b.输入SSH公钥。

c.保存SSH Key。

步骤四、持续集成及持续部署
1、安装Jenkins插件
Jenkins的核心功能与扩展性很大程度上依赖于插件。默认安装的插件提供了基础能力,但要实现与特定平台(如GitLab、Kubernetes)的对接以及定制化任务(如邮件通知),必须安装相应的专用插件。
除了前文安装 Jenkins 时默认安装的插件外,还需要安装 GitLab Plugin,Kubernetes CLI,Email Extension插件。
· GitLab Plugin:用于实现Jenkins与GitLab代码仓库的深度集成。它支持自动触发构建(如GitLab的Merge Request事件)、在GitLab中显示构建状态、以及从GitLab拉取代码等关键CI/CD流程。
· Kubernetes CLI:为Jenkins提供在Pipeline或任务中直接执行kubectl命令的能力。当您的部署目标为Kubernetes集群时,此插件是实现应用自动部署到K8s的必备工具。
· Email Extension Plugin:扩展并增强Jenkins原生的邮件通知功能。它允许您自定义邮件的发送人、收件人、邮件格式、触发条件(成功、失败、不稳定等)以及邮件内容模板,使通知更灵活、更专业。
安装方式:
在Jenkins Dashboard页面单击左侧“Manage Jenkins”,选择“System Configuration > Manage Plugins”,在“Available”页签中筛选安装“GitLab”、“Kubernetes CLI”和“Email Extension Template”插件。

上述安装的插件版本可能随时间变化发生变动。
安装完成后,根据提示重启Jenkins服务以使插件生效。
2、配置Gitlab Hook
当推送代码之后,Gitlab通过Webhook来通知Jenkins push event,所以首先需要配置Gitlab Hook。
· 登录Jenkins界面单击“New Item”,新建流水线。

· 复制URL,并单击高级选项。

· 单击“Generate”生成Token并记录,其他选项可保持默认,单击保存。

· 登录Gitlab启用webhook功能。
开启本地请求,因为 GitLab 10.6 版本以后为了安全,不允许向本地网络发送 WebHook 请求。


· 登录到 Gitlab-项目中左边列选择 Settings->webhook,在URL和 secret token 分别填入上文在 Jenkins 里记录下的值。

· 在页面最下端,确认添加 webhook,并进行测试。

3、邮件通知配置
邮件是Jenkins在消息通知、审批环节中比较通用的一种方式,本方案中也是选择邮件作为审批方式。
· 在“Manage Jenkins”,选择“System”。

· 配置邮箱基本信息,填写管理员邮箱地址。

须知:其中password不是邮箱密码,而是邮箱授权码。
凭据配置
为了保证安全性,K8S 集群都必须通过 https 来访问。因此,需要在 Jenkins 上配置访问 K8S 集群的凭证。
- 获取K8S 集群客户端 kubeconfig 配置,可参考通过kubectl连接集群,获取kubectl配置文件。
- 登录Jenkins 页面,进入“Manage Jenkins”,选择“Security > Manage Credentials”,并通过 secret file 的方式创建集群凭证。

4、Pipeline脚本编写
Pipeline是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。其作为Jenkins2.X 最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。因此,Pipeline脚本编写是整个方案实现的关键。
编写流水线脚本,需要将镜像推送到swr,并将容器部署到CCE上,需要开通配置SWR和CCE的相关资源,详情参考附录一和附录二。
Pipeline脚本大致涉及到以下概念:
· node(节点)
节点是一个机器,它是 Jenkins 环境的一部分,同时也是执行该流水线的实体。
· stage(阶段)
stage块定义了在整个流水线的不同执行阶段(比如 "Build", "Test" 和 "Deploy" 阶段),每个阶段执行一组特定的任务。
· step(步骤)
step是阶段中的单个任务,如运行测试、部署代码等。 告诉Jenkins在特定的时间点要做的事情,例如,执行一段shell命令。(更多的Jenkins Pipeline语法可参考官网:https://www.jenkins.io/zh/doc/book/pipeline/)
1. 进入Jenkins的流水线,单击左侧导航栏的“Configuration”。
2. 配置pipeline脚本。以下pipeline脚本仅供您参考,您可根据自身业务自定义脚本内容。
以下给到一个参考:
#!groovy//定义代码仓地址
def git_url = 'ssh://git@xxxx:222/ccedemo/java-demo.git'
//定义SWR登录指令
def swr_login = 'docker login -u cn-north-4@xxxx -p xxxxxx swr.cn-north-4.myhuaweicloud.com'
//定义SWR区域
def swr_region = 'cn-north-4'
//定义需要上传的SWR组织名称
def organization = 'testapp'
//定义镜像名称
def build_name = 'demo01'
//部署集群的证书ID
def prod_credential = 'prod_config'
//集群的APIserver地址,需保证从Jenkins集群可以正常访问该地址
def test_apiserver = 'https://xxx:5443'
// 邮箱地址
def test_email="xxxxx@xx.com"
pipeline{
agent any
stages{
stage('Git code'){
steps{
echo "1. Git code"
git url: git_url
script {
// git rev-parse --short HEAD命令的返回值,即commit ID,作为镜像的tag
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
image_url = "swr.${swr_region}.myhuaweicloud.com/${organization}/${build_name}:${build_tag}"
}
}
}
stage('Build') {
steps{
echo "2. Build Docker Image Stage and Push Image"
sh "docker build -t ${image_url} ."
sh swr_login
sh "docker push ${image_url}"
// 替换k8s资源文件中的镜像地址
sh "sed -i 's+demo01:v1+${image_url}+g' ./demo01.yaml"
}
}
stage('Deploy Test Environment') {
steps{
//配置测试环境证书 withKubeCredentials
echo "3. Deploy Test Environment"
script {
try {
withKubeConfig([credentialsId: test_credential, serverUrl: test_apiserver]) {
sh 'kubectl apply -f ./demo01.yaml'
//该YAML文件位于代码仓中,此处仅做示例,请您自行替换
}
println "deploy success"
// 发送邮件给测试
mail subject: "【请测试】应用已部署到测试环境,请开始测试",
body: """测试通过后, <a href="${BUILD_URL}input">单击该链接使用账号登录后确认测试通过</h3>""",
charset: 'utf-8',
mimeType: 'text/html',
to: "$test_email"
} catch (e) {
RUN_FLAG = false
println "deploy failed!"
println e
}
}
}
}
stage('Test'){
// 等待测试确认
input{
message "测试是否通过"
submitter "admin"
}
steps{
script{
println "4. Test Passed"
// 发送邮件给管理员
mail subject: "【请审核】发布到生产环境",
body: """测试已通过, <a href="${BUILD_URL}input">单击该链接使用账号登录后进行审批</h3>""",
charset: 'utf-8',
mimeType: 'text/html',
to: "$test_email"
}
}
}
5、构建与部署效果
Opencode完成代码开发,推送到SWR代码仓,自动触发流水线的编译构建

审核人收到邮件通知

单击邮件中的链接,确认测试通过

在cce集群查看资源的创建和应用部署情况


最终项目效果展示:

附录
附录一、SWR开通与配置
创建组织
容器镜像服务为您提供组织管理功能,方便您根据自身组织架构来构建镜像的资源管理。上传镜像前,请先创建组织。
- 登录SWR控制台SWR控制台。
- 单击控制台左上角的,选择区域和项目。
- 在左侧导航栏单击“组织管理”,进入组织管理页面。
- 单击页面右上角的“创建组织”按钮,在弹框中填写“组织名称”,然后单击“确定”。

说明:
- 组织名称全局唯一,即当前区域下,组织名称唯一。创建组织时如果提示组织已存在,可能该组织名称已被其他用户使用,请重新设置一个组织名称。
- 用户在IAM中被授予SWR Admin或Tenant Administrator策略才有创建组织的权限。
- 不允许创建名称为library的组织,该组织为系统预留,请更换一个其他的名称。
查看组织中的镜像
创建组织后,您可以查看当前组织中的镜像。
- 登录SWR控制台SWR控制台。
- 单击控制台左上角的,选择区域和项目。
- 在左侧导航栏选择“组织管理”,单击右侧组织名称。
- 单击“镜像”页签,查看当前组织中的镜像。

获取登陆凭证
1、获取编程访问权限。(如果当前用户已有编程访问权限,请忽略此步骤)
- 以管理员身份,登录统一身份认证服务控制台统一身份认证服务 IAM控制台。
- 在管理控制台左上角单击,选择区域和项目。
- 在“用户”页搜索框输入并搜索要授予编程访问权限的用户名称。
- 单击用户名称,进入用户详情页。单击“访问方式”后面的按钮。勾选“编程访问”选项(可单独勾选编程访问,也可以2种访问方式同时勾选。)
图1 修改访问方式

2、获取AK/SK访问密钥。(如果当前用户已获取AK/SK访问密钥,请忽略此步骤)
- 登录统一身份认证服务控制台统一身份认证服务 IAM控制台,将鼠标移到用户名处,单击“我的凭证”。
- 在左侧导航栏中选择“访问密钥”,单击“新增访问密钥”。
- 输入描述信息,单击“确定”。
- 在弹出的提示页面单击“立即下载”。
- 下载成功后,在“credentials.csv”文件中即可获取AK和SK信息。
每个访问密钥文件仅能下载一次,请妥善保管。
3、登录SWR控制台SWR控制台。
4、依次单击页面的“登录指令->通用型登录指令->长期有效登录指令->导入访问密钥”,选择访问密钥文件credentials.csv或者手动输入步骤2中获取的 credentials.csv文件中的Access Key Id和Secret Access Key,单击“生成指令”后会自动生成长期有效的登录指令。到此获取完成。

附录二、CCE集群开通与配置
集群创建
通过对集群进行基本配置,可以定义集群的核心架构和资源规则的底层设置,为集群运行提供框架性约束和资源分配依据。
- 登录CCE控制台。在页面左上角,选择集群部署区域,所选区域与资源部署区域的距离越近,网络时延越低,访问速度越快。
- 确认区域后,请单击“购买集群”。如果是首次使用CCE则需要创建委托,请根据页面提示进行处理。
- 对集群信息进行配置,如图

基础配置:
集群类型:选择CCE Standard集群
计费模式:按需计费
集群名称:自定义,4~128个字符之间,以小写字母开头
企业项目:选择项目名称,仅对开通企业项目的企业客户账号显示.
集群版本:V1.33
控制节点架构:x86
集群规模:50节点
集群master实例数:单实例
网络配置
虚拟私有云:若没有可选虚拟私有云,请单击“新建虚拟私有云”进行创建
默认节点子网:选定子网
节点默认安全组:使用CCE自动生成的安全组
插件选择
CCE提供了丰富的插件选项,以扩展集群的功能,增强容器化应用环境的功能性和灵活性,您可以根据具体需求进行选择。
有一部分基础功能插件是默认必需的,而其他非基础插件如果在创建集群时未选择安装,您也可以在集群创建完成后通过插件中心安装。
创建节点池
操作步骤
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。
- 单击右上角“创建节点池”。
基础配置
节点池名称:自定义,如nodepool-2026
节点类型:弹性云服务器-虚拟机
节点规格:4Vcpu、8G内存
容器运行时:Containerd
操作系统:公共镜像:Huawei Cloud EulerOS 2.0
登陆方式:密码,设置密码
存储配置
系统盘:通用SSD 50G
系统组件存储:数据盘
数据盘:通用SSD 50G
网络配置
虚拟私有云/节点子网:选择子网
节点IP:自动分配
弹性公网IP:暂不使用
节点数量:2
扩缩容节点池
对创建的节点池中的某个规格进行扩缩容。
须知:
默认节点池不支持扩缩容,请通过创建节点添加。
- 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。
- 单击节点池名称后的“扩缩容”。
- 在弹出的“节点池扩缩容”窗口中,设置扩缩容参数。
o 扩缩容:选择“扩容节点”或“缩容节点”。
o 扩容/缩容规格:使用选择的规格扩容或缩容节点。
o 计费模式:仅扩容节点时需选择。
§ 包年包月
包年包月需要选择购买时长,还可以勾选自动续费。按月购买自动续费周期为1个月,按年购买自动续费周期为1年。
§ 按需计费
o 本次扩容/缩容节点数:
§ 扩容时,本次需要扩容的节点数与已有节点数相加不可超过当前集群管理规模。
§ 缩容时,本次需要缩容节点数不可超过已有节点数。
缩容操作可能导致与节点有绑定关系的资源(本地存储,指定调度节点的负载等)无法正常使用。请谨慎操作,避免对运行中的业务造成影响。

- 单击“确定”,即可完成节点池的扩缩容。
附录三、opencode的安装与使用
安装
OpenCode 提供两种标准化的安装途径,用户可根据当前开发环境偏好选择脚本自动化安装或NPM 包管理安装。
安装方式
1、脚本自动化安装(推荐)
该方式适用于大多数 Linux/macOS 环境。安装脚本将自动检测系统环境,处理依赖项冲突,并智能配置系统环境变量(PATH),确保命令行工具全局可用。
curl -fsSL https://opencode.ai/install | bash
2、NPM 包管理安装
适用于已预置 Node.js 运行环境且习惯使用 npm/yarn 进行全局包管理的开发者。
npm install -g opencode-ai
前置要求:请确保本地 Node.js 版本 ≥ 18.0,且 npm 全局安装路径已加入系统 PATH。
安装验证
安装完成后,请执行以下命令校验版本信息,以确认二进制文件已正确链接且可执行:
opencode --version
预期输出:终端应返回当前安装的版本号(例如:opencode version 1.2.0)。若提示“command not found”,请检查环境变量配置或重新执行安装步骤。
启动与初始化
验证通过后,输入以下命令启动 OpenCode 交互式终端:
opencode
系统初始化后将加载默认配置并进入交互界面。成功启动后,终端界面如图

使用
核心操作:双 Agent 模式
通过 Tab 键 切换两种智能体模式:
|
模式 |
适用场景 |
行为特点 |
安全限制 |
|
build |
代码生成/修改、文件操作 |
自动创建/编辑文件 |
无(完全操作权限) |
|
plan |
架构设计/任务规划/代码审查 |
拒绝直接修改文件 |
仅输出建议,无写权限 |
其他常用命令
|
命令 |
作用 |
适用模式 |
|
/reset |
重置当前对话上下文 |
全局 |
|
/undo |
撤销最后 3 次文件修改 |
build |
|
/explain |
解释选中代码(需先选中文件) |
全局 |
|
/test |
生成单元测试用例 |
build |
|
/audit |
安全漏洞扫描 |
plan |
|
/docs |
生成 API 文档 |
build |
|
/exit 或 ^C |
退出 OpenCode |
全局 |
模型选择与配置
针对不同项目复杂度,需动态切换 AI 模型以平衡性能与成本。
操作指令:在 OpenCode 交互界面输入 /models 调出模型列表。
我选择的模型是MinMax M2.5。
附件四、Skills的安装与使用
安装
Skills工具介绍:
Skills是基于自然语言交互的AI代理能力扩展工具,通过结构化的SKILL.md文档定义特定任务执行逻辑。作为OpenCode等AI开发平台的核心扩展机制,Skills使AI代理能够执行专业化的开发任务,极大提升自动化水平与代码质量。
安装方法,例如:
# 安装基础工具集
npx skills add https://github.com/vercel-labs/skills --skill find-skills
# 安装代码质量保障技能
npx skills add https://github.com/vercel-labs/agent-skills --skill lint-and-validate
# 安装版本控制自动化技能
npx skills add https://github.com/vercel-labs/agent-skills --skill git-commit-push
使用
OpenCode 支持显式指令与隐式语义两种技能触发模式,以适配不同复杂度的开发场景:
· 显式命令调用:用户可在交互终端输入 /skills 指令,查看并手动加载已注册的专用技能模块,适用于需要精确控制特定工具链的场景。
· 自然语言意图识别:系统具备基于上下文的智能意图解析能力。用户仅需通过自然语言描述业务目标(例如:“完成开发后执行代码质量审计,提交至 GitLab 远程仓库并发起合并请求 MR”),AI 将自动编排并串联相应的技能序列(Code Review → Git Push → Merge Request),实现端到端的自动化闭环。
- 点赞
- 收藏
- 关注作者
评论(0)