实习任务:实现Django表单提交时自动创建Jenkins代理(Python)
实现Django保存员工数据后自动创建Jenkins代理
一、新手快速理解Jenkins代理
- Jenkins代理(原称Slave)是用来帮主节点分担构建任务的执行节点,你要创建的是以员工名称命名的专属代理,本质是通过Jenkins API在主节点上注册一个新的可执行任务节点。
- 必须先完成Jenkins的基础配置,才能用Python调用API创建节点。
二、前置准备
1. Jenkins端配置
- 登录Jenkins,进入「Manage Jenkins」→「Configure Global Security」,确保API访问权限开启,推荐使用账号认证而非匿名访问。
- 创建一个拥有「创建节点」权限的用户,进入用户配置页→「Add new Token」生成API Token,务必保存好这个Token(后续调用API必须使用)。
- 记录你的Jenkins访问地址(示例:
http://192.168.1.100:8080)。
2. 安装Python依赖
使用python-jenkins库简化Jenkins API调用,在Django虚拟环境中执行:
pip install python-jenkins
三、修改Django视图函数
以下是集成Jenkins代理创建逻辑的完整代码,关键步骤已标注注释:
import jenkins from django.shortcuts import redirect, render from django.contrib.auth.decorators import login_required from .models import Employee # 确保导入你的Employee模型 @login_required def create(request): if request.method == 'POST': name = request.POST.get('form-submit') description = request.POST.get('employe-description') # 保存员工数据到数据库 employee = Employee(user=request.user, name=name, description=description) employee.save() # ------------------- 新增Jenkins代理创建逻辑 ------------------- # Jenkins连接参数,建议从Django settings或环境变量读取,禁止硬编码 JENKINS_URL = "http://your-jenkins-ip:8080" # 替换为你的Jenkins地址 JENKINS_USER = "your-jenkins-username" # 替换为有权限的Jenkins用户名 JENKINS_TOKEN = "your-jenkins-token" # 替换为生成的API Token try: # 建立Jenkins服务连接 jenkins_server = jenkins.Jenkins(JENKINS_URL, username=JENKINS_USER, password=JENKINS_TOKEN) # 检查节点是否已存在,避免重复创建 existing_nodes = [node["name"] for node in jenkins_server.get_nodes()] if name not in existing_nodes: # 创建固定类型代理节点,可根据实际需求调整启动方式(SSH/Windows服务/容器等) jenkins_server.create_node( name=name, num_executors=1, # 代理允许同时执行的任务数量 node_description=description, # 用员工描述作为节点说明 remote_fs="/var/jenkins/agent", # 代理节点的工作目录,根据实际环境修改 labels=name, # 给节点打标签,方便后续指定任务到该代理 launcher=jenkins.LAUNCHER_SSH, # 默认用SSH启动代理 launcher_params={ "host": "agent-machine-ip", # 代理机器的IP地址 "port": 22, "username": "jenkins", "password": "agent-ssh-password" # 推荐用密钥认证替代密码 } ) # 启用节点(默认创建后为禁用状态) jenkins_server.enable_node(name) except jenkins.JenkinsException as e: # 捕获API调用异常,可添加日志记录或前端错误提示 print(f"创建Jenkins代理失败:{str(e)}") # 可选:用Django messages框架给前端返回错误提示 # from django.contrib import messages # messages.error(request, f"Jenkins代理创建失败:{str(e)}") # ------------------- 代理创建逻辑结束 ------------------- return redirect('create') return render(request, 'create.html')
四、关键注意事项
- 代理节点部署:代码仅在Jenkins主节点完成代理注册,你需要确保目标代理机器已安装Jenkins代理程序、Java环境,且主节点能通过SSH(或其他配置的启动方式)连接到代理机器。如果使用容器化代理,可在代码中调用Docker API启动容器后再注册节点。
- 安全优化:禁止把Jenkins账号、Token硬编码在代码里,建议放在
settings.py中通过环境变量读取,例如os.getenv("JENKINS_TOKEN")。 - 权限配置:确保Jenkins用户拥有「Create nodes」「Configure nodes」权限,可通过「Manage Jenkins」→「Manage and Assign Roles」(需安装Role-based Authorization Strategy插件)配置。
- 异常处理:实际项目中需完善异常捕获逻辑,针对Jenkins连接失败、节点已存在等场景,给用户明确的反馈。
内容的提问来源于stack exchange,提问作者Nova
相关产品推荐
相关产品推荐

