获取给定 Jenkins 工作节点上运行的构建状态



我正在尝试设置一些自动化,以便在 Jenkins 中优雅地删除工作节点。目前,我可以执行以下操作来使节点停止接受新作业:

JENKINS_CRUMB=$(curl -v -c /tmp/cookie -u "$user:$pass" "$JENKINS_URL/crumbIssuer/api/json" | jq -r '.crumb')
echo "CSFR Token: $JENKINS_CRUMB"
echo "Disabling Node $NODE_NAME"
curl -v -b /tmp/cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/toggleOffline"
echo "Waiting for Jobs to Finish"
???

但在那之后,我想等到任何正在运行的现有作业完成,然后脚本退出。我查看了/api/computer/端点,它似乎只列出了节点名称,但没有指示正在运行的作业的数量。我尝试了/computer/<worker name>/api/jsonxml,它们显示了一堆执行器属性,但它们似乎没有填充正在运行的作业的元数据。它们总是空的。

它在 AWS 上运行,我最终想从 SSM 代理(通过生命周期挂钩)调用它,每当自动扩展组策略想要缩减节点时都会触发。我的目标是干净关闭,等待作业完成,这样我就不会在开发人员运行作业时杀死节点。

我找不到通过 Jenkins API 完成所有操作的方法,但是如果您使用用户名和密码并获取 CSFR 令牌,则可以发出命令来toggleOffline该命令将设置一个节点,以便新作业不会运行,但现有作业将完成。然后,您可以查询/computer/<NODE_NAME>/api/json(这是一个 API 调用,因此您不需要 CSFR 令牌)并检查idle参数。节点空闲后,可以调用doDelete

以下代码片段假定节点名称存储在/node_name中,并且$JENKINS_URL设置为http://yourjenkinshostname$cookie只是一个文件位置,因此您可以将其设置为/tmp/something,当然您需要定义用户名和密码。

echo "Getting Jenkins CSFR Token"
JENKINS_CRUMB=$(curl -c $cookie -u "$user:$pass" "$JENKINS_URL/crumbIssuer/api/json" | jq -r '.crumb')
echo "CSFR Token: $JENKINS_CRUMB"
NODE_NAME=$(cat /node_name)
echo "Disabling Node $NODE_NAME"
curl -H "Jenkins-Crumb:$JENKINS_CRUMB" -X POST 
-b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/toggleOffline"
echo "Waiting for Jobs to Finish"
while true; do
idle=$(curl -b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/api/json" | jq ".idle")
echo "Node Idle State: $idle"
if [ "$idle" == "true" ]; then
echo "Node is idle. Removing Node"
curl -H "Jenkins-Crumb:$JENKINS_CRUMB" -X POST 
-b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/doDelete"
exit 0
else
echo "Node is Still Busy. Waiting 30s..."
sleep 30
fi
done

最新更新