我想要一个构建后的钩子或类似的东西,这样我就可以有与例如 IRC 插件相同的输出,但是把它交给一个脚本。我能够获得所有信息,除了实际的构建状态。这只是不起作用,也不是“构建后脚本”、“构建后任务”、“参数化触发器”。
有一些非常丑陋的解决方法是可能的,但我想问一下,以防有人有更好的选择......没有编写我自己的插件。
我想要一个构建后的钩子或类似的东西,这样我就可以有与例如 IRC 插件相同的输出,但是把它交给一个脚本。我能够获得所有信息,除了实际的构建状态。这只是不起作用,也不是“构建后脚本”、“构建后任务”、“参数化触发器”。
有一些非常丑陋的解决方法是可能的,但我想问一下,以防有人有更好的选择......没有编写我自己的插件。
它与 Groovy Post-Build Plugin 中提到的一样工作,但在执行的字符串中没有任何额外的引用。所以我不得不将实际功能放入一个 shell 脚本中,该脚本调用 curl,这反过来也需要引用 POST 参数。
def result = manager.build.result
def build_number = manager.build.number
def env = manager.build.getEnvironment(manager.listener)
def build_url = env['BUILD_URL']
def build_branch = env['SVN_BRANCH']
def short_branch = ( build_branch =~ /branches\//).replaceFirst("")
def host = env['NODE_NAME']
def svn_rev = env['SVN_REVISION']
def job_name = manager.build.project.getName()
"/usr/local/bin/skypeStagingNotify.sh Deployed ${short_branch} on ${host} - ${result} - ${build_url}".execute()
通过Groovy Post-Build 插件在后期构建步骤中使用 Groovy 脚本。然后,您可以通过Jenkins Java API访问 Jenkins 内部。该插件为脚本提供了变量管理器,可用于访问 API 的重要部分(请参阅插件文档中的使用部分)。
例如,您可以在 Windows 上执行一个简单的外部 Python 脚本并将其结果(以及构建结果)输出到构建控制台:
def command = """cmd /c python -c "for i in range(1,5): print i" """
manager.listener.logger.println command.execute().text
def result = manager.build.result
manager.listener.logger.println "And the result is: ${result}"
为此,我真的很喜欢Conditional Build Step插件。它非常灵活,您可以根据构建失败或成功选择要采取的操作。例如,这是我使用条件构建步骤发送构建失败通知的情况:
您还可以使用条件构建步骤来设置环境变量或写入您在后续“执行 shell”步骤中使用的日志文件。因此,例如,您可以创建一个包含三个步骤的构建:一个步骤编译代码/运行测试,另一个设置STATUS="failed"
环境变量,然后第三个步骤发送电子邮件The build finished with a status: ${STATUS}
在这里,我使用groovy 脚本插件来获取构建状态并将其设置为环境变量,因此可以使用构建后任务插件在构建后脚本中使用环境变量。
Groovy 脚本:-
import hudson.EnvVars
import hudson.model.Environment
def build = Thread.currentThread().executable
def result = manager.build.result.toString()
def vars = [BUILD_STATUS: result]
build.environments.add(0, Environment.create(new EnvVars(vars)))
后记:-
echo BUILD_STATUS="${BUILD_STATUS}"
尝试构建后任务插件...
它允许您根据日志输出指定条件...
基本解决方案(请不要笑)
#!/bin/bash
STATUS='Not set'
if [ ! -z $UPSTREAM_BUILD_DIR ];then
ISFAIL=$(ls -l /var/lib/jenkins/jobs/$UPSTREAM_BUILD_DIR/builds | grep "lastFailedBuild\|lastUnsuccessfulBuild" | grep $UPSTREAM_BUILD_NR)
ISSUCCESS=$(ls -l /var/lib/jenkins/jobs/$UPSTREAM_BUILD_DIR/builds | grep "lastSuccessfulBuild\|lastStableBuild" | grep $UPSTREAM_BUILD_NR)
if [ ! -z "$ISFAIL" ];then
echo $ISFAIL
STATUS='FAIL'
elif [ ! -z "$ISSUCCESS" ]
then
STATUS='SUCCESS'
fi
fi
echo $STATUS
在哪里
$UPSTREAM_BUILD_DIR=$JOB_NAME
$UPSTREAM_BUILD_NR=$BUILD_NUMBER
从上游构建传递
当然“/var/lib/jenkins/jobs/”取决于你的詹金斯安装