You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实习任务:实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:48:24