shell gitlab-ci.yml:意外标记'fi'附近出现语法错误

3xiyfsfu  于 2023-02-09  发布在  Shell
关注(0)|答案(3)|浏览(678)

我正在Gitlab项目中实现Auto Build,为此我使用.gitlab-ci.yml文件,其中包含多行YAML块,包含shell命令,代码如下:

if [ "${GITLAB_USER_LOGIN}" != "nadirabbas" ]
    then
        echo "Building"
        if [ ! -d "dist" ]; then mkdir dist; fi
        if [ ! -f "dist/index.html" ]; then touch dist/index.html; fi
fi

我尝试了许多解决方案,例如在if语句后以及在fi关键字后放置;,但似乎都不起作用。我的作业日志返回以下语法错误:

syntax error near unexpected token `fi'

我试过谷歌一下,但是其他的解决方案似乎不起作用,我的跑步者使用的 shell 是bash

suzh9iv8

suzh9iv81#

正如我在注解中提到的,最简单的方法可能是将脚本放在自己的文件中(确保它是可执行的!),然后从gitlabci调用它。
例如,您可以有一个build.sh文件:

#!/bin/bash
if [ "${GITLAB_USER_LOGIN}" != "nadirabbas" ]
    then
        echo "Building"
        if [ ! -d "dist" ]; then mkdir dist; fi
        if [ ! -f "dist/index.html" ]; then touch dist/index.html; fi
fi

然后从yml调用它:

some_task:
  image: ubuntu:18.04
  script:
  - ./build.sh
gstyhher

gstyhher2#

对我来说,使用- |(注意-|之间的空间)语法适用于多行bash脚本:

script:
  - |
    if [ "${GITLAB_USER_LOGIN}" != "nadirabbas" ]
      then
        echo "Building"
        if [ ! -d "dist" ]; then mkdir dist; fi
        if [ ! -f "dist/index.html" ]; then touch dist/index.html; fi
    fi

注意脚本的行必须以相同的缩进级别开始。
另请参阅GitLab官方文档

fbcarpbf

fbcarpbf3#

问题是,.gitlab-ci.yml并不真正允许多行脚本(这更多的是YAML的限制,而不是gitlab的限制)。
因此,如果您不想使用脚本(如@Mureinik所建议的),可以将所有内容折叠为一行:

script:
  - if [ "${GITLAB_USER_LOGIN}" != "nadirabbas" ]; then echo "Building"; mkdir -p dist; touch -a dist/index.html; fi

(我也去掉了内部的if-条件;因为您可以使用mkdirtouch的标志来获得大致相同的行为)

相关问题