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

如何在默认shell为sh的GitLab CI镜像中使用bash

在GitLab CI中用Bash替代默认Shell的正确配置方法

问题描述

需要在GitLab CI的.gitlab-ci.yml配置中使用Bash替代默认的sh,尝试两种方式均失败:

  1. 在script开头添加#!/bin/bash无效
  2. 使用bash -c包裹脚本时,出现语法错误:
$ bash -c ' # collapsed multi-line command
link_type:: -c: line 8: syntax error: unexpected end of file

解决方案

方案1:直接指定Job的Shell为Bash(推荐)

GitLab CI支持为单个Job或全局配置指定执行Shell,这是最简洁可靠的方式,无需嵌套命令或处理引号问题。

配置示例:

release:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli
  before_script:
    - apk add --no-cache curl git bash
  # 为当前Job指定使用bash作为执行Shell
  shell: /bin/bash
  script: |
    asset_args=()
    for file in $(git ls-files --others --exclude-standard); do
      filename=$(basename "$file")
      url="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/project/${CI_COMMIT_TAG}/$filename"
      curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "$file" "$url"
      asset_info='{"name":"'"$filename"'","url":"'"$url"'", "link_type": "package"}'
      asset_args+=(--assets-link "$asset_info")
    done

    release-cli create \
        --tag-name "$CI_COMMIT_TAG" \
        --description "$(cat CHANGELOG.md)" \
        "${asset_args[@]}"

说明:

  • 通过shell: /bin/bash直接指定该Job使用bash执行脚本
  • script中的代码可直接使用bash语法(如数组操作),无需额外处理

方案2:修复bash -c的引号问题(仅作参考)

之前的错误源于单引号嵌套使用导致语法断裂:在bash -c的单引号包裹内容中,asset_info='{...}'里的单引号提前闭合了外层的单引号。

正确写法需处理引号转义,示例如下:

release:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli
  before_script:
    - apk add --no-cache curl git bash
  script: |
    bash -c "
    asset_args=()
    for file in \$(git ls-files --others --exclude-standard); do
        filename=\$(basename \"\$file\")
        url=\"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/project/${CI_COMMIT_TAG}/\$filename\"
        curl --header \"JOB-TOKEN: ${CI_JOB_TOKEN}\" --upload-file \"\$file\" \"\$url\"
        asset_info='{\"name\":\"'\$filename'\",\"url\":\"'\$url'\", \"link_type\": \"package\"}'
        asset_args+=(--assets-link \"\$asset_info\")
    done

    release-cli create \\
        --tag-name \"${CI_COMMIT_TAG}\" \\
        --description \"\$(cat CHANGELOG.md)\" \\
        \"\${asset_args[@]}\"
    "

说明:

  • 外层改用双引号包裹bash -c的内容,内部需要被bash解析的变量需加转义符\(避免被GitLab CI提前解析)
  • 字符串中的双引号需转义为\"
  • 该方式易出错,仅在无法指定Job Shell时使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:42:11