GitLab Runner:本地执行时添加SSH密钥。

5

我想要通过docker执行器在本地运行一条ci流程进行调试,命令如下:

gitlab-runner exec docker <job_name>

在某个时间点,需要克隆一个私有的 git 仓库。

我正在使用 gitlab 建议的典型 配方

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)


我有相同的问题,更高效的方式可能是本地构建和测试,但是我发现这个有用的链接关于在本地运行作业和流水线,但是这还不可用,也许在不久的将来,但希望尽快实现。https://gitlab.com/gitlab-org/gitlab-runner/issues/2797 - Shift 'n Tab
3个回答

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环境变量


-1

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

ssh-add之前尝试添加echo $MY_PRIVATE_KEY

此外,我建议通过Gitlab CI/CD secrets注入它,而不是在.gitlab-ci.yml中注入。


1
我想要一个在本地运行它的解决方案,通过 gitlab-runner exec docker my_job_name - pkaramol
我看到你在原帖中链接的食谱页面与现在有一些不同,你尝试按照他们的方式实现过吗? - Stefan van Gastel
奇怪的是,在gitlab-runner(即远程机器)上它可以正常运行;但当我在本地命令提示符中输入上述命令时,它就无法执行... - pkaramol
我的用户(pkaramol)...变量MY_PRIVATE_KEY包含了我的RSA私钥。 - pkaramol
你可以尝试使用 sudo,这可能是权限问题。 - Stefan van Gastel

-2

我成功解决了这个问题,我的情况是由于私钥格式错误导致的。

这是我的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

对我来说,这个解决方法是有效的。


永远不要将私钥放入ci脚本中。使用GitLab变量并掩盖它们:https://docs.gitlab.com/ee/ci/variables/ - stackovermat
@stackovermat,你说得对,我们已经在使用变量了。显式声明MY_PRIVATE_KEY只是为了强调错误的格式以便澄清。 - Shift 'n Tab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接