如何使用gitlab-ci作业将代码推送到gitlab仓库?

24

我刚开始使用GitLab CI/CD作业,但是我正在尝试设置一个Python脚本,当推送到GitLab时触发CI/CD作业运行,并调用一个内部函数,条件满足时再次推送到GitLab。举个例子,假设我有以下内容:

def hasFileInDirectory():
    # checks if the current directory has at least 1 other file in it
    if (1 or more files exist):
        print 'Great! You have enough files!';
    else:
        print 'Oh no! You need more files! Let me create one!';
        createFile('missingFile'+str(random.randint(0,1000000)+'.txt');
        os.system('git add -A');
        os.system('git commit -m "Automatically added new file..."');
        os.system('git push origin HEAD:master --force');

如果我从命令行自己运行这个函数,它似乎可以完美地运行,但是在GitLab CI/CD工作中似乎无法运行。我得到的输出是:

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxx@gitlab.com/path_to/my_repository.git/': The requested URL returned error: 403

当我调用git push时出现此错误,我想知道我该怎么做才能修复这个问题。我真的很感激任何帮助!


可能是重复的问题:无法从gitlab-ci.yml推送 - Clive Makamara
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
21
一个GitLab CI runner目前无法推送到仓库:这里有一个正在进行的提案。 同时,您可以使用SSH URL,具体操作如下:
  • 在GitLab的Settings > CI/CD Pipelines网络界面中,将SSH私钥定义为秘密变量
  • 将SSH密钥的公共部分存储为部署密钥,存储在同一网络界面的Settings > Repository > Deploy Keys部分。
或者,如在此提到,您可以在个人资料的设置中使用“个人访问令牌”。

我创建了一个具有api范围的令牌,并在我的管道中进行了配置。
在gitlab控制台中打开项目,转到Settings > CI/CD > Secret variables,在值中创建一个变量(在个人资料中生成密钥)。
我用我的变量“$ {VAR01}”替换“$ {CI_JOB_TOKEN}”。

使用一个gitlab-ci.yml。
script:
   - url_host=`git remote get-url origin | sed -e "s/https:\/\/gitlab-ci-token:.*@//g"`
   - git remote set-url origin "https://gitlab-ci-token:${CI_TAG_UPLOAD_TOKEN}@${url_host}"

CI_TAG_UPLOAD_TOKEN 是一个秘密变量。


1
两种解决方案都有缺点。 "ssh url" 无法在某些只允许 http 访问的环境中使用。而“个人访问令牌”是私人的 - 当 CI 作业想要更改存储库中的内容时,应该不是从某个预定义的用户帐户中进行,而是从启动作业的用户帐户中进行。 - Ezh
@Ezh 所以使用部署令牌(https://docs.gitlab.com/ce/user/project/deploy_tokens/)而不是用户令牌?那应该可以工作,并符合您的标准。 - VonC
1
@VonC 部署令牌不能用于向存储库写入内容。您可以使用它们来读取存储库或者读/写注册表。 - Martin Žid
@MartinŽid 好的,那就没有部署令牌了。 - VonC

2
我们最终使用的命令是:
git tag my-new-tag
git push --repo=git@YOUR_REPO_URL:YOUR_GROUP/YOUR_PROJECT.git --tags

默认情况下,我们得到:

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@YOUR_REPO_URL:YOUR_FORK/YOUR_PROJECT.git/': The requested URL returned error: 403`
原因是CI runner使用不支持推送的令牌通过HTTPS协议执行git命令,如@VonC所述。 我们已经配置了我们的runner以共享一个卷到/root/.ssh目录。因此,使用git协议和正确的ssh配置,我们能够使用Gitlab CI runner推送git命令。

编辑

gitlab runner的执行方式如下(我删除了无用的参数以清晰明了为目的)。
docker exec -it gitlab-runner.service gitlab-runner register \
  --non-interactive \
  --name `hostname` \
  --url "some-gitlab-url" \
  ...
  --executor "docker" \
  --limit "1" \
  --docker-image "debian" \
  --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
  --docker-volumes "/fs1/runner/builds:/builds" \
  --docker-volumes "/fs1/runner/cache:/cache" \
  --docker-volumes "/fs1/runner/profile:/root" \
所以/root目录在我们所有的运行器之间是共享的。因此,一旦正确配置了/root/.ssh/的适当密钥,并且这些密钥具有对gitlab进行push操作的权限,它将按照上述描述的方式工作。

请问您能详细说明一下“配置我们的runner以共享卷到/root/.ssh目录”这部分吗?这是在“.gitlab-ci.yml”文件中吗? - Anas Tiour
我编辑了我的回复,以便提供更多细节。希望这可以帮助。 - jtheoof
@jtheoof,您是在说/root已经跨越运行程序挂载了吗?还是您必须更改docker exec的启动方式(如果是这样,那么如何更改)?问题在于使用gitlab-machines时,当启动管道时,实际上会根据需要生成运行程序,那么我该如何配置/root/.ssh呢? - Frak
顺便说一句,尽管我的令牌拥有所有可能的权限,但我确实收到了“403”错误代码。 没有绝对的解决方法可以通过https推送吗? - im_infamous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,