从master重启Jenkins slave

时间:2015-03-20 11:07:26

标签: jenkins master-slave

我使用jenkins主从配置来捕获产品的性能指标。我们观察到jenkins-slave倾向于累积内存,从而影响捕获的性能指标。

为了确保捕获的度量标准的一致性,我们正在考虑每天从主服务器重新启动jenkins从服务器,此时服务器上没有正在运行的作业。这可行吗?

我们怎样才能完成它?

注意:使用jenkins-slave作为服务不是一种选择,因为我们遇到了其他安全访问问题。

3 个答案:

答案 0 :(得分:8)

我知道这个答案有点晚了:

这就是我出于同样的原因做同样的事情,不确定这是否是实现这一目标的最佳方式,但它解决了我们的许多问题:

对于Windows计算机:

  1. 创建一个只在Windows机器上运行“shutdown -r -f”的作业。 它将重启机器。
  2. 现在把它带回在线部分。出于与你类似的原因,我 没有使用“jenkins-slave作为服务”。相反,我配置了 节点通过JNLP客户端连接,然后添加slave.jar 在Window的任务调度程序中为每个节点命令(运行 启动)
  3. 现在作业重新启动机器并且Windows机器带来了 詹金斯本身就在重新启动后立即联机。
  4. 适用于Mac计算机:

    1. 这个过程在mac上比较容易。首先,做一份工作 Mac节点上的“shutdown -r now”

    2. 应该设置节点以通过ssh连接。那会的 负责在Jenkins上线。

    3. 这是我的脚本中的“执行shell”部分,用于重新启动用于自动化的所有机器:

      distro=`uname`
      if [ "$distro" = "Windows_NT" ] || [ "$distro" = "WindowsNT" ] ;then
      echo "Restarting Windows Machine...."
      shutdown -r -f
      else
      echo "Restarting Mac Machine...."
      sudo shutdown -r now
      fi
      

      <强> PS:

      它与问题并不完全相关,但可能对您指定的情况有用。在Windows机器启动时添加批处理脚本来清理临时文件可能是个好主意。 将以下内容添加到Windows计算机的启动文件夹中的批处理脚本(Say,cleanTemp.bat)中。 (对于Windows 10,C:\ Users \\ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup)

      rmdir %temp% /s /q
      
      md %temp%
      

答案 1 :(得分:4)

如果你还需要答案: https://wiki.apache.org/general/Jenkins#How_do_I_restart_a_Jenkins_Unix_Slave.3F

虽然,我刚刚断开连接然后我看到进程在奴隶中死亡。我没有必要手动杀死它们。 然后再次启动奴隶,就是这样。

这很好用于网页用户界面。我还没有为此搜索过CLI。

答案 2 :(得分:0)

  1. 创建一个职位,例如“Reboot-Slave”,并使用shell“shutdown -r -t 0”进行设置,并将目标从属名称作为参数。 (这样,restart命令将直接在你想重启的目标从站上执行。)

  2. 创建另一个职位,例如“Reboot-Check-Slave-Online”,在这个工作中,你应该调用第一个作业并传递目标从属名称作为参数,另外,你最好写一些逻辑来确定你的奴隶是否完成了重启并连接到Jenkins再一次,你可以通过在你的工作中添加一个“执行系统groovy脚本”步骤来实现它,并在下面写下代码:

    import hudson.model.*
    
    def target_slave_param = "target_slave"
    def resolver = build.buildVariableResolver
    def target_slave = resolver.resolve(target_slave_param)
    
    println "target_slave is: ${target_slave}"
    
    def status = 0;
    
    //do{
    println "Searching for ${target_slave}";
    slave = Hudson.instance.slaves.find({it.name == target_slave});
    
    if (slave != null)
    {
      computer = slave.getComputer();
      if (computer.isOffline())
     {
        println "Error! $target_slave is offline.";
        status = 1;
      }
      else 
      {
        println "OK: $target_slave is online";
      }
    }
    else 
    {
      println "Slave $target_slave not found!";
      status = 1;
    }
    //}