2017-05-08 19 views
0

中的问题我想在travis-ci中使用环境变量,并在运行时使用sed替换文件的内容。使用sed替换.coveralls.yml配置内容在Travis-CI

有问题的文件包括:

service_name: travis-ci 
repo_token: COVERALLS_TOKEN 

在Ubuntu系统,在命令行中使用的作品sed -i 's/COVERALLS_TOKEN/ASDF/g' .coveralls.yml,但携带到特拉维斯-CI配置类似sed -i 's/COVERALLS_TOKEN/$COVERALLS_TOKEN/g' .coveralls.yml不拉环境变量。

真正让我失望的是,我今天有一个项目,其中.travis.yml条目的作用不大,但是将其适用于这种情况并不适用。

原始的实现,今天仍然有效

sed -ri 's/^MY_ENV_VAR=/MY_ENV_VAR='$MY_ENV_VAR'/' .env 

适应(不工作)

sed -ri 's/^COVERALLS_TOKEN/$COVERALLS_TOKEN/' .coveralls.yml 
+0

可能在[sed环境变量替换]的副本(http://stackoverflow.com/questions/584894/environment-variable-substitution-in-sed) –

回答

1

您的命令有两个问题。首先,^表示它将只匹配COVERALLS_TOKEN,它出现在一行的开头。由于它不在YAML文件的行首,因此没有匹配,并且sed命令不执行任何操作。

其次,单引号内没有变量替换。

所以去除^,并使用双引号,而不是单一的:

sed -ri "s/COVERALLS_TOKEN/$COVERALLS_TOKEN/" .coveralls.yml 

一些注意事项:

  1. 变量$COVERALLS_TOKEN必须在外壳上,在您运行sed时设置命令。
  2. 如果$COVERALLS_TOKEN的值包含您在替换命令中使用的分隔符,则替换将失败,并显示语法错误。上面的命令使用/,但如果需要,您可以更改 - 只需选择令牌字符串中不存在的内容即可。
  3. 令牌值在YAML文件中不会以任何方式引用。通常,这是确定的,但如果在价值任何奇怪的字符,你需要将它们添加到替换命令的替代的一面,以及把引号它在YAML:

    sed -ri "s/COVERALLS_TOKEN/'$COVERALLS_TOKEN'/" .coveralls.yml 
    
+0

谢谢,这是我所需要的细节。现在正在工作。 – Webnet

0

单引号抑制变量扩展。

+0

你是否建议它应该是'sed -ri's/^ COVERALLS_TOKEN /“ $ COVERALLS_TOKEN“/'.coveralls.yml'?不幸的是,这是行不通的。我也尝试过'sed -ri's/^ COVERALLS_TOKEN /''$ COVERALLS_TOKEN'''''.coveralls.yml'给出了“可能重复”的标志。 – Webnet

+0

是的,我建议''s/^ COVERALLS_TOKEN /'“$ COVERALLS_TOKEN”'/''。那个命令的问题是什么? –

+0

这不起作用 – Webnet