如何解决“远程:您不允许上传代码”。 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

HTTP 403 Forbidden客户端错误状态响应码表示服务器理解请求但拒绝授权。 问题是我们无法为 git 提供有效的身份验证,因此我们的请求被禁止。 试试这个: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 错误?

如何在GitLab注释中添加待办事项以增加待办事项数量?

如何排除 gitlab-ci.yml 更改触发作业

gitlab中fork库和主库存在代码冲突时如何解决

如何在 Gitlab Omnibus 服务器旁边为其他虚拟主机提供服务? [完整的逐步解决方案]

gitlab宕机无法再次重启解决办法