使用 find 命令在 gitlab-ci 中设置环境变量

Using find command to set env vars in gitlab-ci

我正在尝试使用 linux 中的 find 命令来检测某些文件类型是否存在于我的 .gitlab-ci.yml 的当前目录中,方法如下:

---
stages:
  - "discover"

file types:
  image: "alpine:latest"
  stage: "discover"
  script:
    - "set +e" # so the job won't fail when the exit code is not 0
    - "find -name '*.py' -exec ls '{}' + | grep ."
    - "echo \"PY=$?\" >> build.env"
    - "find -name '*.yml' -exec ls '{}' + | grep ."
    - "echo \"YML=$?\" >> build.env"
    - "find -name '*.yaml' -exec ls '{}' + | grep ."
    - "echo \"YAML=$?\" >> build.env"
    - "cat build.env" # returns: PY=0, YML=0, YAML=0
  artifacts:
    reports:
      dotenv: "build.env"

然而,在return的管道里面做cat build.env,我实际上得到:

cat build.env
PY=0
YML=0
YAML=0

然而,我实际上没有任何 .yaml 文件,我总是使用 .yml,所以这应该 return YAML=1。 如果我自己执行 linux 中的命令,而不是 CI 中的命令,它会按预期工作:

cat build.env
PY=0
YML=0
YAML=1

我猜 gitlab 管道内部某处发生了一些事情,但对我来说,这看起来应该可行。

感谢任何帮助。

在同一行做就好了。

- find -name '*.py' | grep . ; echo PY=$? >> build.env
- find -name '*.yml' | grep . ; echo YML=$? >> build.env
- find -name '*.yaml' | grep . ; echo YAML=$? >> build.env

我想我会这样做:

- find -name '*.py' | wc -l | sed 's/^/PY=/' >> build.env
- find -name '*.yml' | wc -l | sed 's/^/YML=/' >> build.env
- find -name '*.yaml' | wc -l | sed 's/^/YAML=/' >> build.env

或者也许

- ( printf PY=; find -name '*.py' | wc -l ) >> build.env

我最终这样做了:

    - "set +e -vx"
    - "PY=$(find -name '*.py' | grep .)"
    - |
      if [[ "${PY}" ]]; then
          PY=0
      else
          PY=1
      fi

它变长了,但@KamilCuk 的回答不太令人满意。 不过谢谢!