使用 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 的回答不太令人满意。
不过谢谢!
我正在尝试使用 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 的回答不太令人满意。 不过谢谢!