You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps多阶段流水线如何传递已安装的SSH密钥?

Azure DevOps流水线拆分阶段后SSH密钥传递问题解决办法

问题场景

原本的流水线代码如下,能正常通过SSH密钥拉取私有依赖完成npm install和构建:

trigger:
  branches:
    include:
      - feature/*
      - develop

pool:
  vmImage: ubuntu-latest

variables:
 publicKey: $(public_key)

stages:
  - stage: PrepareEnvironment
    displayName: Prepare Environment
    jobs:
    - job: InstallSSHKeyJob
      displayName: Install SSH Key
      steps:
      - task: InstallSSHKey@0
        displayName: 'Install SSH Key'
        inputs:
          knownHostsEntry: <knownHost>
          sshPublicKey: '$(publicKey)'
          sshKeySecureFile: id_rsa
      
      - script: |
          npm install
          npm run build

但将流水线拆分为「安装SSH密钥」和「npm安装/构建」两个独立阶段后,npm install报错提示未提供SSH密钥。

原因

Azure DevOps中每个**阶段(Stage)**会分配独立的托管代理虚拟机,前一个阶段安装的SSH密钥仅存在于该阶段的代理环境中,不会自动传递到后续阶段的新代理实例里。

可行解决方案

方案1:在需要的阶段/Job中重新安装SSH密钥

这是最稳妥且推荐的方式,因为每个阶段的代理都是全新的,直接在执行npm install的Job里再次调用InstallSSHKey@0任务即可,配置和之前一致:

trigger:
  branches:
    include:
      - feature/*
      - develop

pool:
  vmImage: ubuntu-latest

variables:
 publicKey: $(public_key)

stages:
  - stage: PrepareEnvironment
    displayName: 准备环境(安装SSH密钥)
    jobs:
    - job: InstallSSHKeyJob
      displayName: 安装SSH密钥
      steps:
      - task: InstallSSHKey@0
        displayName: '安装SSH密钥'
        inputs:
          knownHostsEntry: <knownHost>
          sshPublicKey: '$(publicKey)'
          sshKeySecureFile: id_rsa

  - stage: BuildApplication
    displayName: 安装依赖并构建
    jobs:
    - job: NpmBuildJob
      displayName: npm安装与构建
      steps:
      # 关键:在当前Job中重新安装SSH密钥
      - task: InstallSSHKey@0
        displayName: '安装SSH密钥'
        inputs:
          knownHostsEntry: <knownHost>
          sshPublicKey: '$(publicKey)'
          sshKeySecureFile: id_rsa
      
      - script: |
          npm install
          npm run build

方案2:手动在Job中配置SSH密钥(通过机密变量)

把SSH私钥存入Azure DevOps的机密变量中,在需要的Job里通过脚本写入到代理的.ssh目录:

  1. 在项目「库」-「变量组」中创建机密变量sshPrivateKey,值为私钥内容
  2. 流水线中引用该变量组,然后执行脚本配置:
steps:
  - script: |
      # 创建.ssh目录并设置权限
      mkdir -p ~/.ssh
      chmod 700 ~/.ssh
      # 写入私钥并设置安全权限
      echo "$(sshPrivateKey)" > ~/.ssh/id_rsa
      chmod 600 ~/.ssh/id_rsa
      # 添加已知主机
      echo "<knownHost>" >> ~/.ssh/known_hosts
    displayName: '手动配置SSH密钥'
  - script: |
      npm install
      npm run build

注意:私钥是敏感信息,务必用机密变量存储,避免明文暴露。

方案3:使用自托管代理

如果使用自托管代理(而非微软托管的ubuntu-latest),代理是长期运行的实例,一次安装SSH密钥后,后续所有阶段/Job都能复用该密钥环境。但要注意代理的安全性,以及密钥的更新和生命周期管理。


内容的提问来源于stack exchange,提问作者3adel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:05:20