使环境变量对脚本可用的万无一失的方法是什么?



我在Ubuntu VM上使用了一个环境变量,该变量在/etc/profile.d/appsetup.sh的脚本中设置。

在我的脚本server-up.sh中使用该变量来启动我的Java应用程序:

export path=$KEYSTORE_PATH
java -jar -Dsecurity.keystore.path=$path [jarfile]

如果我回显变量,它可以工作:

$ echo $KEYSTORE_PATH
/etc/ssl/certs

如果我自己运行脚本(sudo sh server-up.sh),它运行并使用环境变量很好。

然而,当脚本从Jenkins的"Execute Shell"第一步(在同一个VM上),它显然不能访问环境变量,即使假定它在系统范围内可用。

我试过将server-up.sh的所有者设置为rootjenkins,詹金斯以任何一种方式运行它,但在这两种情况下它都不会得到环境变量。在Jenkins中,我也尝试使用命令sudo -E /[path]/server-up.sh,但随后工作失败,错误显示sudo:对不起,您不允许保存环境.

我已经用谷歌搜索了十几次各种各样的东西,但几乎所有出现的都是人们问如何在Jenkins中设置环境变量,我不需要这样做;我只是想要一个脚本,詹金斯可以执行访问系统环境变量。

我需要做什么才能使它工作?

做一个小的修改,允许/etc/profile.d/appsetup.sh脚本将变量输出到一个文件中,Jenkins作业可以访问这个变量来创建一个环境变量,使作业能够成功运行。

我认为上下文和需求解释得不够好,无法用"how 's how you do it"来正确回答这个问题。

在服务器上,jenkins。War从一个shell(或者一个调用shell脚本的根shell)启动,它有一个环境,你可以设置和传递参数。它们存在于jenkins的上下文中。战争的过程。如果您从守护进程(initd/systemd)运行,您将得到一个非交互式shell,它的设置与您的正常shell不同。

你的Jenkins通常会有节点在远程服务器上启动代理。它们通常通过非交互式shell启动(因此没有user .profile设置)。

然后作业本身在其中一个代理上运行,其中执行程序为作业执行启动shell。对于特定的步骤,可以启动子shell。

你提到的sudo sh server-up.sh和Jenkins的"Execute Shell">,即使在同一VM上不要继承相同的环境,因为节点是在它自己的进程上使用非交互式shell启动的,并且不知道server-up.sh脚本中的任何内容;它(通常)只获取/etc/profile。

你有选择。你可以在Jenkins中设置全局变量:
${JENKINS_URL}/configure
Global Properties
[X]环境变量
[X]准备作业环境(需要Env Inject插件)

同样的选项也存在于Node级别

您可以安装slaves-setup插件,它允许您在启动代理(也称为slave)时进行一些自定义。

你可以安装环境注入器插件,它增加了前面提到的Prepare jobs environment特性。

它还添加了作业特定的配置选项:
[X]为运行准备一个环境

PlusBuild Environmentsection,
[X]向构建过程注入环境变量

[X]向构建过程注入密码作为环境变量
这些是加密的,我相信是被屏蔽的

最后,您可以添加一个构建步骤到,如果您需要为不同的步骤设置不同的值,


但是它是一个密钥库中的证书!

考虑到你还提到你想要提供的是$KEYSTORE_PATH=/etc/ssl/certs,我想知道你是否已经探索过使用凭据插件?它支持多种凭据类型,包括:

  • 用户名密码
  • SSH私钥
  • 公共证书和私钥
  • 二进制blob数据

使用这种方法与自己烹饪的明显好处是,它被设计成与Jenkins一起安全工作,因此您的秘密不会无意中暴露。除了插件站点上的大量文档之外,书中还有更多关于使用凭据的内容,在管道中使用凭据,还提到Snippet生成器将为您存根凭据,以及Cloudbees站点上的—向构建中注入秘密。你可以在S/O和DevOps中找到很多帮助。

您可能还希望探索新引入的Git凭证绑定,用于sh、bat和powershell,尽管不确定这是否适用于您的情况。

最新更新