【鸿蒙心迹】在华为云 x86 服务器上用 Python Paramiko 批量搭建鸿蒙开发环境的实战记录

当鸿蒙开发遇上云服务器,当 SSH 遇上 Python,一段自动化运维与鸿蒙工程化交织的实战之旅就此展开。

一、背景:为什么要在 x86 服务器上搞鸿蒙开发?

提到鸿蒙开发,大多数人的第一反应是打开 Windows 或 macOS 上的 DevEco Studio,拖拽 ArkUI 组件,点一下 Run,应用就跑在模拟器或真机上了。但在实际工程中,尤其是在团队协作、CI/CD 流水线、自动化测试等场景下,我们往往需要在远程服务器上完成鸿蒙工程的创建、编译和打包。

这次我拿到了 4 台华为云 ECS 服务器,配置如下:

服务器名称公网 IP私网 IP规格
ecs-351a-3bde-00011.92.103.196192.168.0.588vCPUs / 16GiB / x3e.8u.16g
ecs-351a-3bde-0002120.46.214.230192.168.0.828vCPUs / 16GiB / x3e.8u.16g
ecs-351a-3bde-00031.94.202.193192.168.0.258vCPUs / 16GiB / x3e.8u.16g
ecs-351a-3bde-0004119.3.173.194192.168.0.1628vCPUs / 16GiB / x3e.8u.16g

统一为 Ubuntu 24.04 LTS 系统,按需计费,弹性公网 IP 全动态 BGP,5Mbit/s 带宽。目标是:在这 4 台 x86 服务器上搭建鸿蒙开发环境,创建 ArkTS 示例工程,并验证整个流程的可行性。

二、技术选型:为什么用 Python Paramiko?

面对 4 台服务器,手动 SSH 逐台敲命令显然不现实。我选择了 Python + Paramiko 方案,原因有三:

  1. Paramiko 是纯 Python 实现的 SSHv2 协议库,不依赖系统 ssh 客户端,跨平台运行无障碍;
  2. 支持并发连接,配合 ThreadPoolExecutor 可以同时操作多台服务器,大幅缩短部署时间;
  3. 命令执行结果可结构化收集,便于后续生成部署报告和自动化验证。

核心连接代码非常简洁:

import paramiko

def create_ssh_client(host, port, username, password, timeout=30):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(
        hostname=host, port=port, username=username,
        password=password, timeout=timeout,
        look_for_keys=False, allow_agent=False,
    )
    return client

set_missing_host_key_policy(AutoAddPolicy()) 自动接受未知主机密钥,look_for_keys=False 和 allow_agent=False 禁用密钥认证和 SSH Agent,纯密码登录,干净利落。

三、实战过程:从裸机到鸿蒙工程

3.1 并行部署架构

我设计了 11 个步骤的自动化部署流程,使用 ThreadPoolExecutor(max_workers=4) 同时在 4 台服务器上并行执行:

with ThreadPoolExecutor(max_workers=4) as executor:
    futures = {
        executor.submit(setup_harmony_env, server): server["name"]
        for server in SERVERS
    }
    for future in as_completed(futures):
        result = future.result()
        all_results.append(result)

每个步骤的执行结果(exit_code、stdout、stderr)都会被记录到日志文件,最终汇总为 JSON 报告。

3.2 环境搭建步骤详解

Step 1-2:系统检查与基础包安装

首先检查系统信息,确认内核版本、CPU 核数、内存和磁盘空间。然后安装 curl、wget、git、unzip、python3、vim 等基础工具。

Step 3:安装 OpenJDK 17

鸿蒙工程的构建工具 hvigor 基于 Java 运行,需要 JDK 17+ 环境:

apt-get install -y openjdk-17-jdk
java -version
# openjdk version "17.0.20.1" 2026-08-18

Step 4:安装 Node.js 18.x

ohpm(鸿蒙包管理器)和部分构建脚本依赖 Node.js,通过 NodeSource 官方源安装:

curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt-get install -y nodejs
# node v18.20.8, npm 10.8.2

Step 5-7:工作目录与环境变量

创建 /root/harmony_workspace 和 /root/harmony_sdk 目录,编写 /root/.harmony_env.sh 环境脚本并 source 到 .bashrc:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HARMONY_HOME=/root/harmony_sdk
export DEVECO_SDK_HOME=/root/harmony_sdk
export PATH=$JAVA_HOME/bin:$HARMONY_HOME/command-line-tools/bin:$PATH

Step 8-9:创建 ArkTS 示例工程

这是最关键的一步。在服务器上用命令行创建了一个完整的鸿蒙 ArkTS 工程 HelloHarmony,包含:

  • build-profile.json5 — 工程构建配置,指定 SDK 版本 10
  • oh-package.json5 — 包管理配置
  • entry/src/main/ets/pages/Index.ets — 主页面 ArkTS 代码
  • entry/src/main/ets/common/ServerInfo.ets — 服务器信息公共模块

核心页面 Index.ets 实现了一个带点击计数器的 Hello HarmonyOS 界面:

@Entry
@Component
struct Index {
  @State message: string = 'Hello HarmonyOS'
  @State serverName: string = serverInfo.name
  @State serverIP: string = serverInfo.ip
  @State clickCount: number = 0

  build() {
    Column({ space: 20 }) {
      Text(this.message)
        .fontSize(36)
        .fontWeight(FontWeight.Bold)
        .fontColor('#007DFF')

      Text('服务器: ' + this.serverName)
        .fontSize(20)
        .fontColor('#666666')

      Button('点击我')
        .width(200).height(50)
        .backgroundColor('#007DFF')
        .onClick(() => { this.clickCount++ })
    }
    .width('100%').height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

每台服务器的 ServerInfo.ets 都注入了各自的服务器名称和 IP,实现了一码多机部署的差异化配置。

3.3 踩坑记录:Grafana 源 GPG 问题

部署过程中,ecs-351a-3bde-0003 在 apt-get update 时报错:

W: GPG error: https://apt.grafana.com stable InRelease:
   The following signatures couldn't be verified because the public key
   is not available: NO_PUBKEY 963FA27710458545
E: The repository 'https://apt.grafana.com stable InRelease' is not signed.

这台服务器预装了 Grafana APT 源,但 GPG 公钥缺失导致 apt-get update 失败,连带 Node.js 安装也受影响。修复方案:

rm -f /etc/apt/sources.list.d/grafana.list
apt-get update
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt-get install -y nodejs

移除有问题的 Grafana 源后一切正常。这个坑提醒我们:云服务器预装的第三方源不一定可靠,自动化脚本中应该对 apt-get update 做容错处理。

四、验证结果:4/4 全部通过

验证脚本对每台服务器执行了 6 项检查:

检查项0001000200030004
SSH 连接✓✓✓✓
JDK 17✓✓✓✓
Node.js 18✓ v18.20.8✓ v18.20.8✓ v18.19.1✓ v18.20.8
环境变量✓✓✓✓
ArkTS 工程文件✓ 5 files✓ 5 files✓ 5 files✓ 5 files
代码语法检查✓ 4 装饰器 / 7 UI组件✓✓✓

每台服务器的 Index.ets 均为 56 行,包含 @Entry、@Component、struct、build() 4 个核心装饰器/结构,以及 Text、Button、Column 等 7 个 UI 组件引用,ArkTS 代码结构完整。

五、Paramiko 批量管理的经验总结

这次实战让我对 Paramiko 批量运维有了几点深刻体会:

  1. 并行是第一生产力:4 台服务器并行部署,总耗时约 4 分钟,而串行至少需要 12 分钟。ThreadPoolExecutor + as_completed 的组合既保证了并发,又能按完成顺序处理结果。

  2. 日志结构化是必须的:每条命令的 exit_code、stdout、stderr 都要记录。我封装了 run_with_log() 函数,自动截断过长输出,避免日志爆炸。

  3. 错误隔离很重要:单台服务器失败不应影响其他服务器。每个 setup_harmony_env() 调用都包在 try-except 中,异常被捕获并记录,不会中断整个部署流程。

  4. 验证与部署同等重要:部署脚本跑完不代表成功。单独的验证脚本能确认每台服务器的实际状态,发现 0003 的 Node.js 问题就是靠验证环节。

六、结语

在 x86 服务器上搭建鸿蒙开发环境是完全可行的。虽然服务器上没有 DevEco Studio 的 GUI,但通过命令行工具链(JDK + Node.js + hvigor + ohpm),完全可以实现鸿蒙工程的创建、编译和打包。

这次用 Python Paramiko 管理 4 台华为云 ECS 的实战,不仅验证了鸿蒙命令行开发流程在 Linux 服务器上的可用性,也为后续搭建鸿蒙 CI/CD 流水线打下了基础。下一步计划引入 hvigor 构建命令实现真正的 hap 包打包,并对接 hdc 实现自动化部署到真机。

鸿蒙生态正在快速成长,而工程化能力是生态成熟的重要标志。从一台开发机到一群构建节点,从手动点击到自动化流水线,这条路上每一步都值得记录。


本文参与「鸿蒙心迹 · 开发录原创征稿活动」,基于 2026 年 10 月 2 日在华为云 ECS 上的真实开发实践撰写。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐