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

Bamboo插件开发:如何使用Executable及获取路径传入ProcessService

Bamboo插件开发:Capability可执行文件使用与路径获取问题

我来帮你解决这两个Bamboo插件开发的问题,都是插件里和外部进程、Capability相关的常见坑:

问题1:如何在Bamboo插件代码中使用定义为Capability的可执行文件

Bamboo里的Capability是绑定到Agent(或本地Server)的环境配置,要在插件代码里调用它,核心是借助CapabilityMatchingService来匹配并获取对应的可执行文件路径,步骤如下:

  1. 注入CapabilityMatchingService:作为Atlassian插件,通过Spring依赖注入获取这个服务(用@ComponentImport标记,因为它是Bamboo核心服务)
  2. 获取当前执行环境的CapabilitySet:从TaskContext的BuildContext里拿到当前运行任务的Agent/Server的Capability集合
  3. 匹配目标Capability:用Capability的key(你在Bamboo后台定义的那个)去匹配,拿到对应的路径值

问题2:获取指定可执行文件路径的正确API

你提到从TaskConfiguration或TaskDefinition获取失败是正常的——这两个类存储的是任务的配置参数(比如用户在任务界面输入的自定义参数),而Capability属于执行环境的配置,和任务本身的配置是分离的。

正确的做法是用CapabilityMatchingService结合TaskContext来获取,下面是完整的代码示例,直接对应你给出的ProcessService调用场景:

import com.atlassian.bamboo.capability.CapabilityMatchingService;
import com.atlassian.bamboo.process.ExternalProcess;
import com.atlassian.bamboo.process.ExternalProcessBuilder;
import com.atlassian.bamboo.process.ProcessService;
import com.atlassian.bamboo.task.TaskContext;
import com.atlassian.bamboo.task.TaskResult;
import com.atlassian.bamboo.task.TaskResultBuilder;
import com.atlassian.bamboo.task.TaskType;
import com.atlassian.bamboo.v2.build.agent.capability.Capability;
import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySet;
import com.atlassian.spring.container.ComponentImport;
import javax.inject.Inject;
import java.io.File;
import java.util.Arrays;

public class RobotTask implements TaskType {

    private final CapabilityMatchingService capabilityMatchingService;
    private final ProcessService processService;

    // 注入所需的核心服务
    @Inject
    public RobotTask(
            @ComponentImport CapabilityMatchingService capabilityMatchingService,
            @ComponentImport ProcessService processService
    ) {
        this.capabilityMatchingService = capabilityMatchingService;
        this.processService = processService;
    }

    @Override
    public TaskResult execute(TaskContext taskContext) throws Exception {
        // 替换成你在Bamboo后台定义的Robot Capability的key
        // 如果你是添加的"系统命令"类型Capability,key格式一般是system.builder.command.[你的命令名]
        String robotCapabilityKey = "system.builder.command.robot";

        // 获取当前执行环境的Capability集合
        CapabilitySet capabilitySet = taskContext.getBuildContext().getCapabilitySet();

        // 匹配目标Capability
        Capability robotCapability = capabilityMatchingService.findMatchingCapability(capabilitySet, robotCapabilityKey);
        if (robotCapability == null) {
            throw new IllegalStateException("未在当前Agent/Server上找到Robot可执行文件的Capability配置");
        }

        // 获取你需要的路径:/home/kshi/.local/bin/robot
        String robotExecutablePath = robotCapability.getValue();

        // 调用ProcessService执行外部进程
        File workingDir = taskContext.getWorkingDirectory();
        ExternalProcess process = processService.createExternalProcess(
                taskContext,
                new ExternalProcessBuilder()
                        .command(Arrays.asList(robotExecutablePath))
                        .workingDirectory(workingDir)
        );

        // 执行进程并处理结果(这里简化处理,实际要根据进程输出判断成功失败)
        process.execute();
        return TaskResultBuilder.newBuilder(taskContext).success().build();
    }
}

额外注意点

  • Capability Key的确认:在Bamboo后台查看你定义的Capability,复制它的Key(如果是自定义Capability,Key是你自己设置的;如果是系统命令,Key会自动生成)
  • 异常处理:一定要处理Capability找不到的情况,避免任务无提示失败
  • 权限验证:确保Bamboo运行用户对/home/kshi/.local/bin/robot有可执行权限,且路径能被Agent/Server访问到

内容的提问来源于stack exchange,提问作者ktime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:54