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目录:
- 在项目「库」-「变量组」中创建机密变量
sshPrivateKey,值为私钥内容 - 流水线中引用该变量组,然后执行脚本配置:
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
相关产品推荐
相关产品推荐

