通过groovy脚本调用`git diff-tree`时“致命:坏对象”?

时间:2016-07-20 05:08:12

标签: git github jenkins groovy

我想在推送到Github时自动触发Jenkins构建。此外,基于分支和修改过的文件,我想向SaltStack API发送不同的函数args,并在不同的目标虚拟机上运行。

这是“构建环境”中的代码 - “为构建过程注入环境变量”步骤:

def map = [:]

println "env:"
def env = System.getenv()
env.each{
    println it
} 

println "envVarsMap:"
def thr = Thread.currentThread()
def build = thr?.executable
def envVarsMap = build.parent.builds[0].properties.get("envVars")
envVarsMap.each{
    println it
}

def envlist = [];
env.each() { k,v -> envlist.push( "$k=$v" ) }
envVarsMap.each { k,v -> envlist.push( "$k=$v" ) }

switch (envVarsMap['GIT_BRANCH']) {
    case "origin/development":
        map['DEPLOY_SERVER'] = "admin-dev-1,admin-staging-2"
        break
    case "origin/master":
        map['DEPLOY_SERVER'] = "admin-prod-1"
        break
}

println "GIT_COMMIT: ${envVarsMap['GIT_COMMIT']}"
println "WORKSPACE: ${envVarsMap['WORKSPACE']}"

def sout = new StringBuilder()
def serr = new StringBuilder()
proc1 = "git diff-tree --no-commit-id --name-only -r ${envVarsMap['GIT_COMMIT']}".execute(envlist, new File("${envVarsMap['WORKSPACE']}"))
proc1.waitForProcessOutput(sout, serr)
println "sout: $sout"
println "serr: $serr"
println "proc1: ${proc1.text}"

和错误:

GIT_COMMIT: c56ba02156bcf23598db09b9a02407316bf554dc
WORKSPACE: /var/lib/jenkins/workspace/deploy-admin-app
sout: 
serr: fatal: bad object c56ba02156bcf23598db09b9a02407316bf554dc

在CI服务器上以jenkins用户手动运行此命令正常工作:

su - jenkins -s /bin/bash -c 'cd /var/lib/jenkins/workspace/deploy-admin-app; git diff-tree --no-commit-id --name-only -r c56ba02156bcf23598db09b9a02407316bf554dc'
package.json

所以,我的问题是:为什么我会收到此错误?如何在手动运行时重现这一点?

如果修订版不存在,我们应该收到“未知版本”错误:

fatal: ambiguous argument 'c56ba02156bcf23598db09b9a02407316bf554dx': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

1 个答案:

答案 0 :(得分:0)

对不起。

我们有一个主节点和一些从节点。 通过不检查&#34;限制可运行此项目的位置&#34; ,可以在任何节点上运行构建。问题是构建是在奴隶上运行的:

  

[EnvInject] - 加载节点环境变量。

     

在工作区/ var / lib / jenkins / workspace / deploy-admin-app中远程建立jenkins-slave-go-1(golang)

但随后在主人身上检查了git diff-tree。我通过运行git log -1来发现这一点。

因此,我必须检查&#34;限制此项目可以运行的位置&#34; 并填充 master 作为标签。