GitLab CI中./deploy.sh执行失败:文件未找到问题求助
解决GitLab CI中运行bash脚本提示“./deploy.sh: not found”的问题
别担心,这个问题和GitLab CI本身支持不支持bash没关系——核心问题出在你用的docker:latest镜像上,我来一步步帮你搞定:
问题根源
你使用的docker:latest镜像基于Alpine Linux,这个发行版默认有两个关键特点:
- 自带的默认shell是
sh,并没有预装bash - 如果你的
deploy.sh开头写了#!/bin/bash的shebang,直接执行时系统找不到bash,就会抛出“not found”的错误(有时候脚本权限不足也会触发类似提示,这个我们后面也会处理)
解决方案
这里给你几个可行的方案,你可以根据自己的情况选择:
方案1:在CI环境中安装bash
既然镜像没装bash,那我们就在CI的初始化步骤里装上它,Alpine用apk包管理器很方便:
image: docker:latest variables: IMAGE_NAME: registry.gitlab.com/$PROJECT_OWNER/$PROJECT_NAME DOCKER_DRIVER: overlay services: - docker:dind stages: - deploy before_script: - apk add --no-cache bash # 新增:安装bash - chmod +x ./deploy.sh # 新增:给脚本加可执行权限,避免权限问题 - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com - docker pull $IMAGE_NAME:$CI_BUILD_REF_NAME deploy: stage: deploy script: - bash ./deploy.sh # 用bash明确执行脚本
方案2:修改脚本适配默认的sh
如果你的deploy.sh没有用到bash独有的语法(比如数组的特殊写法、[[ ]]判断等),可以直接修改脚本开头的shebang:
把脚本第一行的#!/bin/bash改成#!/bin/sh,这样用镜像自带的sh就能直接执行,不需要额外安装bash,更轻量化。
方案3:先确认脚本是否存在
有时候错误提示“not found”可能是脚本路径不对,你可以在before_script里加一行ls -la,看看当前工作目录下有没有deploy.sh:
before_script: - ls -la # 查看当前目录文件,确认脚本存在 - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com - docker pull $IMAGE_NAME:$CI_BUILD_REF_NAME
额外提示
记得在本地也给deploy.sh加上可执行权限(chmod +x deploy.sh),然后提交到Git仓库,这样CI拉取代码后脚本本身就有权限执行,避免不必要的问题。
内容的提问来源于stack exchange,提问作者redwolfgang20
相关产品推荐
相关产品推荐

