gitlab-runner:在本地执行时添加ssh密钥

时间:2018-01-16 08:44:46

标签: git gitlab-ci gitlab-ci-runner

我试图通过ci执行程序在本地运行docker管道以进行调试,运行:

gitlab-runner exec docker <job_name>

在某个时间点,它需要克隆私人git回购。

我使用的是gitlab建议的典型recipe

variables:
    MY_PRIVATE_KEY: <my_private_key>

before_script:
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$MY_PRIVATE_KEY")
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

但是,在尝试将密钥添加到代理时:

$ ssh-add <(echo "$MY_PRIVATE_KEY")
Enter passphrase for /dev/fd/63: Running after script...
ERROR: Job failed: exit code 1
FATAL: exit code 1 

我很肯定我的钥匙上没有passphrase ......

3 个答案:

答案 0 :(得分:0)

您确定私钥内容设置正确吗?

尝试在echo $MY_PRIVATE_KEY

之前添加ssh-add

也;我建议通过Gitlab CI/CD secrets而不是.gitlab-ci.yml

注入

答案 1 :(得分:0)

我能够解决此问题,因为我的原因是因为私钥格式错误。

这是我的gitlab-ci.yml的样子:

variables:
  MY_PRIVATE_KEY: |
    -----BEGIN RSA PRIVATE KEY-----
    UYADFAIBAAKCAgEAtn4G7FlPz5IAqbxA0MTO8ip.........................
    yo9Gob/UXA3RFpbTMPItenz6r9D9dn..................................
    .................................
    -----END RSA PRIVATE KEY-----

before_script:
  - apt-get update -y
  - 'which ssh-agent || ( apt-get install openssh-client -y )'
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$MY_PRIVATE_KEY")

如果ssh-add <(echo "$MY_PRIVATE_KEY")无法正常工作,请将其替换为:

- echo -n "$MY_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null

对我来说,此替代方法正在起作用。

答案 2 :(得分:0)

我不太了解如何在本地调试 git ci。就我个人而言,我不需要它,如果它是关于 ssh 和密钥的,它没有多大帮助,因为密钥的处理方式不同。

注意两点:

  1. 不要将您的私钥存储在 gitlab 存储库中(作为文件)。不要把它放到ci脚本中。使用 gitlab 功能:掩码变量:https://docs.gitlab.com/ee/ci/variables
  2. 您可能会在存储私钥时遇到一些问题,因为 gitlab 对变量格式有某些限制。一种可行的解决方案是将密码设为 base64。查看此问题以了解相关信息:GITLAB CI Error loading key "/dev/fd/63": invalid format ERROR: Job failed: exit code 1

您的 .gitlab.yml 可能看起来像这样。根据您使用的映像,您必须安装 ssh-agent(before_script 部分的第一行)。

deploy:
  image: ubuntu:latest
  before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - mkdir -p ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
  script:
    - ssh -t user@host "remote command && other command on remote"

$SSH_PRIVATE_KEY 在此脚本中定义,而是作为掩码变量定义。见GitLab CI/CD environment variables