Bamboo插件开发:如何使用Executable及获取路径传入ProcessService
Bamboo插件开发:Capability可执行文件使用与路径获取问题
我来帮你解决这两个Bamboo插件开发的问题,都是插件里和外部进程、Capability相关的常见坑:
问题1:如何在Bamboo插件代码中使用定义为Capability的可执行文件
Bamboo里的Capability是绑定到Agent(或本地Server)的环境配置,要在插件代码里调用它,核心是借助CapabilityMatchingService来匹配并获取对应的可执行文件路径,步骤如下:
- 注入CapabilityMatchingService:作为Atlassian插件,通过Spring依赖注入获取这个服务(用
@ComponentImport标记,因为它是Bamboo核心服务) - 获取当前执行环境的CapabilitySet:从
TaskContext的BuildContext里拿到当前运行任务的Agent/Server的Capability集合 - 匹配目标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
相关产品推荐
相关产品推荐

