Jenkins获取/设置作业

时间:2015-04-29 05:45:02

标签: jenkins

jenkins有没有办法从工作中设置全局属性?我们有很多这样的需求 - 但具体来说 - 我们有许多奴隶,跨unix和windows,以及各种不同的权限位置 - 因此连接文件系统并不容易。我们通过各种级别的成熟来促进 - 例如,我们希望向UAT推广一些内部版本号 - 然后将 UAT中的任何数字提升为培训等等。所以 - 真的,在"发布到uat" - 我们希望存储一些关于发布了哪个版本号的想法 - 并从"发布到培训"工作。目前我们通过限制它们从同一个奴隶运行并将其写入文件来攻击它,这非常不理想。

2 个答案:

答案 0 :(得分:1)

我可能没有完全理解你的问题,但你可以使用jenkins中内置的groovy脚本功能执行大量工作,包括从其他作业中读取参数,以及重写或初始化参数目前的工作。您可以使用此类参数来记录可由其他作业按需检索的信息

例如,您可以找到某个项目上次成功构建的内部版本号:

import hudson.model.*
def hif = Hudson.instance

def a = hif.getItems(hudson.model.Project).find{it.displayName.toUpperCase()=='MY_PROJECTNAME'}.getBuilds().findAll{it.result==Result.SUCCESS }.first()
out.println a.number //build number
out.println a.buildVariableResolver.resolve('someVariable')// some parameter used to call a

(此时你可以包括任何其他标准)

如果要将信息保存到以后可以被另一个bulid步骤或其他作业读取的参数,那么首先在作业配置中创建参数,然后在代码中写入,如下所示:

import hudson.model.*
def hif = Hudson.instance
def buildMap = build.getBuildVariables() 

buildMap['MySpecialVar']='SomeValue'

setBuildParameters(buildMap)

def setBuildParameters(map) {
    def npl = new ArrayList<StringParameterValue>()
    for (e in map) {
        npl.add(new StringParameterValue(e.key.toString(), e.value.toString()))
    }
    def newPa = null
    def oldPa = build.getAction(ParametersAction.class)
    if (oldPa != null) {
        build.actions.remove(oldPa)
        newPa = oldPa.createUpdated(npl)
    } else {
        newPa = new ParametersAction(npl)
    }
    build.actions.add(newPa)
}

结合使用这些技术,例如:

  1. 在作业一中将大量信息保存为“输出参数”
  2. 查找作业1的最新成功实例并阅读其参数
  3. 如有必要,请将这些参数保存到job2的参数列表中,以便可以从其他构建步骤访问它们。
  4. 如果您乐意使用文件,那么您可以使用存档插件,您可以在其中写入文件,然后将其存档为后期构建操作。该文件将保存到主服务器,您可以使用第二个构建中的“从另一个项目复制工件”选项来检索该文件。您可以使用参数过滤器和上述技术来选择正确的构建。

答案 1 :(得分:0)

永久设置环境变量完全取决于底层操作系统。

例如,在Windows上,可以使用SetX命令,但请注意,SetX仅在系统创建的下一个进程从全局配置继承后生效。因此,如果您运行SetX,然后运行另一个作业,它将不会注意到更改。但是,如果运行SetX,然后重新启动Jenkins进程(所有子作业都从该进程继承变量),则另一个作业将注意到更改。

不确定如何在Linux中设置永久变量,但快速Google搜索会返回以下答案:https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables