GitLab CI拒绝使用具有写入访问权限的部署密钥进行推送访问

时间:2019-03-18 15:06:13

标签: ssh continuous-integration gitlab yaml gitlab-ci-runner

我添加了一个对GitLab存储库具有写访问权限的部署密钥。我的.gitlab-ci.yml文件包含:

- git clone git@gitlab.domain:user/repo.git
- git checkout master
- git add myfile.pdf
- git commit -m "Generated PDF file"
- git push origin master

克隆存储库时,部署密钥有效。 即使部署密钥具有写访问权,也无法进行推送。

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@domain/user/repo.git/': The requested URL returned error: 403

1 个答案:

答案 0 :(得分:1)

我刚刚遇到了同样的问题,看到了这个问题却没有答案,所以有我的解决方案。

问题

该问题是由于git用于推送代码的远程URL的形式为http(s)://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@git.mydomain.com/group/project.git引起的。 该网址使用的是http(s)协议,因此git不会使用您设置的ssh部署密钥。

解决方案

解决方案是更改远程origin的推送URL,使其与ssh://git@git.mydomain.com/group/project.git匹配。 最简单的方法是使用predefined variable CI_REPOSITORY_URL

以下是使用sed进行编码的示例:

# Change url from http(s) to ssh
url_host=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@|ssh://git@|g')
echo "${url_host}"
# ssh://git@git.mydomain.com/group/project.git

# Set the origin push url to the new one
git remote set-url --push origin "${url_host}"

此外,使用docker executor的用户可能希望按照verify the SSH host key上gitlab文档的建议进行deploy keys for docker executor

因此,我给出了一个更完整的示例适用于docker executor 。 该代码主要来自ssh deploy keys上的gitlab文档。 在此示例中,私有部署密钥存储在名为SSH_PRIVATE_KEY的变量中。

create:push:pdf:
  before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "${SSH_PRIVATE_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - git config --global user.email "email@example.com"
    - git config --global user.name "User name"
    - gitlab_hostname=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@||g' | sed -e 's|/.*||g')
    - ssh-keyscan "${gitlab_hostname}" >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
  script:
    - git checkout master
    - git add myfile.pdf
    - git commit -m "Generated PDF file"
    - url_host=$(echo "${CI_REPOSITORY_URL}" | sed -e 's|https\?://gitlab-ci-token:.*@|ssh://git@|g')
    - git remote set-url --push origin "${url_host}"
    - git push origin master