GITLAB CI错误加载密钥“/dev/fd/63”:格式无效错误:作业失败:退出代码1

Posted

技术标签:

【中文标题】GITLAB CI错误加载密钥“/dev/fd/63”:格式无效错误:作业失败:退出代码1【英文标题】:GITLAB CI Error loading key "/dev/fd/63": invalid format ERROR: Job failed: exit code 1 【发布时间】:2019-08-08 22:54:40 【问题描述】:

这是我的代码 giltlab-ci.yml :

 before_script:
  ##
  ## Install ssh-agent if not already installed, it is required by Docker.
  ## (change apt-get to yum if you use an RPM-based image)
  ##
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

  ##
  ## Run ssh-agent (inside the build environment)
  ##
  - eval $(ssh-agent -s)
  ##
  ## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
  ## We're using tr to fix line endings which makes ed25519 keys work
  ## without extra base64 encoding.
  ## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556
  ##
  - mkdir -p ~/.ssh
  #- echo -n "$PROJECT_SSH_KEY" | ssh-add - >/dev/null
  - echo "$PROJECT_SSH_KEY"
  - ssh-add <(echo "$PROJECT_SSH_KEY")
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
      ##
  ## Create the SSH directory and give it the right permissions
  ##
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh

  ##
  ## Optionally, if you will be using any Git commands, set the user name and
  ## and email.
  ##
  #- git config --global user.email "user@example.com"
  #- git config --global user.name "User name"

我把这个拿出来

使用 gitlab-runner 11.8.0 (4745a6f3) 运行 在 Allence-Tunisie-docker-runner sH47eTgb 使用带有镜像 ntfactory/ci-tool:0.0.2 的 Docker 执行器 ... 正在拉取 docker 镜像 ntfactory/ci-tool:0.0.2 ... 使用泊坞窗图像 sha256:7fe7b170806f6846271eec23b41c4f79202777f62c0d7a32165dc41722900979 对于 ntfactory/ci-tool:0.0.2 ... 通过 a732493b4b94 在 runner-sH47eTgb-project-11060727-concurrent-0 上运行... 克隆存储库... 克隆到“/builds/allence-tunisie/e-formation”... 将 0a6b48ef 签出为 feat/gitlab-ci... 跳过 Git 子模块设置 正在检查默认缓存... 未提供 URL,不会从共享缓存服务器下载缓存。相反,将提取本地版本的缓存。 成功提取缓存 $ 哪个 ssh 代理 || ( apt-get update -y && apt-get install openssh-client -y ) /usr/bin/ssh-agent $ eval $(ssh-agent -s) 代理 pid 12 $ mkdir -p ~/.ssh $ echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null 加载键“(stdin)”时出错:格式无效 错误:作业失败:退出代码 1

即使我尝试过 - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-添加 - > /dev/null 我得到这个错误

加载键“(stdin)”时出错:格式无效

【问题讨论】:

你能解决这个错误吗? 是的,实际上问题出在 ssh 密钥上 【参考方案1】:

当$SSH_PRIVATE_KEY中的私钥格式错误时会发生此错误,如果您在其中添加一些随机字符,您可以轻松地在本地测试它。特别是,当您将私钥复制并粘贴到在线表单中的 SSH_PRIVATE_KEY 变量中时,就会在 Travis-CI 上发生这种情况。它与 -----BEGIN RSA PRIVATE KEY-----, -----END RSA PRIVATE KEY----- 块之后和之前的换行符有关。为此,我使用 base64 编码来确保密钥格式正确。

试试这个:

对您的 RSA 私钥进行编码

cat my_private_key | base64 -w0

将 base64 字符串添加到您的项目变量中。

在你的 .gitlab-ci.yml 中使用它

ssh-add

https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_15038961

【讨论】:

你从gitlab.com/gitlab-examples/ssh-private-key/issues/…这里复制了答案吗???如果是这样,您应该添加源... gitlab.com/gitlab-examples/ssh-private-key/-/issues/… 这对我有用。【参考方案2】:

如果你已经保护了变量,那么你需要一个受保护的分支。正如变量设置中提到的那样 - “它们可以通过仅将它们暴露于受保护的分支或标签来保护。”

【讨论】:

你拯救了我的一天 :) 在我的情况下,我不小心从 main.js 创建了不受保护的标签。这失败了,因为我的变量受到保护。为了解决这个问题,我进入了设置 -> 存储库 -> 受保护的标签。 滚动过去但它为我解决了它!要检查是否发生这种情况,您还可以做一个简单的wc -c 检查,如果变量不可访问,它将显示长度 0。 这有很大帮助,甚至超过了公认的答案,tnx :)【参考方案3】:

您必须生成 RSA 密钥而不是 OPENSSH 密钥。使用参数 "-m PEM" (ssh-keygen -m PEM) 生成 RSA 密钥将以 -----BEGIN RSA PRIVATE KEY----- 开头并以 -----END RSA PRIVATE KEY-- 结尾---

【讨论】:

不,那不是真的。【参考方案4】:

正如 GitLab 的错误跟踪器上的 this thread 中所述,将回车符 (\r) 添加到变量(也称为“秘密”)时可能会出现问题。这可以通过管道到tr -d "\r" 来解决,以删除这些字符,保持 SSH 密钥的格式正确。

您的 CI 中的一个示例是:

ssh-add <(echo "$SSH_priv_key_b64" | base64 --decode | tr -d "\r")

请注意,要使用具有“屏蔽”和“保护”属性的 SSH 密钥,必须使用 base 64 编码。

【讨论】:

【参考方案5】:

对我来说,我保护了分支和标签,然后我终于做到了,没有任何错误。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于GITLAB CI错误加载密钥“/dev/fd/63”:格式无效错误:作业失败:退出代码1的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gitlab CI for android 中管理签名密钥库

GitLab Runner CI 管道内的 SSH 连接无法验证主机密钥

Gitlab 自动部署已停止工作,服务器日志中出现“找不到匹配的主机密钥类型”错误

GitLab CI/CD 脚本改进

如何在 Gitlab 中基于管道变量运行作业?

从资源中读取文件在 gitlab CI 中不起作用