我们的内部构建系统使用shell脚本来设置构建项目的环境。然后实际的构建工具(ant或make)可以引用环境变量来配置各种东西。本质上,它确实做到了:
$ /path/to/setup_env.sh .
[build env] $ ant compile
请注意,第一个命令启动并初始化一个新的shell,并期望在该shell中执行所有后续的构建操作。
现在我正试图在詹金斯身上复制同样的东西。如何运行shell脚本,然后在同一环境中进行后续的ant构建步骤?
内置的"执行外壳"和EnvInject插件没有帮助,因为它们在进入下一个构建步骤之前放弃了对环境的任何更改。
我不想修改ant构建文件,因为在当前的内部构建系统中应该可以继续使用。
这是一个为我们设计的"解决方案"。关键思想是setup_env.sh
脚本启动一个新的shell,在其中导出一组环境变量。我们需要的是获取这些变量的定义。所以我们做了一个由三部分组成的Jenkins构建:
步骤1-执行Shell
使用内置的"执行Shell"Jenkins来运行我们的setup_env.sh
脚本。然后向新启动的shell提供一个简单的python脚本,该脚本将环境转储到一个文件中。
/path/to/setup_env.sh . <<< 'python <<SC
print "Exporting env to buildenv.properties file"
import os
f = open("buildenv.properties", "w")
env = os.environ
for k in env:
f.write("%s=%sn" % (k, env[k]))
f.close()
print "Done exporting env"
SC'
步骤2-注入环境变量
现在,我们使用EnvInjectPlugin从上一步转储的文件中注入环境变量。这里的配置很简单,只需将转储的属性文件名指定为Properties File Path
字段值。
步骤3-调用Ant
在这里,我们开始正常的ant
构建。由于环境现在包含了所有必需的定义,因此构建将正常完成。
尝试EnvInject插件。