删除Jenkins JOB后清理workspace

若是Jenkins使用的Master-Slave多节点架构,删除Jenkins JOB后,相应JOB的slave节点的workspace不会被删除python

stackoverflow上有相关的问答:http://stackoverflow.com/questions/20532705/deleting-jenkins-jobs-through-gui-does-not-delete-their-workspaces-in-slavesapi

google groups上有相关的讨论:https://groups.google.com/forum/#!topic/jenkinsci-users/SiZ3DL-UJ-8架构

因此须要自行处理,因而用脚本实现该功能ui

具体思路是:google

  • 遍历jenkins节点的workspace,根据路径解析得到jenkins job name
  • 若是该job不存在(经过python jenkinsapi实现),则删除相应的workspace 
    • 暂不考虑自定义的workspace
  • 须要在jenkins每一个节点上进行处理(能够在jenkins上建立job,将job绑定到相应slave上;也能够在相应slave上直接运行脚本)

相关的Python脚本以下: url

# -*- coding: utf-8 -*-
import os
import shutil
import logging

from jenkinsapi.jenkins import Jenkins

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__file__)


def get_jenkins_instance():
    jenkins_url = "http://jenkins.example.com"
    jenkins_username = "username"
    jenkins_password = "password"
    return Jenkins(jenkins_url, username=jenkins_username, password=jenkins_password)


def clean_workspace():
    jenkins_instance = get_jenkins_instance()

    jenkins_workspace_path = "/opt/JENKINS_HOME/workspace/"

    for dirpath, dirnames, filenames in os.walk(jenkins_workspace_path):
        if dirpath == jenkins_workspace_path:
            for dirname in dirnames:
                jenkins_job_name = dirname
                # 若是job被删除,则清理相应的workspace
                if not jenkins_instance.has_job(jenkins_job_name):
                    logger.info("removing workspace dir of job:%s" % dirname)
                    shutil.rmtree(os.path.join(dirpath, dirname))


if __name__ == "__main__":
    clean_workspace()
相关文章
相关标签/搜索