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
相关产品推荐
相关产品推荐

