Jenkins - 参数化 .php 文件
Jenkins - parametrise .php file
我正在配置 Jenkins 以使其构建我的项目。
它检查源代码,安装所有必需的库等。
我的应用程序配置存储在 params.php
文件中(Yii 1.x 风格),它看起来如下:
return array(
'dbHost' => 'dbHostValuePlaceholder',
'dbPasssword' => 'dbPasswordValuePlaceholder',
/* other values go here */
);
显然我需要用我在开始参数化构建时设置的密码替换 dbPasswordValuePlaceholder。
我找到的当前解决方案是 运行 this as shell 命令:
sed -i s/dbPasswordValuePlaceholder/$DB_PASSWORD/g $WORKSPACE/protected/config/params.php
其中$DB_PASSWORD是相应的变量。
此解决方案非常适合简单的字符串,但密码可能看起来像 a1@2";$&^*&-=+/*-:'/.,,,,,,,,^^^^^
- 在这种情况下,sed 由于未转义字符而失败。
我搜索了不同的 Jenkins 插件,但只有适用于其他格式的插件,例如 .xml 等,而不能适用于 .php 文件。
我需要避免将我的配置值从 .php 文件中移出到其他格式。
有没有办法用构建参数值替换 .php 文件中描述的标记?
更新
正如@Stanjer 所推荐的,我尝试将参数值设置为:
a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^
因此,在这种情况下,PHP 中的以下代码将是正确的、有效的:
'universalPassword' => 'a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^',
没有帮助,这里是输出:
[build.int] $ /bin/sh -xe /tmp/hudson642312569695847678.sh
+ sed -i s/defaultUniversalPassword/a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^/g /var/www/build.int/protected/config/params.php
sed: -e expression #1, char 43: unknown option to `s'
Build step 'Execute shell' marked build as failure
Finished: FAILURE
我不确定是否有任何 jenkins 插件以这种方式工作,但我需要知道是否可以使用此方法让 sed 忽略特殊字符:
sed with special characters
而且我想您一定在参数化作业中使用了密码参数,它隐藏了密码。
感谢更新问题。
在您的情况下,您应该通过将其提供为 $'string'
.
来表明它已经被转义
所以命令看起来像:
$ sed s#dbPasswordValuePlaceholder#$'"a1@2";$&^*&-=+/*-:\'/.,,,^^^"'#g test.php
输出将是:
<?php
return array(
'dbHost' => 'dbHostValuePlaceholder',
'dbPassword' => '"a1@2";$dbPasswordValuePlaceholder^*dbPasswordValuePlaceholder-=+/*-:'/.,,,,,,,,^^^^^"',
/* other values go here */
);
?>
如果使用变量:
export NEWPASS=$'"a1@2";$&^*&-=+/*-:\'/.,,,^^^"'
sed "s#dbPasswordValuePlaceholder#$NEWPASS#g" test.php
我正在配置 Jenkins 以使其构建我的项目。 它检查源代码,安装所有必需的库等。
我的应用程序配置存储在 params.php
文件中(Yii 1.x 风格),它看起来如下:
return array(
'dbHost' => 'dbHostValuePlaceholder',
'dbPasssword' => 'dbPasswordValuePlaceholder',
/* other values go here */
);
显然我需要用我在开始参数化构建时设置的密码替换 dbPasswordValuePlaceholder。
我找到的当前解决方案是 运行 this as shell 命令:
sed -i s/dbPasswordValuePlaceholder/$DB_PASSWORD/g $WORKSPACE/protected/config/params.php
其中$DB_PASSWORD是相应的变量。
此解决方案非常适合简单的字符串,但密码可能看起来像 a1@2";$&^*&-=+/*-:'/.,,,,,,,,^^^^^
- 在这种情况下,sed 由于未转义字符而失败。
我搜索了不同的 Jenkins 插件,但只有适用于其他格式的插件,例如 .xml 等,而不能适用于 .php 文件。
我需要避免将我的配置值从 .php 文件中移出到其他格式。
有没有办法用构建参数值替换 .php 文件中描述的标记?
更新
正如@Stanjer 所推荐的,我尝试将参数值设置为:
a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^
因此,在这种情况下,PHP 中的以下代码将是正确的、有效的:
'universalPassword' => 'a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^',
没有帮助,这里是输出:
[build.int] $ /bin/sh -xe /tmp/hudson642312569695847678.sh
+ sed -i s/defaultUniversalPassword/a1@2";$&^*&-=+/*-:\'/.,,,,,,,,^^^^^/g /var/www/build.int/protected/config/params.php
sed: -e expression #1, char 43: unknown option to `s'
Build step 'Execute shell' marked build as failure
Finished: FAILURE
我不确定是否有任何 jenkins 插件以这种方式工作,但我需要知道是否可以使用此方法让 sed 忽略特殊字符:
sed with special characters
而且我想您一定在参数化作业中使用了密码参数,它隐藏了密码。
感谢更新问题。
在您的情况下,您应该通过将其提供为 $'string'
.
所以命令看起来像:
$ sed s#dbPasswordValuePlaceholder#$'"a1@2";$&^*&-=+/*-:\'/.,,,^^^"'#g test.php
输出将是:
<?php
return array(
'dbHost' => 'dbHostValuePlaceholder',
'dbPassword' => '"a1@2";$dbPasswordValuePlaceholder^*dbPasswordValuePlaceholder-=+/*-:'/.,,,,,,,,^^^^^"',
/* other values go here */
);
?>
如果使用变量:
export NEWPASS=$'"a1@2";$&^*&-=+/*-:\'/.,,,^^^"'
sed "s#dbPasswordValuePlaceholder#$NEWPASS#g" test.php