在 github 工作流程中,我尝试使用 grep 检查版本是否与 SemVer 的 regexp 匹配来检查项目的版本是否符合 SemVer 标准。
我尝试了不同的方法来做到这一点,但从未成功地重现我在本地 shell 上开发的脚本的行为。
例如,以下 bash 脚本成功检测 TAG_NAME 变量是否包含 SemVer 版本号:
TAG_EXISTS="v3.0.12"
SEMVER="^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA- Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
grep -oE "$SEMVER" <<< "$TAG_EXISTS"
ISSEMVER="$?"
echo "$ISSEMVER"
返回1 ...以及 TAG_EXISTS="3.0.12" 返回 0
但是,如果我将其转移到以下 github 工作流程,它总是返回 1,并且我无法找到获取 grep 结果或评估此操作的退出代码的方法:
checkVersion:
needs: tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.x
.....some other not related steps
- name: Check for Existing Tag
id: check_tag
run: |
set +x
TAG_EXISTS=3.0.14
SEMVER="^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a- zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
grep -oE "$SEMVER" <<< "$TAG_EXISTS"
ISSEMVER="$?"
echo "$ISSEMVER"
如何在 grep 未找到匹配项时使 github 操作失败,并在 grep 找到匹配项时使其通过?
我也尝试在子shell中进行grep:
RESULT=$( echo "$TAG_EXISTS" | grep -oE "$SEMVER")
像这样,管道总是失败并以状态 1 退出
grep
的实施。
与我的实现例如“3.0.12”不匹配。通过我的实现,当我使用
-P
(
--perl-regexp
) 而不是 -E
(--extended-regexp
) 时,它会匹配。我建议尝试一下,即:grep -qP "$SEMVER" <<< "$TAG_EXISTS"
。
(我将-o
更改为
-q
,因为这似乎就是您所需要的。)