使用 curl 从 GitLab 覆盖文件

Posted

技术标签:

【中文标题】使用 curl 从 GitLab 覆盖文件【英文标题】:Overwriting a file from GitLab using curl 【发布时间】:2022-01-11 16:16:09 【问题描述】:

我需要使用 curl 用新内容覆盖 GitLab 文件。 GET 请求按预期工作,但我对替换文件内容的 PUT 请求有问题。

以下链接在浏览器中成功返回文件内容:

https://<GITLAB-URL>/api/v4/projects/<PROJECT-ID>/repository/files/<FILENAME>/raw/?ref\=master

这是无法将 FILE-CONTENT.txt 的内容复制到 TARGET-FILE.txt 的 curl 请求。它返回一个HTTP/1.1 400 Bad Request 错误消息。

curl -v --request PUT --header "PRIVATE-TOKEN:<READ-WRITE-API-TOKEN>" -F "branch=master" -F "author_email=email" -F "author_name=me" -F "content=</PATH/FILE-CONTENT.txt>" -F "commit_message=TEST" " https://<GITLAB-URL>/api/v4/projects/<PROJECT-ID>/repository/files/<TARGET-FILE.txt>/raw/?ref\=master"

请告知正确的方法和语法。

【问题讨论】:

【参考方案1】:

只是为了确保我正确理解您的问题: 您是否尝试通过在自动管道中使用 curl 来修改存储库中的文件?

如果是这样,我认为这不是故意的。如果要复制在自动管道中生成的文件的内容,请在CI 文件中将其标记为artifact。然后可以通过 curl 访问该工件。

如果您只想在脚本中修改文件,我不明白您为什么不使用读写访问令牌使用git commit + git push

编辑: 首先,将内容复制到 pipeline-job 中的目标文件,并通过修改您的 .gitlab-ci.yml 文件将其公开为工件:

job_name:
  script:
      - # Process that creates FILE-CONTENT.txt
      - cp <path-to>/FILE-CONTENT.txt /TARGET.txt      
  artifacts:
    paths:
      - /TARGET.txt

然后使用 curl 和作业 API,如 here 和 here 所述。要检查工件是否已正确创建,您还可以导航到 Web UI 的 CI/CD 功能区中的作业,应该有一个按钮来下载和浏览工件。

【讨论】:

乔纳森,这是正确的,我正在尝试使用 curl 从我的 GitLab 存储库中修改我的文件。请澄清你的第二段,因为我不明白。你的意思是我的要求是不可能的吗?另外,仅供参考,我试图弄清楚的 curl 请求将从 AWS 中的 Lambda 函数运行,并且我试图避免使用 git 命令。感谢您的反馈。 嗨,Alex,我在第二个问题中试图暗示的概念问题如下:如果管道是由推送事件触发的,那么作业中的另一个推送事件基本上会递归地触发管道。因此,不建议从管道中更改版本控制文件 第三段是关于 git 版本控制的基本概念。如果您更改属于存储库的文件,则应始终通过 git 将更改应用于远程服务器,因为它们应由 git 捕获。所以我认为可能无法通过服务器端的 curl 更改跟踪的文件。如果您可以指定要更改的文件的用途,也许我可以更多地说明我将如何做到这一点(例如,它是一个文档)。干杯 乔纳森,这个文件 (FILE-CONTENT.txt) 包含一个令牌,该令牌将每 24 小时更新一次,需要复制到 TARGET.txt 中。 我假设这个令牌随后被另一个脚本通过例如下载。卷曲?这听起来很像 TARGET.txt 应该作为管道工件公开。可以通过 web-UI 和 curl 访问工件。如果这听起来合理,我将使用相应的源代码和示例代码设置答案。

以上是关于使用 curl 从 GitLab 覆盖文件的主要内容,如果未能解决你的问题,请参考以下文章

curl命令

gitlab增量代码覆盖率

Gitlab覆盖解析有负百分比

GitLab 中 Flutter 的代码覆盖率始终未知

TortoiseSVN 图标覆盖更新到 Windows 10 后不显示

gitlab中的覆盖徽章未知