【问题标题】:Line return not displayed with gitlab CIgitlab CI 不显示换行
【发布时间】:2020-11-24 17:26:23
【问题描述】:

我有一个 CI (git lab CI),它运行一个运行 makefile 作业的 shell,它调用 bash 脚本。 CI 脚本是一个 YAML (gitlab-ci.yml) 脚本。

YAML 脚本:

Build:
  stage: ThisIsAnExample
  script: 
    - export OPTION1=true; make -C build/ myTarget

Makefile 脚本:

.ONESHELL:
SHELL = /bin/bash
.SHELLFLAGS = -ec

myTarget:
    @echo "A";echo ""; print "B\n";  echo "C";  echo "";

如果我从控制台运行 bash 脚本,我会得到:

A

B

C

在 CI 日志中我得到:

A
B
C

为什么 gitlab CI 不解释行返回?

【问题讨论】:

  • 如果您的 CI 是一个 Web 应用程序,则输出可能没有正确转义/格式化,因为 html 中的所有空格都算作一个。我会使用浏览器的开发者工具检查网络源代码。
  • 所以我应该做类似if runner=CI; then ESCAPE='\'; else ESCAPE=''; printf "A${ESCAPE}\nB${ESCAPE}\nC${ESCAPE}\n"的事情?我的解决方案很丑……有什么想法吗?

标签: bash shell makefile yaml gitlab-ci


【解决方案1】:

我找到了解决方法。

我做了这些改变:

在我的 YAML gitlab-ci 脚本中:

Build:
  stage: ThisIsAnExample
  script: 
    - export OPTION1=true; export FORCE_LR_ESCAPE_IN_CI=yes; make -C build/ myTarget

在我的 makefile 中:

.ONESHELL:
SHELL = /bin/bash
.SHELLFLAGS = -ec

FORCE_LR_ESCAPE_IN_CI ?= no

ifeq ($(FORCE_LR_ESCAPE_IN_CI),yes)
NEW_LINE = printf '\u2000\n'
else
NEW_LINE = echo ''
endif

myTarget:
    @echo "A"; $(NEW_LINE); echo "B"; $(NEW_LINE);  echo "C"; $(NEW_LINE);

我发现 gitlab-ci 会跳过一个 '\n' 如果它没有被一个字符进动。 对我来说似乎是一个错误。无论如何,我在 '\n' 之前添加了一个不可见字符('\u2000'),它可以工作!

注意:我尝试使用 echo '\u2000',但它仅在控制台中有效,在 ci 中无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2020-06-25
    • 2017-04-01
    • 1970-01-01
    • 2022-08-14
    • 2020-04-02
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多