我添加了一个对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
答案 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