使用 SSH 在 Azure Pipeline 中检出 git 个子模块
Checkout git submodule in Azure Pipeline with SSH
我尝试在 Azure DevOps 管道中通过 ssh 而不是 https(如果使用 "Checkout submodules" 则默认)检出 git 子模块。使用图片中的选项它可以工作 - 但对于开发人员来说,如果他们正在使用存储库,则一直输入密码很烦人。
为此,我使用以下说明添加 ssh key.
我创建了一个 public 和一个私钥,并复制了 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 密钥将存储库克隆到我的本地计算机,我没有任何问题。但是如果我 运行 管道它会在子模块检出时崩溃:
Please make sure you have the correct access rights and the repository
exists. fatal: clone of
'git@ssh.dev.azure.com:v3/repoLink'
into submodule path '/home/vsts/work/1/s/app/submoduleFolder' failed
Failed to clone 'app/submoduleFolder'. Retry scheduled Cloning into
'/home/vsts/work/1/s/app/submoduleFolder'... Host key verification
failed. fatal: Could not read from remote repository.
这是回购协议中的 .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验证。
解决方案是在一份工作中完成所有任务。不同 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"
另一种方法是将 .gitmodules
路径编辑为相对路径 url,例如 url = ../subModuleName
:
[submodule "app/subModuleName"]
path = app/subModuleName
url = ../subModuleName
branch = master
url 现在是相对于父仓库的 url。因此,当 ado 管道通过 https 克隆它时,它对子模块使用相同的方法。开发人员可以使用 https 或 ssh 克隆 repo,子模块将使用相同的 - 无需输入密码。
我尝试在 Azure DevOps 管道中通过 ssh 而不是 https(如果使用 "Checkout submodules" 则默认)检出 git 子模块。使用图片中的选项它可以工作 - 但对于开发人员来说,如果他们正在使用存储库,则一直输入密码很烦人。
为此,我使用以下说明添加 ssh key. 我创建了一个 public 和一个私钥,并复制了 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 密钥将存储库克隆到我的本地计算机,我没有任何问题。但是如果我 运行 管道它会在子模块检出时崩溃:
Please make sure you have the correct access rights and the repository exists. fatal: clone of 'git@ssh.dev.azure.com:v3/repoLink' into submodule path '/home/vsts/work/1/s/app/submoduleFolder' failed Failed to clone 'app/submoduleFolder'. Retry scheduled Cloning into '/home/vsts/work/1/s/app/submoduleFolder'... Host key verification failed. fatal: Could not read from remote repository.
这是回购协议中的 .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验证。
解决方案是在一份工作中完成所有任务。不同 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"
另一种方法是将 .gitmodules
路径编辑为相对路径 url,例如 url = ../subModuleName
:
[submodule "app/subModuleName"]
path = app/subModuleName
url = ../subModuleName
branch = master
url 现在是相对于父仓库的 url。因此,当 ado 管道通过 https 克隆它时,它对子模块使用相同的方法。开发人员可以使用 https 或 ssh 克隆 repo,子模块将使用相同的 - 无需输入密码。