我正在尝试设置一些自动化措施,以优雅地删除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/json
和xml
,它们显示了一堆执行程序属性,但似乎没有在运行的作业中填充元数据。他们总是空的。
这正在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