如何配置GitHub Actions构建依赖GitHub私有仓库的Azure Static Web App?
报错根因
你碰到的手动git clone能跑通、但yarn拉依赖就报Host key verification failed的情况,本质是三个配置错位导致的:
- webfactory/ssh-agent 只负责把你配置的私钥加载到临时SSH代理里,默认不会把GitHub的主机公钥写入全局SSH信任列表。非交互式Shell下执行Git操作时,因为没有预先的主机信任记录,会直接弹出交互确认,非交互场景下就直接报主机校验失败
- Azure Static Web App 官方部署动作的API构建流程,默认在独立的执行上下文运行,不会自动继承当前Runner上配置的SSH代理、全局Git配置,构建时根本感知不到你提前配好的SSH认证信息
- 你当前用的是部署动作的早期预览版本,构建隔离性更强,跨步骤的环境变量传递兼容性比正式版差很多
落地解决步骤
先把SSH基础信任配置打全
在webfactory/ssh-agent步骤执行完成后,新增一个全局配置步骤,消除主机校验类报错:- name: 配置GitHub SSH全局规则 run: | mkdir -p -m 700 ~/.ssh # 自动拉取GitHub官方主机公钥写入信任列表 ssh-keyscan -t rsa,ecdsa,ed25519 github.com >> ~/.ssh/known_hosts chmod 644 ~/.ssh/known_hosts # 强制所有GitHub仓库的HTTPS拉取地址自动替换为SSH格式 git config --global url."git@github.com:".insteadOf "https://github.com/"这步配置完成后,非交互式执行Git操作时不会再弹出主机确认的交互提示,也不会因为地址格式问题不走SSH认证通道。
让SSH代理配置能被后续构建步骤复用
调整webfactory/ssh-agent的配置,把默认临时生成的SSH代理套接字固定到全局可读的路径,避免跨步骤时路径变化导致环境变量失效:- uses: webfactory/ssh-agent@v0.5.1 with: ssh-private-key: ${{ secrets.SSH_PRIVATE }} # 固定SSH套接字路径 ssh-auth-sock: /tmp/ssh-auth.sock然后在Azure Static Web App的部署步骤里,把这个固定的SSH套接字路径注入到构建环境变量里,让yarn执行依赖安装时能找到加载好私钥的SSH代理:
- name: Build And Deploy id: builddeploy uses: Azure/static-web-apps-deploy@v0.0.1-preview with: azure_static_web_apps_api_token: ${{ secrets.AZURE_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" app_location: "/" api_location: "api" output_location: "build" # 新增环境变量传递 env: SSH_AUTH_SOCK: /tmp/ssh-auth.sock极端场景的兜底方案
*如果调整完上述配置后,构建时还是报主机校验失败,说明当前版本的部署动作完全在远端隔离沙箱内执行API构建,根本接收不到Runner本地的配置。*这时候可以跳过部署动作内置的构建流程,提前在Runner本地把API依赖安装好:- 在SWA部署步骤之前,新增一个手动构建API的步骤,进入api目录执行
yarn install --prefer-offline --production,把生成的node_modules、构建产物全部在Runner本地准备好 - 在SWA部署动作的参数里,配置跳过内置的自动构建逻辑,直接上传已经准备好的代码包
另外还要检查
api/package.json里的私有依赖拉取地址,确保是标准的SSH格式:git+ssh://git@github.com/组织名/私有仓库名.git#对应分支或标签,不要用HTTPS格式的地址,否则永远走不通SSH认证通道。- 在SWA部署步骤之前,新增一个手动构建API的步骤,进入api目录执行
内容的提问来源于stack exchange,提问作者Jero
相关产品推荐
相关产品推荐

