使用 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 覆盖文件的主要内容,如果未能解决你的问题,请参考以下文章