如何解决“远程:您不允许上传代码”。 GitLab CI/CD 作业出错?
Posted
技术标签:
【中文标题】如何解决“远程:您不允许上传代码”。 GitLab CI/CD 作业出错?【英文标题】:How to solve the "remote: You are not allowed to upload code." error on GitLab CI/CD job? 【发布时间】:2018-12-27 10:26:58 【问题描述】:我目前正在尝试使用 GitLab 运行 CI/CD 作业,该作业运行 Python 文件,该文件对特定存储库进行更改,然后提交并将这些更改推送到 master。我在存储库中也有 Master 的角色。似乎所有git
函数都运行良好,除了git push
导致fatal: You are not currently on a branch.
和使用git push origin HEAD:master --force
导致fatal: unable to access 'https://gitlab-ci-token:xxx@xxx/project.git/': The requested URL returned error: 403
。我一直在网上寻找解决方案,一个是this one,另一个是unprotecting,但还没有找到我想要的东西。这也是 GitLab 存储库中的一个子项目。
现在,这几乎就是我的.gitlab-ci.yml
的样子。
before_script:
- apt-get update -y
- apt-get install git -y
- apt-get install python -y
- apt-get python-pip -y
main:
script:
- git config --global user.email "xxx@xxx"
- git config --global user.name "xxx xxx"
- git config --global push.default simple
- python main.py
我的main.py
文件本质上具有在内部目录中创建新文件的功能,前提是该文件尚不存在。它的外观类似于以下内容:
import os
import json
def createFile(strings):
print ">>> Pushing to repo...";
if not os.path.exists('files'):
os.system('mkdir files');
for s in strings:
title = ("files/"+str(s['title'])+".json").encode('utf-8').strip();
with open(title, 'w') as filedata:
json.dump(s, filedata, indent=4);
os.system('git add files/');
os.system('git commit -m "Added a directory with a JSON file in it..."');
os.system('git push origin HEAD:master --force');
createFile(["title":"A", "title":"B"]);
我不完全确定为什么这种情况不断发生,但我什至尝试修改存储库设置以更改 protected
拉取和推送访问,但是当我点击保存时,它实际上并没有保存。尽管如此,这是我的整体输出。我非常感谢任何可以提供的指导。
Running with gitlab-runner 10.4.0 (00000000)
on cicd-shared-gitlab-runner (00000000)
Using Kubernetes namespace: cicd-shared-gitlab-runner
Using Kubernetes executor with image ubuntu:16.04 ...
Waiting for pod cicd-shared-gitlab-runner/runner-00000000-project-00000-concurrent-000000 to be running, status is Pending
Waiting for pod cicd-shared-gitlab-runner/runner-00000000-project-00000-concurrent-000000 to be running, status is Pending
Running on runner-00000000-project-00000-concurrent-000000 via cicd-shared-gitlab-runner-0000000000-00000...
Cloning repository...
Cloning into 'project'...
Checking out 00000000 as master...
Skipping Git submodules setup
$ apt-get update -y >& /dev/null
$ apt-get install git -y >& /dev/null
$ apt-get install python -y >& /dev/null
$ apt-get install python-pip -y >& /dev/null
$ git config --global user.email "xxx@xxx" >& /dev/null
$ git config --global user.name "xxx xxx" >& /dev/null
$ git config --global push.default simple >& /dev/null
$ python main.py
[detached HEAD 0000000] Added a directory with a JSON file in it...
2 files changed, 76 insertions(+)
create mode 100644 files/A.json
create mode 100644 files/B.json
remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxx@xxx/project.git/': The requested URL returned error: 403
HEAD detached from 000000
Changes not staged for commit:
modified: otherfiles/otherstuff.txt
no changes added to commit
remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxx@xxx/project.git/': The requested URL returned error: 403
>>> Pushing to repo...
Job succeeded
【问题讨论】:
remote: GitLab: You are not allowed to push code to protected branches on this project的可能重复 我面临同样的错误消息,它与上面提到的 SO 问题不同,它是从 Gitlab CI 管道中提出的,错误消息略有不同。提供的答案虽然很好,但无助于解决我的问题。如果有人有想法,请分享一下 【参考方案1】:这里有一个来自 Gitlab 的资源,描述了如何在 CI 管道中提交到存储库:https://gitlab.com/guided-explorations/gitlab-ci-yml-tips-tricks-and-hacks/commit-to-repos-during-ci/commit-to-repos-during-ci
尝试配置您的 gitlab-ci.yml 文件以推送更改,而不是尝试从 python 文件中进行。
【讨论】:
【参考方案2】:我设法通过 ssh 在跑步者上做到这一点,确保添加了 ssh 密钥,然后使用完整的 git url:
task_name:
stage: some_stage
script:
- ssh-add -K ~/.ssh/[ssh key]
- git push -o ci-skip git@gitlab.com:[path to repo].git HEAD:[branch name]
如果是同一个repo触发了job,url也可以写成:
git@$CI_SERVER_HOST:$CI_PROJECT_PATH.git
【讨论】:
你能解释一下你是如何把 SSH 密钥放到 CI 运行器上的吗?您是否必须通过存储库 CI 参数或其他方式预安装 ssh 密钥文件? 我手动将 ssh 私钥添加到构建代理中。不过,您也许可以将其添加为运行器文件变量。但我不能谈论这里的安全风险。【参考方案3】:The requested URL returned error: 403
Control Panel => User Accounts => Manage your credentials => Windows Credentials
它对我有用。但是我不太确定它是否对你有用。
【讨论】:
【参考方案4】:此方法可用于提交标签或文件。您可能还希望考虑使用 CI CD 如果不必将其提交到存储库,则用于存储交叉构建持久数据的可变 API https://docs.gitlab.com/ee/api/project_level_variables.html https://docs.gitlab.com/ee/api/group_level_variables.html
下面的 ACCESS_TOKEN 是 repo 或上行组级别的变量,其中包含一个令牌 可以写入目标仓库。由于维护者可以看到这些,因此最好的做法是 为特殊的 API 用户创建令牌,这些用户在他们需要做的事情上拥有最少的特权。
write_to_another_repo:
before_script:
- git config --global user.name "$GITLAB_USER_NAME"
- git config --global user.email "$GITLAB_USER_EMAIL"
script:
- |
echo "This CI job demonstrates writing files and tags back to a different repository than this .gitlab-ci.yml is stored in."
OTHERREPOPATH="guided-explorations/gitlab-ci-yml-tips-tricks-and-hacks/commit-to-repos-during-ci/pushed-to-from-another-repo-ci.git"
git clone https://gitlab-ci-token:$CI_JOB_TOKEN@$CI_SERVER_HOST/$OTHERREPOPATH
cd pushed-to-from-another-repo-ci
CURRENTDATE="$(date)"
echo "$CURRENTDATE added a line" | tee -a timelog.log
git status
git add timelog.log
# "[ci skip]" and "-o ci-skip" prevent a CI trigger loop
git commit -m "[ci skip] updated timelog.log at $CURRENTDATE"
git push -o ci-skip http://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$OTHERREPOPATH HEAD:master
#Tag commit (can be used without commiting files)
git tag "v$(date +%s)"
git tag
git push --tags http://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$OTHERREPOPATH HEAD:master
【讨论】:
以上是关于如何解决“远程:您不允许上传代码”。 GitLab CI/CD 作业出错?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 gitlab CI 解决 Angular 业力测试的 chrome 错误?