在给定的Jenkins worker节点上获取正在运行的构建状态

问题描述 投票:0回答:1

我正在尝试设置一些自动化措施,以优雅地删除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 autoscaling jenkins-cli
1个回答
0
投票

我找不到通过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
© www.soinside.com 2019 - 2024. All rights reserved.