Search code examples
jenkinsjenkins-pluginsdocker-swarmcontinuous-deploymentjenkins-agent

How to delete offline (agents/nodes) from Jenkins in SWARM mode


How do I delete a node from Jenkins? Jenkins operates in Docker Swarm mode.

When I am trying to remove the offline container, swarm keeps generating new containersimage1 node


Solution

  • You can try:

    Using Jenkins Pipeline:

    node("master") {
    println "Cleaning up offline slaves..."
        hudson.model.Hudson.instance.slaves.each {
          if(it.getComputer().isOffline()) {
            println "Deleting ${it.name}"
            it.getComputer().doDoDelete()
          }
        }
        println "Done."
    }
    

    Using SH

    #!/bin/bash
    
    # This script should be run on the Jenkins master. We set up a job in Jenkins to run this once a week on master.
    
    function jenkins-cli {
      java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:8080 "$@"
    }
    
    for slave in slavename1 slavename2 slavename3; do
      if [[ `curl -s "http://localhost:8080/computer/${slave}/api/xml?xpath=*/offline/text()"` = "true" ]]; then
        echo "$slave is already offline. Skipping cleanup"
      else
        echo "Cleaning up docker on $slave"
        echo "Taking $slave offline"
        jenkins-cli offline-node $slave -m "Scheduled docker cleanup is running" && \
          echo "Waiting on $slave to go offline" && \
          jenkins-cli wait-node-offline $slave && \
          while [[ `curl -s "http://localhost:8080/computer/${slave}/api/xml?xpath=*/idle/text()"` != "true" ]]; do echo "Waiting on $slave to be idle" && sleep 5; done && \
          echo "Running cleanup_docker on $slave" && \
          ssh -o "StrictHostKeyChecking no" $slave -i /var/lib/jenkins/.ssh/id_rsa "sudo /usr/local/bin/cleanup_docker"
        echo "Bringing $slave back online"
        jenkins-cli online-node $slave
      fi