我尝试在Azure DevOps管道中通过ssh而不是https(如果使用“ Checkout子模块”,则默认为)检出git子模块。带有图片中的选项可以使用-但是对于开发人员来说,如果他们正在使用存储库,那么总是需要输入密码。
为此,我按照以下说明添加了ssh key. 我创建了一个公共密钥和一个私有密钥,并复制了known_host条目。
这是我的YAML文件片段:
stages:
- stage: DeployBackend
jobs:
- job: SSH
steps:
- task: InstallSSHKey@0
inputs:
knownHostsEntry: $(known_host)
sshPublicKey: $(public_key)
sshKeySecureFile: 'private_key_file'
- job: Deploy
steps:
- checkout: self
submodules: true
- script: |
-- here I run all docker commands to build the container and push it to Azure --
displayName: "Deploy"
如果我使用SSH密钥将存储库克隆到本地计算机,则没有任何问题。但是,如果我运行管道,它将在子模块结帐时崩溃:
请确保您具有正确的访问权限和存储库 存在。致命:克隆 'git@ssh.dev.azure.com:v3 / repoLink ' 进入子模块路径'/ home / vsts / work / 1 / s / app / submoduleFolder'失败 克隆“ app / submoduleFolder”失败。重试计划的克隆到 '/ home / vsts / work / 1 / s / app / submoduleFolder'...主机密钥验证 失败了致命的:无法从远程存储库读取。
这就是仓库中的.gitmodules
文件-它可以在本地正常运行而没有任何问题:
[submodule "app/subModuleName"]
path = app/subModuleName
url = git@ssh.dev.azure.com:v3/***/subModuleName
branch = master
我甚至使用脚本将id_rsa
,known_hosts
和id_rsa.pub
文件写到.ssh
中,但似乎它们甚至没有用于ssh验证。
答案 0 :(得分:0)
解决方案是同时完成所有任务。变量不能在不同的job
实例之间共享。
这有效:
jobs:
- job: jobName
steps:
- task: AzureKeyVault@1
inputs:
azureSubscription: '***'
KeyVaultName: '***'
displayName: "Read Secrets from KeyVault"
- task: InstallSSHKey@0
inputs:
knownHostsEntry: $(known_host)
sshPublicKey: $(public_key)
sshKeySecureFile: 'private_key_file'
displayName: "Create SSH files"
- script: |
git clone --recurse-submodules git@ssh.dev.azure.com:v3/****
git submodule update --init --recursive
docker login -u $(userName) -p $(password) ***
docker build ****
docker push ****
displayName: "Build and Push Docker Container"