You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab Pipeline执行source引入sh脚本时提示函数未找到报错

根因分析

报错和GitLab CI的共享库能力无关,核心是两个实现层面的错误:

  • wget命令使用错误,未正确拉取目标脚本
    你写的wget https://x.x.x.x/branching.sh > .common/test.sh逻辑不成立:wget默认会将远程文件下载到当前工作目录,存为同名本地文件branching.sh,其标准输出打印的是下载进度、连接状态等运行日志,并非脚本源码。你通过重定向生成的.common/test.sh里全是wget的日志内容,根本不存在你定义的函数,source该文件自然不会加载到test_pipe。
  • 函数定义语法不兼容Alpine默认shell
    alpine/git镜像内置的是BusyBox提供的ash shell,不支持function test_pipe ()这种同时带function关键字和函数括号的混合写法,就算脚本下载正确,ash也无法识别该函数定义。
修复方案

完全保留你当前单作业、拉取外部脚本加载的实现逻辑,不需要改造为多项目Pipeline,按以下两点修改即可:

  • 修正CI配置里的wget命令,通过-O参数明确指定下载文件的保存路径,加-q参数关闭冗余日志输出,替换原wget行:
    wget -q https://x.x.x.x/branching.sh -O .common/test.sh && chmod +x .common/test.sh
    
  • 修改远程branching.sh的函数定义,去掉function关键字,适配ash语法:
    #!/bin/sh
    test_pipe () {
        app_version="1.0.0.0-SNAPSHOT"
    }
    

修复后的完整Pipeline配置参考:

image: alpine/git

stages:
  - test_branching

test_branch:
  stage: test_branching
  before_script:
    - mkdir -p .common
    - wget -q https://x.x.x.x/branching.sh -O .common/test.sh && chmod +x .common/test.sh
    - source .common/test.sh
    # 可选调试项:执行前校验函数是否正常加载
    - type test_pipe
  script:
    - test_pipe
    - echo "app version is ${app_version}"

补充说明:你当前采用的拉取远程公共脚本、source加载的方式,完全可以实现类似Jenkins共享库的公共逻辑复用效果,不需要依赖GitLab的多项目Pipeline能力。

内容的提问来源于stack exchange,提问作者fdpg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:36:23