如何配置gitlab-ci.yml从本地机器拉取文件至GitLab仓库?
GitLab CI 每日同步本地CSV到仓库实现方案
先明确核心前提:GitLab CI任务运行在绑定的Runner节点上,默认无法直接访问你本地机器的文件,最省事的连通方案是直接把GitLab Runner安装在存CSV的本地机器上,不用额外开端口、做内网穿透,稳定性最高。
前置准备
- 给本地机器安装GitLab Runner,注册到目标GitLab项目,给Runner打个自定义tag比如
local-csv-machine,方便后续任务指定调度到这台机器 - 生成GitLab项目访问令牌:在项目「设置->访问令牌」里新建令牌,勾选
write_repository权限,把生成的令牌值存到项目「设置->CI/CD->变量」里,变量名设为GIT_PUSH_TOKEN,勾选「隐藏变量」「保护变量」,不要硬编码到配置文件里 - 确认本地CSV文件的固定存放路径,比如
/opt/daily_data/*.csv,确保每日更新的文件都覆盖到这个固定路径下,不要随意改目录结构
.gitlab-ci.yml 配置代码
把下面的配置文件放到仓库根目录,记得替换里面的本地CSV路径为你自己的实际路径:
stages: - sync daily_csv_sync_job: stage: sync tags: - local-csv-machine # 匹配你给本地Runner打的tag,保证任务跑在存CSV的机器上 only: - schedules # 只允许定时触发,避免代码提交时误跑 script: # 配置git提交身份 - git config --global user.name "CI Auto Sync Bot" - git config --global user.email "ci-bot@noreply.gitlab.internal" # 拉取仓库最新代码,避免提交冲突 - git checkout $CI_DEFAULT_BRANCH - git pull origin $CI_DEFAULT_BRANCH # 初始化仓库内的CSV存放目录 - mkdir -p ./repository_csv # 拷贝本地最新CSV到仓库工作目录 - cp -f /your/local/real/csv/path/*.csv ./repository_csv/ # 检查文件是否有变动,无变动直接退出,不生成空提交 - | if [ -z "$(git status --porcelain ./repository_csv)" ]; then echo "今日CSV无内容更新,跳过提交" exit 0 fi # 提交变更并推送到仓库 - git add ./repository_csv/*.csv - git commit -m "auto sync: daily csv update $(date +'%Y-%m-%d')" - git push https://oauth2:${GIT_PUSH_TOKEN}@${CI_REPOSITORY_URL#*@} $CI_DEFAULT_BRANCH
配套操作说明
- 配置定时触发:进入项目「CI/CD->计划」新建流水线计划,设置执行时间为本地CSV每日更新完成后的15-30分钟(比如本地CSV凌晨2点生成完毕,就设为2:30执行),避免拉到写入一半的损坏文件,执行分支选仓库默认分支即可。
- 如果你没法在本地机器装Runner,就把配置里的
cp拷贝命令替换成对应的文件拉取逻辑:比如提前给Runner开通本地机器的SFTP/RSYNC/SMB访问权限,在脚本里先把文件从本地机器拉到Runner工作目录,后续逻辑不变。 - 如果单个CSV文件大小超过100M,提前给仓库配置Git LFS追踪csv格式,避免仓库体积快速膨胀影响拉取推送速度。
常见坑点
- 不要用GitLab共享公共Runner跑这个任务,公共Runner不在你的本地网络里,根本访问不到本地文件,百分百执行失败。
- 如果推送时提示冲突,可以把
git pull那行改成git pull -X theirs origin $CI_DEFAULT_BRANCH,强制以本地最新的CSV内容为准,避免手动处理冲突。 - Runner运行时默认用
gitlab-runner用户执行命令,记得给这个用户开本地CSV目录的读权限,不然会报文件找不到、权限不足的错误。
内容的提问来源于stack exchange,提问作者safae azouzou
相关产品推荐
相关产品推荐

