gitlab-ci.yml:意外令牌“ fi”附近的语法错误

时间:2019-07-01 06:34:43

标签: bash shell continuous-integration gitlab continuous-deployment

我正在Gitlab项目中实现自动构建。为此,我将gitlab-ci.yml文件与包含shell命令的多行YAML块一起使用,代码如下:

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'

我尝试了很多谷歌搜索,但是其他解决方案似乎不起作用。我的跑步者正在使用的外壳是bash。拜托,有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

正如我在评论中指出的那样,最简单的方法可能是将脚本保存在自己的文件中(确保其可执行!),然后从gitlab ci调用它。

例如,您可以拥有一个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

答案 1 :(得分:0)

问题是gitlab-ci.yml确实不允许多行脚本(这对gitlab的限制是对YAML的限制)。

因此,如果您不想使用脚本(如@Mureinik所建议),则可以将所有内容折叠为一行:

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

(我还删除了内部的if条件;因为您可以对mkdirtouch使用标志来获得大致相同的行为)